k8s搭建双主的mysql8集群---无坑
《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从,我们能理解到主节点只有1个,那么承担增删改主要还是主节点,如果你在从节点上去操作增删改操作,数据不会同步到其他节点。本章我们将实现多主(双主)集群。实现在多个节点上操作增删改,能同步其他节点。
一,环境准备
1.1 k8s集群服务器
| ip | 角色 | 系统 | 主机名 | cpu | mem |
| 192.168.40.129 | master | centos7.9 | k8smaster | 4 | 8 |
| 192.168.40.130 | node1 | centos7.9 | k8snode1 | 4 | 8 |
| 192.168.40.131 | node2 | centos7.9 | k8snode2 | 4 | 8 |
| 192.168.40.132 | node3 | centos7.9 | k8snode3 | 4 | 8 |
k8s集群操作请参考《K8s安装部署(v1.28)--超详细(cri-docker作为运行时)-CSDN博客》
1.2 nfs服务器器
| ip | 角色 | 系统 | 主机名 | cpu | mem | 用图 |
| 192.168.40.129 | master | centos7.9 | k8smaster | 4 | 8 | k8s主服务器 兼 nfs服务器 |
| 192.168.40.130 | node1 | centos7.9 | k8snode1 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
| 192.168.40.131 | node2 | centos7.9 | k8snode2 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
| 192.168.40.132 | node3 | centos7.9 | k8snode3 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
二,安装nfs服务
2.1 安装(所有节点)
因为需要在三个工作节点上连接nfs,所以工作节点上也要安装
yum install -y nfs-utils
2.2 暴露nfs目录(只暴露nfs主服务器)
要安装四台服务器。
直接在nfs服务器(k8s-master:192.168.40.129)当中创建这三个目录并写入 /etc/exports 文件夹中(创建的目录可以修改):
#创建nfs目录
mkdir -p /data/nfs/{mysql-master-01,mysql-master-02}
vi /etc/exports
#添加
/data/nfs/mysql-master-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-master-02 *(rw,sync,no_root_squash)
如果目录不为空,需要清空
rm -rf /data/nfs/mysql-master-01/*
rm -rf /data/nfs/mysql-master-02/*
2.3 开启nfs服务器
直接在主服务器(192.168.40.129)上启动nfs服务器。
systemctl enable --now nfs-server
2.4 测试nfs服务
我们可以通过这行命令来检查目录是否暴露成功: 注意修改为自己的nfs服务器地址
showmount -e 192.168.40.129
三,搭建MySql集群
3.1 创建命名空间
创建一个命名空间来部署MySQL集群,当然你也可以使用默认的Default命名空间。这里就用 mysql-cluster 命名空间来搭建集群了,首先我们将这个命名空间创建出来:
创建yaml
kubectl create namespace mysql-cluster --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: nullname: mysql-cluster
spec: {}
status: {}
将上面内容 保存到mysql-ns.yaml中
执行命令
kubectl apply -f mysql-ns.yaml
查看名称空间
kubectl get ns

3.2 创建MySQL密码的Secret
创建一个存储了MySQL密码的Secret,直接使用这行命令生成这个Secret的资源清单文件:
注意修改root的密码和命名空间,我的root密码设置为的是123456
kubectl create secret generic mysql-password --namespace=mysql-cluster --from-literal=mysql_root_password=123456 --dry-run=client -o=yaml
apiVersion: v1
data:mysql_root_password: MTIzNDU2
kind: Secret
metadata:creationTimestamp: nullname: mysql-passwordnamespace: mysql-cluster
将上述yaml内容保存到 mysql-secret.yaml
kubectl apply -f mysql-secret.yaml
查看创建的密码
kubectl get secret -n mysql-cluster

3.3 编写MySQL双主节点yaml
3.3.1 主节点1
mysql-master-1.yaml 内容如下
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-01-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.40.129path: /data/nfs/mysql-master-01storageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-01-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-01-nfs-pv---
apiVersion: v1
kind: Service
metadata:name: mysql-master-svc-01namespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 3306selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP---
apiVersion: v1
data:my.cnf: |[mysqld]server-id = 1# 开启gtidgtid_mode = ONenforce_gtid_consistency = 1# 设置自增ID初始值为2,每次自增量为2。即都是偶数2,4,6,8,...auto_increment_offset = 2auto_increment_increment = 2# 开启bin_log(默认是开启的,直接使用默认),模式为ROW,允许最大日志为1G#log_bin = mysql-bin#binlog_format = ROW#max_binlog_size = 1024M# 主节点master不需要写binlog的数据库binlog_ignore_db = mysqlbinlog_ignore_db = information_schemabinlog_ignore_db = performance_schemabinlog_ignore_db = sys# 从节点slave不进行数据同步的数据库replicate_ignore_db = mysqlreplicate_ignore_db = information_schemareplicate_ignore_db = performance_schemareplicate_ignore_db = sys# 中继日志(默认是开启的,直接使用默认)#relay_log = mysql-relay-bin# mysql5.7以后的版本不需要配置log-slave-updates=1# log-slave-updates = 1#[client]#socket = /var/run/mysqld/mysqld.sock#!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:creationTimestamp: nullname: mysql-master-01-cmnamespace: mysql-cluster---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-master-01namespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc-01"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-01-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-01-cmitems:- key: my.cnfmode: 0644path: my.cnf
3.3.2 主节点2
主节点2 mysql-master-2.yaml 内容如下
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-02-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.40.129path: /data/nfs/mysql-master-02storageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-02-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-02-nfs-pv---
apiVersion: v1
kind: Service
metadata:name: mysql-master-svc-02namespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 3307selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP---
apiVersion: v1
data:my.cnf: |[mysqld]server-id = 2# 开启gtidgtid_mode = ONenforce_gtid_consistency = 1# 设置自增ID初始值为1,每次自增量为2。即都是偶数2,4,6,8,...auto_increment_offset = 1auto_increment_increment = 2# 开启bin_log(默认是开启的,直接使用默认),模式为ROW,允许最大日志为1G#log_bin = mysql-bin#binlog_format = ROW#max_binlog_size = 1024M# 主节点master不需要写binlog的数据库binlog_ignore_db = mysqlbinlog_ignore_db = information_schemabinlog_ignore_db = performance_schemabinlog_ignore_db = sys# 从节点slave不进行数据同步的数据库replicate_ignore_db = mysqlreplicate_ignore_db = information_schemareplicate_ignore_db = performance_schemareplicate_ignore_db = sys# 中继日志(默认是开启的,直接使用默认)#relay_log = mysql-relay-bin# mysql5.7以后的版本不需要配置log-slave-updates=1# log-slave-updates = 1#[client]#socket = /var/run/mysqld/mysqld.sock#!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:creationTimestamp: nullname: mysql-master-02-cmnamespace: mysql-cluster---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-master-02namespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc-02"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-02-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-02-cmitems:- key: my.cnfmode: 0644path: my.cnf
3.3.3 配置注意点
- nfs 的地址、路径
- msql的配置中 server-id 要不同,gtid_mode设置为on,enforce_gtid_consistency设置为1
[mysqld]server-id = 2# 开启gtidgtid_mode = ONenforce_gtid_consistency = 1
- mysql的镜像地址 有需要改成能拉取到的镜像
- service 的nodePort端口要设置不同(共用一个service的可以不变)
3.4 启动集群
3.4.1 启动
kubectl apply -f .

3.4.2 k8s查看所有集群信息
kubectl get all -n mysql-cluster -o wide
3.4.3 进入主节点1
kubectl exec -itn mysql-cluster pod/mysql-master-01-0 -- mysql -uroot -p
输入密码·12345

加入集群命令
change master tomaster_host='mysql-master-02-0.mysql-master-svc-02.mysql-cluster.svc.cluster.local',master_port=3306,master_user='root',master_password='123456',master_auto_position=1,get_master_public_key=1;
需要注意下面的几个参数:
- master_host: 这个参数是 节点2的 master的地址,(根据k8s的网络解析,pod名称.service名称.命名空间.svc.cluster.local 。我的是 mysql-master-02-0.mysql-master-svc-02.mysql-cluster.svc.cluster.local)
- master_port: 主节点的mysql端口,我们没改默认是3306
- master_user: 登录到主节点的mysql用户
- master_password: 登录到主节点要用到的密码
- get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,
如果要修改那么请按照自己的环境进行修改。

启动主从
#启动
start slave;
#查看副本状态
show replica status\G;

看到这两项都为yes表示正常
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
3.4.4 进入主节点2
kubectl exec -itn mysql-cluster pod/mysql-master-02-0 -- mysql -uroot -p
输入密码·12345

加入集群命令
change master tomaster_host='mysql-master-01-0.mysql-master-svc-01.mysql-cluster.svc.cluster.local',master_port=3306,master_user='root',master_password='123456',master_auto_position=1,get_master_public_key=1;
需要注意下面的几个参数:
- master_host: 这个参数是 节点1的 master的地址,(根据k8s的网络解析,pod名称.service名称.命名空间.svc.cluster.local 。我的是 mysql-master-01-0.mysql-master-svc-01.mysql-cluster.svc.cluster.local)
- master_port: 主节点的mysql端口,我们没改默认是3306
- master_user: 登录到主节点的mysql用户
- master_password: 登录到主节点要用到的密码
- get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,
如果要修改那么请按照自己的环境进行修改。

启动主从
#启动
start slave;
#查看副本状态
show replica status\G;

看到这两项都为yes表示正常
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
四,测试集群
4.1 完整性测试
工具连接两个 是3306、3307,端口,
我们在在节点1上建库,建表
CREATE DATABASE `test_db`;
USE `test_db`;CREATE TABLE `user` (`user_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`age` TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',`gender` TINYINT UNSIGNED DEFAULT 2 COMMENT '性别;0=男,1=女,2=未知'
) COMMENT '用户表';
到节点2上查看,是否同步了

我们在节点2上插入2条数据,看下是否能同步
INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('oopxiajun', '18', '0');
INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('01', '28', '0');

再去节点1上看下是否有这两条数据

已经成功同步。
4.2 宕机其中一台测试
关闭 节点2
kubectl delete -f mysql-master-2.yaml

节点2已经连不上连不上了

这时我们在节点1插入一条数据
INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('02宕机数据', '28', '0');

启动节点2
kubectl apply -f mysql-master-2.yaml
查看数据是否同步

这样我们架构就保证我们两台中一台能正常运行,业务就不会停止,发生故障的服务器恢复后可以自动同步数据。
相关文章:
k8s搭建双主的mysql8集群---无坑
《k8s搭建一主三从的mysql8集群---无坑-CSDN博客》通过搭建一主三从,我们能理解到主节点只有1个,那么承担增删改主要还是主节点,如果你在从节点上去操作增删改操作,数据不会同步到其他节点。本章我们将实现多主(双主&a…...
Iterm2配置主题和Oh-My-Zsh
文章目录 一、配置主题1.1 安装使用git1.2 安装手册1.2.1 激活使用主题 二、配置oh-my-zsh2.1、oh-my-zsh插件2.2、oh-my-zsh主题 [Zsh](http://zsh.org/)2.2.1、Install using Git2.2.2、Install manually2.2.3、Activating theme2.2.4、Install using [zplug](https://github…...
html+css+js实现step进度条效果
实现效果 代码实现 HTML部分 <div class"box"><ul class"step"><li class"circle actives ">1</li><li class"circle">2</li><li class"circle">3</li><li class&quo…...
OpenCV视频I/O(8)视频采集类VideoCapture之从视频源中读取一帧图像函数read()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 抓取、解码并返回下一个视频帧。 cv::VideoCapture::read() 是 VideoCapture 类的一个成员函数,用于从视频源中读取一帧图像. 该方法…...
深度学习500问——Chapter17:模型压缩及移动端部署(2)
文章目录 17.4.6 低秩分解 17.4.7 总体压缩效果评价指标有哪些 17.4.8 几种轻量化网络结构对比 17.4.9 网络压缩未来研究方向有哪些 17.5 目前有哪些深度学习模型优化加速方法 17.5.1 模型优化加速方法 17.5.2 TensorRT加速原理 17.5.3 TensorRT如何优化重构模型 17.5.4 Tensor…...
【C#】DllImport的使用
DllImport 是 C# 中用于从非托管 DLL(动态链接库)中导入函数的一个特性。这个特性允许你在 .NET 应用程序中调用由其他语言编写的函数,如 C 或 C。使用 DllImport 可以让你重用现有的非托管代码,而不需要重新实现这些功能。 下面…...
基于 Redis 实现滑动窗口的限流
⏳ 限流场景:突发流量,恶意流量,业务本身需要 基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库,具有高性能和支持原子操作的特点,非常适合用来实现限流功能。下面是一个使用 Redis 实现…...
Camera Raw:打开图像
在图像工作流程中,无论是 Raw 格式图像文件还是 JPEG、TIFF 文件,都可以先使用 Camera Raw 打开并调整后,再进入其它 Adobe 软件如 Photoshop 中进行进一步的编辑和处理。 一、打开 Raw 格式图像 1、通过 Adobe Bridge 打开 在 Adobe Bridge …...
RK3588主板PCB设计学习(六)
可以在其它层对过孔进行削盘处理, 可以看到,这里有些过孔用不上,在这一层进行了削盘处理: 对于这种电源层进行铺铜操作的时候,如果不进行削盘处理的话这些焊盘可能导致这个电源层面不完整,存在割裂的风险&a…...
论文阅读(十一):CBAM: Convolutional Block Attention Module
文章目录 IntroductionConvolutional Block Attention ModuleExperimentsConclusion 论文题目:CBAM: Convolutional Block Attention Module(CBAM:卷积注意力机制) 论文链接:点击跳转 代码链接:Git…...
【Kubernetes】常见面试题汇总(四十八)
目录 108.考虑一家拥有非常分散的系统的跨国公司,希望解决整体代码库问题。您认为公司如何解决他们的问题? 109.我们所有人都知道从单服务到微服务的转变从开发方面解决了问题,但在部署方面却增加了问题。公司如何解决部署方面的问题&#x…...
Qt Creator安卓环境配置【筑基篇】
1.前言 由于我的Qt Creator目前就先的14版本IDE老是存在各种莫名奇妙的bug,我都已经成为官方Qt Forum官方论坛的常客了。有一说一新版本的各种设置不小心误触是真的坑死人。不说了给我小主机配置安卓环境了。小主机系统版本window11-23H,Qt-Creator版本是13.01版本…...
利用SpringBoot构建高效社区医院平台
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
【C++ 前缀和 数论】1590. 使数组和能被 P 整除|2038
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 质数、最大公约数、菲蜀定理 LeetCode 1590. 使数组和能被 P 整除 给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空)&am…...
外部引入的 JavaScript 放置位置
部引入的 JavaScript 通常有两种常见的放置位置,每个位置都有其优缺点,具体取决于页面的需求和性能优化目标: 1. 放在页面的 <head> 标签中 这种方式在 HTML 文档的 <head> 部分引入 JavaScript 文件。 <head><scrip…...
【tbNick专享】虚拟机域控、成员服务器、降级等管理
在 VMware 中完成四台域控服务器、一台成员服务器的创建、降级域控为成员服务器,并创建子域的操作。 1. 创建四台域控和一台成员服务器 1.1 在 VMware 中创建虚拟机 启动 VMware Workstation: 打开 VMware Workstation,点击 “创建新的虚拟…...
Raspberry Pi3B+之Rpanion(gst)和ffmpeg验证
Raspberry Pi3B之Rpanion-gst和ffmpeg验证 1. 源由2. 分析3. 环境搭建步骤1:安装镜像步骤2:系统更新步骤3:安装numpy组件步骤4:安装python3-picamera2组件步骤4:安装cv2组件步骤5:安装ffmpeg组件步骤6&…...
数据结构编程实践20讲(Python版)—04队列
本文目录 04 队列 QueueS1 说明S2 示例普通队列循环队列双端队列优先队列S3 问题:基于普通队列实现的打印机任务管理Python3程序S4 问题:使用循环队列管理玩家移动轨迹Python3程序S5 问题:使用双端队列来管理文档操作历史Python3程序S6 问题:使用优先队列管理车辆调度Pytho…...
Ubuntu开机进入紧急模式处理
文章目录 Ubuntu开机进入紧急模式处理一、问题描述二、解决办法参考 Ubuntu开机进入紧急模式处理 一、问题描述 Ubuntu开机不能够正常启动,自动进入紧急模式(You are in emergency mode)。具体如下所示: 二、解决办法 按CtrlD进…...
解决无网条件下离线安装缺失的python包
首先在有网的机器上使用conda create --name xx pythonx.x.x 命令创建一个和目标机器(无网)一样的环境 使用 下面命令 pip download opencv-python -d C:\Users\xuhaitao\Desktop\installer pip download pyinstaller -d C:\Users\xuhaitao\Desktop\installer 在目标…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

