如何迁移 Linux 服务器 第一部分 - 系统准备
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
简介
在许多情况下,您可能需要将数据和操作需求从一个服务器迁移到另一个服务器。您可能需要在新的数据中心实施解决方案,升级到更大的机器,或者过渡到新的硬件或新的 VPS 提供商。
无论您的原因是什么,在从一个系统迁移到另一个系统时,您应该考虑许多不同的因素。如果您没有使用 Chef、Puppet 或 Ansible 等配置管理解决方案,要获得功能上等效的配置可能会很困难。您不仅需要传输数据,还需要配置您的服务在新机器上以相同的方式运行。
在本指南中,您将了解如何准备源系统和目标系统进行迁移。这将包括让您的两台机器使用 SSH 密钥进行通信,并调查需要转移的组件。您将在本系列的下一篇文章中开始实际迁移。
步骤 1 – 创建备份
执行任何可能具有破坏性的操作时,首先要采取的步骤是创建全新的备份。您不希望在替换正在运行的生产机器之前,某个命令在当前生产机器上出现故障。
有许多不同的方法可以备份服务器。您的选择将取决于对您的情况有意义的选项以及您最熟悉的选项。
如果您可以访问物理硬件并有备份空间(磁盘驱动器、USB 等),您可以使用许多可用的镜像备份解决方案之一来克隆磁盘。在处理云服务器时,功能上等效的方法是在控制面板界面内拍摄快照或镜像。
完成备份后,您就可以继续进行下一步了。在本指南的其余部分,您将需要以 root 用户身份运行许多命令,或者使用 sudo。
步骤 2 – 收集有关源系统的信息
在开始迁移之前,您应该配置目标系统以匹配源系统。
您将希望在当前服务器和计划迁移到的服务器之间尽可能匹配。您可能希望在迁移到较新的目标系统之前升级当前服务器,并在此之后再次进行备份。重要的是,当开始实际迁移时,它们尽可能匹配。
大部分可以帮助您决定为新机器创建哪种服务器系统的信息可以使用 uname 命令检索:
uname -r
5.4.0-26-generic
这是您当前系统正在运行的内核版本。为了使事情顺利进行,最好尝试在目标系统上匹配它。
您还应该尝试匹配源服务器的发行版和版本。如果您不知道在源机器上安装的发行版版本,可以通过输入以下命令来查找:
cat /etc/issue
Ubuntu 20.04.3 LTS \n \l
如果可能的话,您应该使用相同的参数创建新服务器。在这种情况下,您将创建一个 Ubuntu 20.04 系统。您还应尽量匹配内核版本。通常情况下,这应该是来自您的 Linux 发行版存储库的最新内核。
步骤 3 – 在源和目标服务器之间设置 SSH 密钥访问
您需要让您的服务器能够通信以便传输文件。为了做到这一点,您应该在它们之间交换 SSH 密钥。您可以学习如何在 Linux 服务器上配置 SSH 密钥。
您需要在目标服务器上创建一个新密钥,以便将其添加到现有服务器的 authorized_keys 文件中。这比另一种方式更清晰,因为这样,当迁移完成时,新服务器的 authorized_keys 文件中就不会有多余的密钥。
首先,在目标机器上,通过输入以下命令检查您的 root 用户是否已经拥有 SSH 密钥:
ls ~/.ssh
authorized_keys
如果您看到名为 id_rsa.pub 和 id_rsa 的文件,则表示您已经拥有密钥,您只需要将它们传输过去。
如果您没有看到这些文件,可以使用 ssh-keygen 创建新的密钥对:
ssh-keygen -t rsa
按照提示按下 “Enter” 键以接受默认值。
现在,您可以通过 ssh 将密钥传输到源服务器:
cat ~/.ssh/id_rsa.pub | ssh other_server_ip "cat >> ~/.ssh/authorized_keys"
现在,您应该能够在目标系统上自由地通过 SSH 连接到源服务器,而无需提供密码:
ssh other_server_ip
这将使任何进一步的迁移步骤更加顺利。
步骤 4 – 创建需求清单
现在你将进行系统的深入分析。
在运营过程中,你的软件需求可能会发生变化。有时旧服务器上可能存在一些曾经需要的服务和软件,但已经被替换。
一般来说,不需要的服务可以被禁用,如果完全不需要,也可以被卸载,但是清点它们可能会耗费时间。你需要发现在源服务器上正在使用的服务,然后决定这些服务是否应该存在于新服务器上。
你发现服务和运行级别的方式取决于服务器所采用的“init”系统的类型。init 系统负责在用户命令或自动启动和停止服务。从 2014 年开始,几乎所有主要的 Linux 发行版都采用了一个名为 Systemd 的 init 系统,本指南将反映 Systemd。
为了列出已注册到 Systemd 的服务,你可以使用 systemctl 命令:
systemctl list-units -t service
UNIT LOAD ACTIVE SUB DESCRIPTION >accounts-daemon.service loaded active running Accounts Service >apparmor.service loaded active exited Load AppArmor profiles >apport.service loaded active exited LSB: automatic crash repor>atd.service loaded active running Deferred execution schedul>blk-availability.service loaded active exited Availability of block devi>cloud-config.service loaded active exited Apply the settings specifi>cloud-final.service loaded active exited Execute cloud user/final s>cloud-init-local.service loaded active exited Initial cloud-init job (pr>cloud-init.service loaded active exited Initial cloud-init job (me>console-setup.service loaded active exited Set console font and keyma>containerd.service loaded active running containerd container runti>
…
Systemd 通过“targets”实现服务管理。传统 init 系统的系统一次只能处于一个“运行级别”,而使用 Systemd 的服务器可以同时达到多个 targets。这在实践中更加灵活,但确定哪些服务是活动的可能更加困难。
你可以通过输入以下命令来查看当前活动的 targets:
systemctl list-units -t target
UNIT LOAD ACTIVE SUB DESCRIPTIONbasic.target loaded active active Basic Systemcloud-config.target loaded active active Cloud-config availabilitycloud-init.target loaded active active Cloud-init targetcryptsetup.target loaded active active Local Encrypted Volumesgetty.target loaded active active Login Promptsgraphical.target loaded active active Graphical Interfacelocal-fs-pre.target loaded active active Local File Systems (Pre)local-fs.target loaded active active Local File Systemsmulti-user.target loaded active active Multi-User Systemnetwork-online.target loaded active active Network is Online
…
你可以通过输入以下命令来列出所有可用的 targets:
systemctl list-unit-files -t target
UNIT FILE STATE VENDOR PRESET
basic.target static enabled
blockdev@.target static enabled
bluetooth.target static enabled
boot-complete.target static enabled
cloud-config.target static enabled
cloud-init.target enabled-runtime enabled
cryptsetup-pre.target static disabled
cryptsetup.target static enabled
ctrl-alt-del.target disabled enabled
…
从这里,你可以找出每个 target 关联的服务。Targets 可以有服务或其他 targets 作为依赖项,因此你可以通过输入以下命令来查看每个 target 实施的策略:
systemctl list-dependencies target_name.target
multi-user.target 是 Systemd 服务器上常用的一个 target,在启动过程中达到该目标时,用户可以登录。例如,你可以输入以下命令:
systemctl list-dependencies multi-user.target
multi-user.target
● ├─apport.service
● ├─atd.service
● ├─console-setup.service
● ├─containerd.service
● ├─cron.service
● ├─dbus.service
● ├─dmesg.service
● ├─docker.service
● ├─grub-common.service
● ├─grub-initrd-fallback.service
…
这将列出该目标的依赖树,给出当达到该目标时启动的服务和其他 targets 的列表。
通过其他方法检查服务
虽然大多数由软件包管理器配置的服务将被注册到 init 系统中,但一些其他软件,如 Docker 部署,可能不会。
你可以尝试通过查看这些服务使用的网络端口和 Unix 套接字来找到这些其他服务和进程。在大多数情况下,服务以某种方式相互通信或与外部实体通信。服务器上只有一定数量的接口可以用于服务通信,检查这些接口是发现其他服务的好方法。
你可以使用 netstat 工具来发现正在使用的网络端口和 Unix 套接字。你可以使用 -nlp 标志运行 netstat 以获得概述:
netstat -nlp
-n指定输出中应显示数字 IP 地址,而不是主机名或用户名。在检查本地服务器时,这通常更加信息丰富。-l指定netstat只显示活动监听套接字。-p显示每个使用端口或套接字的进程 ID(PID)和名称。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8200 0.0.0.0:* LISTEN 104207/vault
tcp 0 0 0.0.0.0:1935 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:1936 0.0.0.0:* LISTEN 197885/stunnel4
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 162540/systemd-reso
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 129518/sshd: /usr/s
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 99465/node /root/he
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:56733 0.0.0.0:* LISTEN 170269/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 3691671/nginx: mast
tcp6 0 0 :::22 :::* LISTEN 129518/sshd: /usr/s
tcp6 0 0 :::443 :::* LISTEN 3691671/nginx: mast
tcp6 0 0 :::56733 :::* LISTEN 170275/docker-proxy
udp 0 0 127.0.0.53:53 0.0.0.0:* 162540/systemd-reso
raw6 0 0 :::58 :::* 7 162524/systemd-netw
raw6 0 0 :::58 :::* 7 162524/systemd-netw
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 5313074 1/systemd /run/systemd/userdb/io.systemd.DynamicUser
unix 2 [ ACC ] SEQPACKET LISTENING 12985 1/systemd /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 12967 1/systemd /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 12980 1/systemd /run/systemd/journal/stdout
unix 2 [ ACC ] STREAM LISTENING 16037236 95187/systemd /run/user/0/systemd/private
…
netstat 输出包含两个独立的块 —— 一个用于网络端口,一个用于套接字。如果你在这里看到了通过 init 系统没有信息的服务,你将不得不弄清楚原因,并确定是否打算迁移这些服务。
你可以使用 lsof 命令获取关于服务提供的端口的类似信息:
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node\x20/ 99465 root 20u IPv4 16046039 0t0 TCP 127.0.0.1:3000 (LISTEN)
vault 104207 vault 8u IPv4 1134285 0t0 TCP *:8200 (LISTEN)
sshd 129518 root 3u IPv4 1397496 0t0 TCP *:22 (LISTEN)
sshd 129518 root 4u IPv6 1397507 0t0 TCP *:22 (LISTEN)
systemd-r 162540 systemd-resolve 12u IPv4 5313507 0t0 UDP 127.0.0.53:53
systemd-r 162540 systemd-resolve 13u IPv4 5313508 0t0 TCP 127.0.0.53:53 (LISTEN)
docker-pr 170269 root 4u IPv4 1700561 0t0 TCP *:56733 (LISTEN)
docker-pr 170275 root 4u IPv6 1700573 0t0 TCP *:56733 (LISTEN)
stunnel4 197885 stunnel4 9u IPv4 1917328 0t0 TCP *:1936 (LISTEN)
sshd 3469804 root 4u IPv4 22246413 0t0 TCP 159.203.102.125:22->154.5.29.188:36756 (ESTABLISHED)
nginx 3691671 root 7u IPv4 2579911 0t0 TCP *:8080 (LISTEN)
nginx 3691671 root 8u IPv4 1921506 0t0 TCP *:80 (LISTEN)
nginx 3691671 root 9u IPv6 1921507 0t0 TCP *:80 (LISTEN)
nginx 3691671 root 10u IPv6 1921508 0t0 TCP *:443 (LISTEN)
nginx 3691671 root 11u IPv4 1921509 0t0 TCP *:443 (LISTEN)
nginx 3691671 root 12u IPv4 2579912 0t0 TCP *:8088 (LISTEN)
nginx 3691671 root 13u IPv4 2579913 0t0 TCP *:1935 (LISTEN)
nginx 3691674 www-data 7u IPv4 2579911 0t0 TCP *:8080 (LISTEN)
nginx 3691674 www-data 8u IPv4 1921506 0t0 TCP *:80 (LISTEN)
nginx 3691674 www-data 9u IPv6 1921507 0t0 TCP *:80 (LISTEN)
nginx 3691674 www-data 10u IPv6 1921508 0t0 TCP *:443 (LISTEN)
nginx 3691674 www-data 11u IPv4 1921509 0t0 TCP *:443 (LISTEN)
nginx 3691674 www-data 12u IPv4 2579912 0t0 TCP *:8088 (LISTEN)
nginx 3691674 www-data 13u IPv4 2579913 0t0 TCP *:1935 (LISTEN)
netstat 和 lsof 都是核心 Linux 进程管理工具,在各种其他情境中都很有用。
第五步 – 收集软件包版本
此时,你应该已经对源服务器上运行的服务有了一个很好的了解,你应该在目标服务器上实施这些服务。
你应该有一个服务列表,你知道你需要在新服务器上实施这些服务。为了顺利过渡,重要的是尽可能匹配版本。
你不一定要审查源系统上安装的每个软件包,并尝试在新系统上复制它,但你应该检查对你的需求重要的软件组件,并尝试找到它们的版本号。
你可以尝试从软件本身获取版本号,有时通过向每个命令传递 -v 或 --version 标志,但通过你的软件包管理器更加直接。如果你使用基于 Ubuntu/Debian 的系统,你可以使用 dpkg 命令查看安装的软件包版本:
dpkg -l | grep package_name
如果你使用基于 Rocky Linux、RHEL 或 Fedora 的系统,你可以使用 rpm 来实现相同的目的:
rpm -qa | grep package_name
这将让你对要匹配的软件包版本有一个很好的了解。确保保留任何相关软件的版本号。
结论
现在,你应该已经很清楚源服务器上需要迁移到新机器的进程和服务。你还应该已经完成了允许你的两台服务器相互通信的初步步骤。
你的迁移基础现在已经完成。在本系列的下一篇文章中,你将开始实际的迁移过程。
相关文章:
如何迁移 Linux 服务器 第一部分 - 系统准备
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 在许多情况下,您可能需要将数据和操作需求从一个服务器迁移到另一个服务器。您可能需要在新的数据中心实施解决方案&a…...
网络IO模型都有哪些
“网络IO模型有BIO、NIO、AIO ” “他们分别代表什么,有什么区别吗? BIO:同步阻塞IO。 NIO:同步非阻塞IO。 AIO:异步非阻塞IO。 “BIO为什么是同步阻塞IO,他阻塞的是谁跟谁之间的关联?”。 首先…...
数据结构: 数组在算法中的应用
数组是计算机科学中的一种基础数据结构,它在算法中有着广泛的应用,其关键要素是索引与索引对应的值。 请注意,这些代码示例需要适当的辅助函数(如 swap )和主函数来运行。此外,一些算法(如KMP算…...
js快速转换时间(时间戳转换成年月日时分秒)
1:js转换 1728270833000 转换为 2024-10-07 11:13:53 var date new Date(1728270833000); // 参数需要毫秒数,所以这里将秒数乘于 1000 Y date.getFullYear() -; M (date.getMonth()1 < 10 ? 0(date.getMonth()1) : date.getMonth()1) -; D…...
LeetCode15.三数之和
题目链接:15. 三数之和 - 力扣(LeetCode) 1.常规解法(会超时) 由于这道题需要排除相同的三元组,则可以先将目标数组从小到大排序,再遍历数组找到每个符合条件的三元组,若结果中不包…...
SpringBoot3.3 优雅启停定时任务
定时任务是非常常见的功能,在一个复杂的应用程序中,如何优雅地管理这些定时任务的启动与停止尤为重要。 Spring Boot 提供了强大的任务调度支持,通过@Scheduled注解可以轻松地创建定时任务,并且可以通过配置来灵活地管理这些任务的执行环境。在本文中,我们将深入探讨如何…...
数据结构之二叉搜索树(key模型与key_value模型)
二叉搜索树(key模型与key_value模型) 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3. ⼆叉搜索树的插⼊4. ⼆叉搜索树的查找5. ⼆叉搜索树的删除6. ⼆叉搜索树的实现代码7. ⼆叉搜索树key和key/value使⽤场景7.1 key搜索场景:7.2 key/value搜…...
图说几何学2300年重大错误:附着在直线z上的直线段必是z的一部分
黄小宁 用泡沫塑料和油漆制成的铅球与真正的铅球,两者有不同的内部形状。同样,数学有长度相同但内部形状不同的伪≌直线段。 几何学有史2300年来一直认定附着在直线z上的直线段一定是z的一部分。其实这是2300年肉眼直观错觉——百年病态集论的症结。 …...
汽车网关(GW)技术分析
一、引言 在现代汽车电子系统中,汽车网关(Gateway,简称 GW)扮演着至关重要的角色。随着汽车电子技术的不断发展,汽车内部的电子控制单元(Electronic Control Unit,简称 ECU)数量不断…...
Telnet命令详解:安装、用法及应用场景解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...
C++之LIST模拟实现(代码纯享版)
目录 文章目录 前言 一、代码 总结 前言 本文主要展示了模拟List的代码实现 一、代码 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zlh {template<class T>struct list_node{T _data;list_node<T>* _next;l…...
华为OD机试 - 括号匹配 - 栈(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
打破欧美10年芯片垄断,杨振宁教授关门弟子,仅用三年创造奇迹
有这么一位超级厉害的中国人,硬是把欧美那边垄断了十年的芯片技术给“撬”开了!说起来,这才是我们该追的真正明星啊!那么,这位大神到底是谁?又是怎么让欧美芯片圈儿里的人听到她的名字就心里发怵的呢&#…...
OpenCV视频I/O(20)视频写入类VideoWriter之用于将图像帧写入视频文件函数write()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::VideoWriter::write() 函数用于将图像帧写入视频文件。 该函数/方法将指定的图像写入视频文件。图像的大小必须与打开视频编写器时指定的大…...
音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
一、引言 在《音视频入门基础:FLV专题(9)——Script Tag简介》中对Script Tag进行了简介,本文讲述FFmpeg源码中是怎样解码FLV文件的Script Tag,拿到里面的信息。 二、flv_read_packet函数 从《音视频入门基础&#x…...
小猿口算APP脚本(协议版)
小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…...
【长文梳理webserver核心】核心类篇
前言 有三个核心组件支撑一个reactor实现 [持续] 的 [监听] 一组fd,并根据每个fd上发生的事件 [调用] 相应的处理函数。这三个组件就是 EventLoop 、Channel 以及 Poller 三个类,其中 EventLoop 可以看作是对业务线程的封装,而 Channel 可以看…...
[实用工具]Docker安装nextcloud实现私有云服务和onlyoffice
Nextcloud是一款开源的云存储和协作平台,允许用户在自己的服务器上存储和访问文件,同时提供强大的协作工具。它可以替代商业云存储服务,让用户拥有完全控制和自主管理自己的数据。 Nextcloud支持文件上传和下载,可以通过Web界面、…...
基于STM32设计的生猪健康检测管理系统(NBIOT+OneNet)(240)
文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 系统功能总结1.6 系统框架图…...
springboot kafka多数据源,通过配置动态加载发送者和消费者
前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
