kvm虚拟化_KVM 虚拟化环境搭建 - WebVirtMgr

前文《KVM 虚拟化环境搭建 - ProxmoxVE》已经给大家介绍了开箱即用的 PVE 系统,PVE 是方便,但还是有几点问题:

第一:始终是商用软件,虽然可以免费用,但未来版本还免费么?商用的法律风险呢?

第二:黑箱化的系统,虽然基于 Debian ,但是深度改造,想搞点别的也不敢乱动。

第三:过分自动化,不能让我操作底层 libvirt/qemu 的各项细节配置。

PVE 是傻瓜相机,智能又复杂,对小白很友好;WebVirtMgr 是机械相机,简单而灵活。多一个选择始终是好事,何况我们说完 PVE 之后还介绍 WebVirtMgr,那肯定是有它不可代替的优势的。

不管你是在中小公司研究 IT 解决方案,还是搭建自己的 HomeLab,虚拟化是一个绕不过去的砍,现在的服务都不会直接启动在物理机上,成熟的架构基本都是:

物理机->虚拟化->容器

这样的三层架构,也就是说虚拟化是一切服务的基础。通过下面的步骤,让你拥有一套完全开源免费的,属于你自己的,没有任何版权和法律问题的虚拟化环境。

操作系统选择

发行版选择主要以 Debian/Ubuntu LTS Server 为主,二者我并无偏好,选择你趁手的即可。Debian 每两年一个大版本,Ubuntu LTS Server 也是每两年一个大版本。也就是说每年都有一个最新的,他们的支持周期都是五年以上,去年发布的 Debian 9 ,今年是 Ubuntu 18.04 LTS,明年又是 Debian 10。

安装依赖

新安装操作系统以后,先安装必备的包:

sudo apt-get install libvirt-daemon-system libvirt-clients
sudo apt-get install sasl2-bin libsasl2-modules bridge-utils

将 /etc/default/libvirtd 里面的一行 libvirtd_opts 改为:

libvirtd_opts

修改 /etc/libvirt/libvirtd.conf,保证下列配置生效:

# 允许tcp监听

修改 /etc/libvirt/qemu.conf,取消 "# vnc_listen = ..." 前面的 # 注释(如有),变为:

vnc_listen 

找到并把 user 和 group 两个选项,取消注释,改为 libvirt-qemu:

user 

重启并查看服务的状态:

sudo service libvirtd restart
sudo service libvirtd status

到了这一步,依赖就准备好了。

创建管理用户

ubuntu 18.04 LTS 得改一下:/etc/sasl2/libvirt.conf 文件,取消最后一行注释,变为:

sasldb_path: /etc/libvirt/passwd.db

并保证 mech_list 的值为 digest-md5 ,默认的 gssapi 不能用:

mech_list: digest-md5

(注意:如果是 Debian 10,那么单机请使用 unix socket,digest-md5 方式被废除掉了,下面的验证方式可以跳过直接把 www-data 用户加入 libvirt 用户组即可)。

客户端链接 libvirtd 需要用户名和密码,创建很简单:

sudo saslpasswd2 -a libvirt virtadmin

可以查看创建了哪些用户:

sudo sasldblistusers2 -f /etc/libvirt/passwd.db

继续重启服务:

sudo service libvirtd restart

测试用户权限:

virsh -c qemu+tcp://localhost/system list

使用 virsh 链接本地的 libvirtd 操作本地虚拟机,输入刚才的用户名和密码检查是否能够顺利执行,如果该命令成功则代表 libvirtd 的服务和权限工作正常。

配置网桥

Debian 9 下面是更改 /etc/network/interfaces,注意设备名称 eth0 需要改为实际的名称:

# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet staticaddress 192.168.0.2netmask 255.255.255.0network 192.168.0.0broadcast 192.168.0.255gateway 192.168.0.1dns-nameservers 192.168.0.1dns-search dell420bridge_ports eth0bridge_stp offbridge_fd 0bridge_maxwait 0

Ubuntu 18.04 中,使用 /etc/netplan 配置网桥,卸载 cloud-init,禁用 cloud-init 配置:

sudo apt-get remove cloud-init
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.disable

并且新建文件:/etc/netplan/10-libvirtd-bridge.yaml:

network

注意上面的设备名称 enp3s0f0 以及 ip 网关等配置应按实际情况更改。

