高可用集群(HAC)
1、高可用集群+keepalive说明
高可用定义:
- 目的:尽可能的提高服务的可用性
- 99%、99.9%、99.99%、99.999%
- 实现原理:心跳检测
- 服务:
- 有状态:
- MySQL
- 无状态:
- apache
- LVS
- 有状态:
Keepalive原理
- 案例环境专为 LVS和HA计一健康查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
- 官方网站:http://www.keepalived.org/
Keepalive的热备方式
- VRRP(Virtual Router Redundancy Protocol:虚拟路由冗余协议)
- 一主+多备:共用同一个IP地址,但是优先级不同
同一个网段才会进行IP的争夺;
- 一个组里面各台主机会进行IP地址的漂移
2、LVS-DR+keepalive实验
首先搭建一个LVS-DR模式的均衡负载集群
规划:
- LVS-负载调度器:
- 192.168.75.10–LVS-master
- LVS负载调度器都配置LVS-DR模式
- 关闭广播功能;重定向功能
- 关闭网卡守护进程NetworManager
- 添加一个子网卡:eth0:0
- 192.168.75.100(地址漂移使用的)
- 然后拉起来ifup,ifdown eth0:0
- 添加一个集群
- 然后直接添加子节点
- 安装keepalive
- 安装gcc环境
- 准备keepalive源码包–>源码编译安装
- 安装完成后修改配置文件:并不是所有的都要使用,
- LVS负载调度器都配置LVS-DR模式
- 192.168.75.11–LVS-slave
- 关闭网卡守护进程NetworManager
- 配置好集群IP–eth0:0–>这里也是配置100;
- 问题是:同一个局域网里面两个100的ip是不行的
- 因此注释掉本机的一个文件/etc/sysconfig/networ-scripts/ifup-eth–>大概是注释257行
- 192.168.75.10–LVS-master
- 后端服务器:
- 192.168.75.12/13
- 安装httpd服务–>开启并且永久开启
- 编写一个网站
- 然后自己测试一下;
- 添加一个100的接口–>lo:0
- 子网掩码是4个255
- 然后修改一下内核参数
- sysctl -p
- 添加路由记录
- 客户端:
- 网页访问
- 尝试关闭LVS-master
- 然后关闭httpd第一台
- 网页访问
LVS-master负载调度器配置如下
- 先搭建一个LVS-DR
#关闭网卡守护进程-->关闭NetworkManager
[root@node0 ~]# service NetworkManager stop
[root@node0 ~]# chkconfig NetworkManager off#创建一个eth0:0用来充当集群入口接口
[root@node0 ~]# cd /etc/sysconfig/network-scripts/
[root@node0 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0#修改配置文件-->添加一个ip-->100
[root@node0 network-scripts]# vim ifcfg-eth0:0
DEVICE=eth0:0 #这里需要修改网卡名
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.75.100 #然后修改IP-->一个虚拟的IP
NETMASK=255.255.255.0#然后关闭网卡的重定向功能
[root@node0 ~]# vim /etc/sysctl.conf #在末行添加如下内容
#关闭网卡重定向功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0#然后刷新配置
[root@node0 ~]# sysctl -p#到这里可以拉起eth0:0的网卡
[root@node0 ~]# ifup eth0:0#在验证一眼是否拉起来了
[root@node0 ~]# ifconfig eth0:0#加载一下ip_vs模块
[root@node0 ~]# modprobe ip_vs#安装一下lvsadm
[root@node0 ~]# yum -y install ipvsadm#添加一下集群-->12/13是后端服务器
-->-A是添加一个集群
-->-t是指定一个虚拟ip以及端口
-->-s:指定轮询模式为rr
[root@node0 ~]# ipvsadm -A -t 192.168.75.100:80 -s rr#添加集群子节点-->添加的机器是12/13
-->-a:添加子节点
-->-r:指定子节点的真实ip以及端口
-->-g:指定了是DR模式
[root@node0 ~]# ipvsadm -a -t 192.168.75.100:80 -r 192.168.75.12:80 -g
[root@node0 ~]# ipvsadm -a -t 192.168.75.100:80 -r 192.168.75.13:80 -g#最后查看一下集群信息
[root@node0 ~]# ipvsadm -Ln
[root@node0 ~]# ipvsadm -Ln --stats#把这个集群写入配置文件
[root@node0 ~]# service ipvsadm save
配置两台后端服务器
- 安装httpd
- 以及编写各自的发布页面
- 修改内核参数
- 关闭ARP功能
- 给与一个虚拟IP;
- 并且指定一下路由
#两台后端的服务器都是一样的配置,唯一不一样的就是发布的页面不同#关闭一下NetworkManager
[root@node2 ~]# service NetworkManager stop
[root@node2 ~]# chkconfig NetworkManager off#准备一个回环口-->lo:0
[root@node2 ~]# cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]# cp -a ifcfg-lo ifcfg-lo:0#然后配置一个虚拟ip
[root@node2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.75.100
NETMASK=255.255.255.255
........
#调整内核参数-->关闭ARP功能
[root@node2 ~]# vim /etc/sysctl.conf
.........
#关闭ARP功能
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2_
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 3
#重新拉取一下配置
[root@node2 ~]# sysctl -p#到这里为止-->可以拉起来lo:0的网卡了
[root@node2 ~]# ifup lo:0#添加一个路由-->#如果有人来访问这个ip就把它丢给lo:0网卡
[root@node2 ~]# route add -host 192.168.75.100 dev lo:0#然后配置开机自启
[root@node2 ~]# echo "route add -host 192.168.75.100 dev lo:0" >> /etc/rc.local #安装apache
[root@node2 ~]# yum -y install httpd#修改发布页面
[root@node2 ~]# vim /var/www/html/index.html
aaaaaaaaaaaaaaaaaaaaaaaa#启动服务-->并且设置开机自启
[root@node2 ~]# service httpd start
[root@node2 ~]# chkconfig httpd on#自己测试一下
[root@node2 ~]# curl localhost
aaaaaaaaaaaaaaaaaaaaaaaa
然后简单地从浏览器上面验证一下LVS-DR
http://192.168.75.100/
- 看到了aaaa和bbb轮询就代表LVS-DR搭建完成
接下来回到LVS-master服务器上面操作
- 就是node0–>ip:10的服务器上面操作
- 安装keepalive
- 并且配置
#首先安装一下必要的依赖
[root@node0 ~]# yum -y install kernel-devel openssl-devel gcc*#准备好keepalive的源码包
[root@node0 ~]# ls keepalived-1.2.13.tar.gz
keepalived-1.2.13.tar.gz#解压源码包
[root@node0 ~]# tar -xf keepalived-1.2.13.tar.gz
[root@node0 ~]# ls#预编译、编译、安装
[root@node0 ~]# cd keepalived-1.2.13
[root@node0 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalive/ --with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64/ && make && make install#修改配置文件-->调整好参数#操作前切勿忘记备份
[root@node0 ~]# cp -a /usr/local/keepalive/etc/keepalived/keepalived.conf{,.bak}
[root@node0 ~]# vim /usr/local/keepalive/etc/keepalived/keepalived.conf#配置文件里面有些是不需要的,需要删除;有些是需要添加的,以下是配置文件的解析;#全局配置只留下一个主机名
global_defs {router_id server1 #命名主机名
}#定义一个示例-->这里可以选择默认
vrrp_instance VI_1 {state MASTER #设置服务类型主/从(MASTER/SLAVE)interface eth0 #指定那块网卡用来监听virtual_router_id 51 #设组号, 如果是一组就是相同的ID 号,一个主里面只能有一个主服务器和多个从服务器priority 100 #服务器优先级, 主服务器优先级高advert_int 1 #心跳时间, 检测对方存活authentication { #存活验证密码auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.75.100 #定义一个集群的地址}
virtual_server 192.168.75.100 80 { #设置集群地址 以及端口号delay_loop 6 #健康检查间隔lb_algo rr #使用轮询调度算法lb_kind DR #DR模式的群集protocol TCP #使用的协议real_server 192.168.75.12 80 { #管理的网站节点以及使用端口weight 1 #权重,优先级 在原文件基础上删除修改TCP_CHECK { #状态检查方式connet_port 80 #检查的目标端口connet_timeout 3 #连接超时《秒)nb_get_retry 3 #重试次数delay_before_retry 4 #重试间隔《秒)}}real_server 192.168.75.13 80 { #管理的第二个网站节点以及使用端口weight 1 #权重, 优先级 在原文件基础上删除修改TCP_CHECK { #状态检查方式connet_port 80 #检查的目标端口connet_timeout 3 #连接超时《秒)nb_get_retry 3 #重试次数delay_before_retry 4 #重试间隔《秒)}}
}
#然后把多余的配置文件内容都删除-->然后保存退出#然后启动keepalive
[root@node0 ~]# /usr/local/keepalive/sbin/keepalived
[root@node0 ~]# ps -ef | grep keep
.........#看到了keepalive就证明启动成功了;
接下来就配置LVS-slave服务器
-
IP:192.168.75.11
-
安装keepalive服务–>并且配置好
-
一样要配置ipvsadm
#关闭NetworkManager
[root@node1 ~]# service NetworkManager stop
[root@node1 ~]# chkconfig NetworkManager off#安装一下keepalive的依赖
[root@node1 ~]# yum -y install kernel-devel openssl-devel popt-devel gcc*
.........#准备好源码包
[root@node1 ~]# ls keepalived-1.2.13.tar.gz
keepalived-1.2.13.tar.gz#预编译、编译、安装keepalive
[root@node1 ~]# tar -xf keepalived-1.2.13.tar.gz
[root@node1 ~]# cd keepalived-1.2.13
[root@node1 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalive/ --with-kernel-dir=/usr/src/kernels/2.6.32-358.el6.x86_64/ && make && make install#准备好配置文件-->之前master做的配置可以给到slave使用#做好备份-->养成良好习惯
[root@node1 ~]# cp -a /usr/local/keepalive/etc/keepalived/keepalived.conf{,.bak}#这一条命令在LVS-master上面执行-->简单理解就是传个已经修改过的文件给到slave
[root@node0 ~]# scp /usr/local/keepalive/etc/keepalived/keepalived.conf root@192.168.75.11:/usr/local/keepalive/etc/keepalived/#修改配置文件
[root@node1 ~]# vim /usr/local/keepalive/etc/keepalived/keepalived.conf#因为之前在master上面已经修改过-->因此只需要修改几个地方就ok
..........8 state SLAVE #改为从服务器11 priority 50 #优先级改为50-->就可以保存退出了#配置虚拟网卡
[root@node1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0[root@node1 network-scripts]# vim ifcfg-eth0:0
DEVICE=eth0:0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.75.100
NETMASK=255.255.255.0#这里注意不要急着启动网卡-->因为相同网段会产生IP冲突#因此要注释掉配置文件的内容-->大概在243行左右-->把这个注释掉就不会报错
[root@node1 network-scripts]# vim ifup-eth
.......
243 # if ! /sbin/arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${ipaddr[$idx]} ; then
244 # net_log $"Error, some other host already uses address ${ipaddr[$idx]}."
245 # exit 1
246 # fi#然后修改一下内核参数# 修改内核参数。 防止相同网络地址广播冲突,如果有多快网卡需要设置多行
[root@node1 ~]# vim /etc/sysctl.conf #在末行添加一下几行
#关闭网卡重定向功能
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0#刷新内核参数
root@node1 ~]# sysctl -p#到这里就可以启动网卡eth0:0网卡了
[root@node1 ~]# ifup eth0:0
[root@node1 ~]# ifconfig eth0:0#然后配置ipvsadm
[root@node1 ~]# yum -y install ipvsadm#查看一下是否加载IP_VS
[root@node1 ~]# modprobe ip_vs#查看一下版本
[root@node1 ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn#添加集群以及集群节点
[root@node1 ~]# ipvsadm -A -t 192.168.75.100:80 -s rr
[root@node1 ~]# ipvsadm -a -t 192.168.75.100:80 -r 192.168.75.12 -g
[root@node1 ~]# ipvsadm -a -t 192.168.75.100:80 -r 192.168.75.13 -g#启动ipvs并且顺势启动keepalive
[root@node1 ~]# service ipvsadm start
[root@node1 ~]# /usr/local/keepalive/sbin/keepalived
浏览器继续验证
- 现在是LVS的主从都已经启动了;
- 浏览器访问:http://192.168.75.100/—>正常
然后现在关闭LVS-master–>直接让他断网
- 验证一下LVS-slave是否能够接盘
- 浏览器访问:http://192.168.75.100/—>正常
#去到LVS-slave查看流量
[root@node1 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes-> RemoteAddress:Port
TCP 192.168.75.100:80 37 185 0 25524 0-> 192.168.75.12:80 18 90 0 12391 0-> 192.168.75.13:80 19 95 0 13133 0
然后再关闭一台后端服务器
- 浏览器访问:http://192.168.75.100/—>发现少了aaaa的那台主机
相关文章:
高可用集群(HAC)
1、高可用集群keepalive说明 高可用定义: 目的:尽可能的提高服务的可用性 99%、99.9%、99.99%、99.999% 实现原理:心跳检测服务: 有状态: MySQL 无状态: apacheLVS Keepalive原理 案例环境专为 LVS和…...

python基于django微信小程序的适老化老人健康预警小程序
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…...

基于微信小程序图书馆管理系统
开发工具:IDEA、微信小程序服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7前端技术:vue、uniapp服务端技术:springbootmybatis-plus本系统分微信小程序和管理后台两部分,项…...

将镭神C32激光雷达的PointXYZ数据转化为PointXYZIR格式 - 附代码
之前遇到过“镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for field “intensity“ 问题”, 当时确定了是镭神C32雷达缺少相应字段,并记录博客【学习记录】镭神32线激光雷达ROS下运行fromRosMsg()报错 Failed to find match for fi…...

高级前端一面面试题集锦
详细说明 Event loop 众所周知 JS 是门非阻塞单线程语言,因为在最初 JS 就是为了和浏览器交互而诞生的。如果 JS 是门多线程的语言话,我们在多个线程中处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程中删除节点&#…...

Java基础 -- List集合
Java基础 -- List集合1. Introduction1.1 好处1.2 常用泛型2. 交集,差集等2.1 自身的方法2.2 1.8jdk stream 新特性2.3 Apache的CollectionUtils工具类(推荐)3. 限定泛型范围4. Awakening1. Introduction 1.1 好处 代码复用,多种…...

【Linux】网络编程 - Socket套接字/基于UDP的网络通信
目录 一.套接字 1.什么是套接字/Socket套接字 2.套接字的分类 3.Socket套接字的常见API 二.网络字节序 1.什么是网络字节序 2.网络字节序和主机字节序的转换接口 三.IP地址形式上的转换 四.客户端的套接字不由程序员bind 1.为什么客户端套接字不能由程序员bind 2.OS…...

流程引擎之Camunda简介
背景Camunda 是支持 BPMN(工作流和流程自动化)、CMMN(案例管理) 和 DMN(业务决策管理) java 框架。Camunda 基于Activiti5 保留了 PVM,其开发团队也是从 activiti 中分裂出来的。Camunda 来自拉…...

Mybatis笔记整理
1. 相关文档地址 中文文档 https://mybatis.org/mybatis-3/zh/index.htmlMybatis可以配置成适应多种环境,不过每个SqlSessionFactory实例只能选择一种环境。Mybatis默认事务管理器是JDBC,连接池:POOLEDMaven仓库:下载地址<dependency>…...

【react全家桶】面向组件编程
文章目录02 【面向组件编程】1.组件的使用1.1 函数式组件1.2 类式组件1.3 组合组件1.4 提取组件组件实例的三大属性 state props refs2.state2.1 基本使用2.2 setState()2.3 简化版本2.4 State 的更新可能是异步的2.5 异步更新解决方案2.6 数据是向下流动的3.props3.1 基本使用…...

Django框架之模型视图-使用 PostMan 对请求进行测试
使用 PostMan 对请求进行测试 PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件,可以直接去对我们写出来的路由和视图函数进行调试,作为后端程序员是必须要知道的一个工具。 安装方式1:去 Chrome 商店直接搜索 PostMan…...

(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:流量控制概述二:流量控制举例三:拓展阅读(可不看)(1)TCP流量控制完整例子&a…...

使用Docker-Compose搭建Redis集群
1. 集群配置3主3从由于仅用于测试,故我这里只用1台服务器进行模拟redis列表2.编写redis.conf在server上创建一个目录用于存放redis集群部署文件。这里我放的路径为/root/redis-cluster 在/opt/docker/redis-cluster目录下创建redis-1,redis-2,redis-3,redis-4,redis…...
华为OD机试 -计算网络信号(Js)
计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物 array[m][n] 的二维数组代表网格地图,array[i][j] = 0代表 i 行 j 列是空旷位置;array[i][j] = x(x 为正整数)代表 i 行 …...

【数据结构】————栈
文章目录前言栈是什么,栈的特点实现栈的基本操作栈的相关操作声明1.创建栈2.对栈进行初始化3.销毁栈4.判断栈是否为空5.压栈操作6.删除栈顶元素7.取出栈顶元素8.计算栈内存放多少个数据总结前言 本文主要讲述特殊的线性表——栈: 栈是什么,栈…...

从零编写linux0.11 - 第十一章 可执行文件
从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…...
Win10上通过nginx代理配置远程非445端口SMB
引言 家里架了一个SMB文件服务器,想要远程访问,开了445端口,但仅限某些特殊网络可以远程访问,其他网络全部拒绝445端口,因此网上找了很多将Win10的SMB指向别的端口的教程,但所有教程均使用环回网卡解决&am…...

Allegro如何快速清除多余的规则设置操作指导
Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…...
ROS2 入门应用 引用自定义消息(Python)
ROS2 入门应用 引用自定义消息(Python)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_interfaces/…...

SmS-Activate一款好用的短信验证码接收工具
前言 有些国外应用在使用应用上的功能时需要注册账号,由于某种不可抗因素,我们的手机号一般不支持注册,接收不到信息验证码,于是我们可以使用SmS-Activate提供的服务,使用$实现我们的需求(大概一次验证1-5…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

新版NANO下载烧录过程
一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…...