注意接口名字和 ip等,改为对应的内容,改完后:

sudo netplan apply

启用新的网络配置,然后重启网络看看网桥,是否正常:

sudo brctl show

并且查看网络是否正常。

安装 WebVirtMgr

按照 WebVirtMgr 的官网首页的说明

安装依赖:

sudo apt-get install git python-pip python-libvirt python-libxml2 novnc supervisor nginx

克隆仓库:

cd /var/www
sudo git clone git://github.com/retspen/webvirtmgr.git

安装 Django 等 python 包:

cd webvirtmgr
sudo pip install -r requirements.txt
sudo ./manage.py syncdb
sudo ./manage.py collectstatic

按提示输入 root 用户密码,该用户后面将用来登陆 WebVirtMgr。

然后测试:

sudo ./manage.py runserver 0:8000

用浏览器打开 http://your-ip:8000 并用刚才的用户登陆看看行不行,成功的话,会看到:

d22d77f88f4f19537c38e95984a67587.png

然后点击右上角添加一个 connection,把 localhost 这个 libvirtd 的链接用 tcp 的方式添加进去,用户名和密码是刚才初始化的 libvirt 的管理员 admin 和密码:

a25cf78d5045471b88db497c2e649e56.png

链接如果能够正常添加的话,表明可以正常运行了:

234335fd8a8a995c2272ad28bedbed71.png

然后 CTRL+C 退出。

安装 Nginx

新建并编辑 /etc/nginx/sites-available/webvirtmgr 文件:

server 

然后做一个该文件的软连接到 /etc/nginx/sites-enabled 下面,并删除默认软连接:

cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/webvirtmgr .
sudo rm default

然后重启服务

sudo service nginx restart

完成安装

新建并编辑 /etc/supervisor/conf.d/webvirtmgr.conf:

[program:webvirtmgr]

把整个 webvirtmgr 的项目文件所有者改为 www-data:

sudo chown -R www-data:www-data /var/www/webvirtmgr

重启并查看结果:

sudo supervisorctl reload
sudo supervisorctl status

如果碰到错误,比如 Exited too quickly 那么到 /var/log/supervisor 下面查看日志。

完成后,浏览器打开:http://your-ip:8080/servers/

如果一切工作正常,那么恭喜你,WebVirtMgr 安装成功。

开始使用

在 /home/data 下面创建 kvm 目录,用于放虚拟机磁盘镜像文件和 iso 文件

{images, iso

你可以放在你喜欢的地方,/home 目录一般在 debian 下面会分配比较大的空间,所以把虚拟机相关的东西,放到 /home/data/kvm 下面。

然后浏览器登陆 webvirtmgr 的页面,选择刚才添加的 localhost 链接,webvirtmgr 可以同时管理多台机器的 libvirtd,这里我们以刚才添加的 localhost 链接为例。

首先到左侧的 “存储池”添加用于保存虚拟机映像的路径:

7bf06b8ece85641f161dc1015529f2b3.png

先点击 "New Storage" 添加一个类型为 “目录卷类型”的存储池,名字为 images,指向:

/home/data/kvm/images

继续点“New Storage”添加一个类型为 “ISO 镜像卷”的存储池,名字为 iso ,路径为:

/home/data/kvm/iso

你如果有多块硬盘,还可以继续添加一些其他位置用于保存虚拟机的磁盘镜像。

还差网络配置就妥了,点击左边 “网络池”:

bd81d8b5033fd12a3bfd4f00afd83a08.png

原来只有一个 default 的 NAT 类型网络,那个 bridge 是我们需要点击 "New Network" 添加的桥接网络:

ea400dd0d91b83e10bfc54f3138fdbc5.png

上面这个桥接名称,就是我们前面配置的网桥名称 br0。我们启动的虚拟机一般都会希望和物理机同处于一个内网下,拥有可以直接访问的 IP,因此基本都用桥接模式。

创建虚拟机

先创建磁盘映像,到左边的 “存储池”,然后选择 images 存储池:

edbb38d6e78f655ecf32aea63b2bcd06.png

点击最下面的添加镜像,添加一个 20G 的 qcow2,名字为 test1:

8a6cc5009758a26d45a2c6a3607e931f.png

然后点击左边的 “虚机实例”,然后点击左上角的 “New Instance”:

4cb9bb9871b9debf498e905d0d618fb8.png

不要使用它那些乱七八糟的模板,直接点击正上方的 “Custom Instance”,创建虚拟机:

4f48c88265cddcf3ba363a50562dd04b.png

在创建虚拟机的对话框里,点击“Add Image”添加刚才创建的 test1.img 镜像,然后再 "Add network" 添加类型为 bridge 的桥接网络,你如果想要所有虚拟机都处于一个虚拟内网的话,还可以再添加一块类型为 default 的网卡,就是默认的 NAT 类型。

完成后点 “创建”,咱们的虚拟机就有了:

f394563718a4be436ad7ae0e3261a79a.png

这时候,可以到现前的 “存储池”的 iso 下面,上传两个操作系统的安装盘 iso 文件,然后回来这个 test1 虚拟机主页,选择设置,挂载 iso 文件:

f922105640c0ef18b8a4166501df6e8e.png

选择我们刚才上传的操作系统 ISO 文件,并点击右边的“链接”按钮,然后可以到“Power”那里使用 “启动”按钮开机了,此时虚拟机出于“开机”状态:

e15c03bfc87e1722adf234083b009791.png

然后选择 Access :

b1c7f06564fe2b5114e04bd6e1b69c96.png

点击 “控制台”,打开虚拟机的 webvnc 终端,开始安装操作系统:

9957bfa60a833b934bc11547724b6f11.png

网页版本的 Webvnc 图形性能一般,建议安装操作系统都用普通文本模式安装(可以选择的话),测试虚拟机可以正常启动以后,我们先把它强制结束了,进行一些必要设置。

安全设置

如果的服务器暴露再公网上,一定要到 Access -> Console Password 下面设置个密码:

0e7b6b0220691c9f678590b2e44a75c2.png

webvirtmgr 里点击控制台它会自动读取该密码,不需要你手工输入,但是这样就比没有密码安全很多了。

然后启动后,你可以到:设置->XML 那里查看一下 VNC 被分配的端口号和设置过的密码:

69870bd5a70f40e5fbfe9b49a1fe1f77.png

由于默认配置 VNC 都是使用 “自动端口”,这样更安全些,每次虚拟机启动,都会动态分配一个,再 XML 这里可以查看得到,这样你也可以不用 webvnc,而用自己的 VNC 客户端:

比如 Windows 下的 vnc-viewer,填入 ip 地址和端口号,然后点 "connect":

a1f4381e9754df61667b4345e80f33f7.png

提示输入密码,将上面 XML 里的密码复制粘贴过来即可:

d7991dd5ed7205d02954fdcf107621dd.png

然后点击 OK 开始显示终端屏幕:

1a191decb64348745d48725a47e4db17.png

共享文件夹

这是个很基本的需求,想省事的话,nfs 共享一下也可以,但是 KVM 本身支持 Hypervisor 和虚拟机共享文件夹的,并且性能很好,可惜 PVE 里居然做不了,因为它不能改 XML。

再 “设置”-> XML 那里点击 “编辑”并在 <devices>... </devices> 中加入下面配置:

<filesystem 

accessmode 可以设置成:mapped,passthrough 或 none。物理机准备一下共享目录:

sudo mkdir /home/data/kvm/kfs
sudo chown libvirt-qemu:libvirt-qemu /home/data/kvm/kfs

所有虚拟机在物理机上都会以 libvirt-qemu 这个用户来跑(前面设置过 qemu.conf),所以需要保证你物理机上需要共享的路径的权限。同时 accessmode 建议设置成 mapped,这样会用文件信息里的 meta info 来保存虚拟机中的文件权限信息。

虚拟机中编辑 /etc/modules 文件,添加下面几行:

loop
virtio
9p
9pnet
9pnet_virtio

加载内核模块:

sudo service kmod start

然后测试 mount:

trans

这样,虚拟机中的 /mnt/kfs 就映射到了物理机的 /home/data/kvm/kfs 路径下。

测试成功的话,设置 /etc/fstab:

kfs             /mnt/kfs        9p      trans=virtio    0       0

修改完后,mount -a 测试,测试通过重启虚拟机即可。

后记

可能大家发现了 WebVirtMgr 本质就是一个轻量级的 web 管理后台,可以在一台机器上搭建 webvirtmgr 并管理内网所有的提供 libvirtd 服务的机器。

由于 webvirtmgr 项目本身简单清晰,不少成功项目的代码都是源自它的,比如 QNAP 产品线里的 “虚拟机工作站”,通过前面一番动手,相信你对 kvm/libvirtd/vnc 之类的运作机里已经很熟悉了。

该系统设计的比较好的一个点就是允许我编辑 XML,而前面提到的 PVE 居然不允许我在页面上修改 XML,KVM支持的功能非常丰富,很多都需要通过修改 XML 完成,比如常用的硬件透传,大家可以搜索 "kvm passthrough":该功能可以把 pcie 总线上的设备传递给虚拟机,比如你的物理机上有两个 USB 插口,你可以将其中一个赋予虚拟机。或者把物理机的磁盘阵列全部传递给虚拟机,由虚拟机里面来组 raid,这样虚拟机里面装点黑群晖或者 clearos / openmediavault 之类的 nas 系统的话,可以方便的把磁盘阵列管理起来。

如果物理机有显卡的话,你甚至可以把物理机的 gpu 透传给虚拟机,这样虚拟机里面就可以跑需要 GPU 支持的任务了,比如挖矿之类,这些在 PVE 里都没法支持,这些都是 webvirtmgr 比 PVE 更灵活的地方。

更多的功能,留给大家慢慢探索吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 分布式版本控制工具02:Git代码托管服务列表与使用

1常用的Git代码托管服务 Git中存在两种类型的仓库&#xff0c;即本地仓库和远程仓库。 Git远程仓库中比较常用的有GitHub、码云、GitLab等。 名称网址说明gitHubGitHub: Where the world builds software GitHub一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持…

基于Springboot外卖系统19:用户地址+默认收货地址

1. 用户地址簿功能 1.1 需求分析 地址簿&#xff0c;指的是移动端消费者用户的地址信息&#xff0c;用户登录成功后可以维护自己的地址信息。 同一个用户可以有多个地址信息&#xff0c;但是只能有一个默认地址。 对于地址簿管理&#xff0c;我们需要实现以下几个功能&#…

基于Springboot外卖系统20:前端菜品展示+菜品数量查询

1 菜品展示 1.1 需求分析 用户登录成功后跳转到系统首页&#xff0c;在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息&#xff0c;需要展示 按钮&#xff0c;否则显示按钮。 1.2 前端页面分析 在开发代码之前&#xff0c;需要梳理一下前端页面和服务端的交互过…

flash动画设计期末作业_「2019年下学期」第二十五二十六节:期末作品三-吉祥物设计...

初心伟大的艺术品不必追随潮流&#xff0c;他本身就能引领潮流。课前准备软件安装【2019(上)】《三维建模与动画设计》【2019年下学期】第一节&#xff1a;选修介绍及选修人数确定【2019年下学期】第二节&#xff1a;2D&3D设计之百事可乐图标设计【2019年下学期】第三四节&…

YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

来源&#xff1a;https://arxiv.org/abs/2207.02696 代码&#xff1a;https://github.com/WongKinYiu/yolov7 0. Abstract YOLOv7 surpasses all known object detectors in both speed and accuracy in the range from 5 FPS to 160 FPS and has the highest accuracy 56.8…

如何把一个网页生成一个快捷方式在桌面?_如何打造一个简洁、高效的桌面?

都2020年了&#xff0c;你的桌面仍是这样的&#xff1f; 或是这样的&#xff1f; 但当然你也见过这样的&#xff1a; 你当然会好奇&#xff0c;没有各种快捷方式、任何文件或文件夹的工作桌面&#xff0c;使用起来岂不效率低下&#xff1f;然则非也。我认为高效的工作得从舒服的…

Android ADB 源码分析(三)

前言 之前分析的两篇文章 Android Adb 源码分析(一) 嵌入式Linux&#xff1a;Android root破解原理&#xff08;二&#xff09; 写完之后&#xff0c;都没有写到相关的实现代码&#xff0c;这篇文章写下ADB的通信流程的一些细节 看这篇文章之前&#xff0c;请先阅读 Linux…

A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi

A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstruction and Recognition 中文名&#xff1a;基于生成对抗网络的深度低质量缺陷图像的学习方法重建与认可 主体思路概述&#xff1a;将模糊的图像使用Gan进行生成与重建&…

bootstrap3 表单构建器_FastReport.NET报表设计器连接到OracleDB关系数据库

首先&#xff0c;您可以使用ODBC连接器。但是它充满了很多设置。FastReport.NET报表设计器连接到OracleDB关系数据库如您所见&#xff0c;您需要创建数据源及其连接字符串。动作比较多。此方法的替代方法是使用FastReport中的连接器。实际上&#xff0c;有两个连接器可供选择。…

码农,选好你的老板

[01 两个小故事] 小明2009年毕业 那一年刚好是金融危机之后&#xff0c;全球经济还不是很好&#xff0c;找到一份好的工作非常困难。 好在&#xff0c;小明误打误撞面试上华为一份码农的工作。 刚开始那几年&#xff0c;小明很拼命&#xff0c;不断的在解bug和制造bug中自由…

Automated defect inspection system for metal surfaces based on deep learning and data augmentation

Automated defect inspection system for metal surfaces based on deep learning and data augmentation 基于深度学习和数据增强的金属表面缺陷自动检测系统 简述&#xff1a;卷积变分自动编码器(CVAE)生成特定的图像&#xff0c;再使用基于深度CNN的缺陷分类算法进行分类。在…

python第七章_python 第七章 模块

模块 一个py文件就是一个模块 模块一共三种&#xff1a;1.python标准库 2.第三方模块 3.应用程序自定义模块 import&#xff1a;1.执行对应文件 2.引入变量名 if__name__"__main__": #1.用于被调用文件测试 2.防止主程序被调用 time模块 常用命令 时间模块 1 importt…

openwrt 音频开发

1、Linux 音频架构图 音视频的好坏 直接影响 产品体验 2、音频架构图层次说明 openWRT 采用 ALSA 层次图,如下 Application: 上层应用 主要调用alsa-lib 中的接口 实现业务逻辑。使用alsa-util中aplay,arecord,amixer,speaker-test进行相关测试。HAL层 : 移植alsa-lib 和 a…

Automatic Detection of Welding Defects Using Faster R-CNN

Automatic Detection of Welding Defects Using Faster R-CNN 基于快速R-CNN的焊接缺陷自动检测 简介&#xff1a;使用Inception-ResNet模型进行缺陷检测 数据集&#xff1a;射线图像 Abstract Experts are required to properly detect the test results and it takes a lot…

让Android Studio支持系统签名(证书)

有时候&#xff0c;我们开发的apk需要用到系统权限&#xff0c;需要在AndroidManifest.xml中添加共享系统进程属性&#xff1a; android:sharedUserId"android.uid.system" android:sharedUserId"android.uid.shared" android:sharedUserId"android…

eslint 保存自动格式化_代码规范之理解ESLint、Prettier、EditorConfig

授权转载自&#xff1a;nowThenhttps://juejin.cn/post/6895889063111294990前言团队多人协同开发项目中困恼团队管理一个很大的问题是&#xff1a;无可避免地会出现每个开发者编码习惯不同、代码风格迥异&#xff0c;为了代码高可用、可维护性&#xff0c; 如何从项目管理上尽…

Deep learning based multi-scale channel compression feature surface defect detection system

基于深度学习的多尺度通道压缩特征表面缺陷检测系统 Deep learning based multi-scale channel compression feature surface defect detection system 简述&#xff1a;首先应用背景分割和模板匹配技术来定义覆盖目标工件的ROI区域。提取的感兴趣区域被均匀地裁剪成若干个图像…

前端MVC框架之 Angular

一、什么是Angular jQuery&#xff0c;它属于一种类库(一系列函数的集合)&#xff0c;以DOM为驱动核心&#xff1b;而Angular是一种 MVC 的前端框架&#xff0c;则是前端框架&#xff0c;以数据和逻辑为驱动核心&#xff0c;它有着诸多特性&#xff0c;最重要的是&#xff1a;模…

C语言关键字(三)

之前的两篇文章 嵌入式Linux&#xff1a;c语言深度解剖&#xff08;数据类型关键字&#xff09;​zhuanlan.zhihu.com 嵌入式Linux&#xff1a;c语言深度解剖&#xff08;入门篇&#xff09;​zhuanlan.zhihu.com 这篇文件继续讲解C语言关键字 想问大家一个问题&#xff0c…