• 一文读懂通信系统等级备案:合规运营与安全防护的必修课
    在数字化浪潮席卷全球的今天,通信系统作为信息传递的 “神经中枢”,其安全性与合规性愈发重要。通信系统等级备案,正是保障通信系统安全稳定运行、确保企业合法合规经营的关键环节。今天,就让我们深入探讨通信系统等级备案的方方面面。一、通信系统等级备案是什么?通信系统等级备案,全称为通信网络安全防护等级保护备案,是依据国家相关法律法规和技术标准,对通信系统按照其在国家安全、经济建设、社会生活中的重要程度,以及遭到破坏后对国家安全、社会秩序、公共利益以及公民、法人和其他组织的合法权益的危害程度等因素,划分为不同的安全保护等级,并进行相应的备案管理工作 。简单来说,就是给通信系统划分安全 “等级”,并向相关部门报备,以便采取针对性的安全防护措施。目前,我国通信系统安全保护等级分为五级,从第一级(自主保护级)到第五级(专控保护级),安全保护要求逐级升高。第一级适用于一般的小型通信系统,对安全要求相对较低;而第五级则主要针对涉及国家安全等核心领域的关键通信系统,需要极为严格的安全防护。二、为什么通信系统等级备案如此重要?(一)法律合规要求根据《网络安全法》《通信网络安全防护管理办法》等法律法规,通信系统运营者有义务对通信系统进行等级保护备案。未按规定进行备案的,将面临责令整改、罚款,甚至暂停相关业务等处罚。对于企业而言,合规是生存和发展的基础,忽视等级备案可能会给企业带来巨大的法律风险和经济损失。(二)保障系统安全通过等级备案,运营者能够清晰地认识到自身通信系统的安全等级和安全需求,从而按照相应等级的防护标准,有针对性地加强安全技术措施和管理措施。这有助于及时发现和修复系统漏洞,防范网络攻击、数据泄露等安全威胁,保障通信系统的稳定运行和数据安全。(三)提升企业信誉完成通信系统等级备案,表明企业具备良好的网络安全管理能力和合规意识,能够为用户提供更安全可靠的服务。这在市场竞争中是一张重要的 “信任名片”,有助于提升企业的品牌形象和市场竞争力,赢得用户和合作伙伴的信任。三、通信系统等级备案的流程详解(一)系统定级运营者首先需要组织专业人员或委托专业机构,依据相关标准对通信系统进行定级。在定级过程中,要充分考虑系统的功能、服务对象、业务重要性等因素,科学合理地确定系统的安全保护等级。定级完成后,需形成详细的定级报告。(二)备案材料准备根据相关要求,准备备案所需的材料,通常包括:《通信网络安全防护等级保护备案表》,详细填写通信系统的基本信息、安全保护等级等内容。定级报告,说明系统定级的依据、过程和结果。系统拓扑结构及说明,展示通信系统的网络架构和组成部分。其他相关材料,如系统安全管理制度、应急预案等。(三)提交备案将准备好的备案材料提交至当地通信管理局或相关主管部门。提交方式可以是现场提交或通过线上备案系统提交。提交后,等待主管部门对备案材料进行审核。(四)审核与整改主管部门在收到备案材料后,会对材料的完整性、准确性以及系统定级的合理性进行审核。如果审核不通过,运营者需要根据主管部门的反馈意见,对备案材料或系统进行整改,然后重新提交审核。审核通过后,主管部门将发放备案证明,标志着通信系统等级备案工作完成。四、通信系统等级备案常见问题与解决方案(一)定级不准确部分企业由于对定级标准理解不深入,导致通信系统定级过高或过低。定级过高会增加不必要的安全投入成本,而定级过低则无法有效保障系统安全。解决方案是加强对相关标准的学习,必要时聘请专业的安全评估机构协助定级,确保定级结果科学合理。(二)备案材料不规范备案材料填写不完整、格式不正确、内容不准确等问题较为常见。这就要求运营者在准备材料时,仔细研读备案要求,严格按照规范填写和整理材料。可以提前向主管部门咨询,获取准确的材料模板和填写指南。(三)后续安全防护不到位完成备案并不意味着一劳永逸,后续还需要按照相应等级的安全防护要求,持续加强系统的安全管理和技术防护。部分企业存在重备案、轻防护的问题,这将使备案失去实际意义。企业应建立完善的网络安全管理制度,定期进行安全检查和风险评估,及时更新安全防护措施,确保通信系统始终处于安全状态。通信系统等级备案是保障通信系统安全、企业合规运营的重要举措。无论是大型通信运营商,还是拥有内部通信系统的企业,都应充分认识到等级备案的重要性,严格按照规定流程完成备案工作,并持续做好后续的安全防护。只有这样,才能在数字化时代,为通信系统的稳定运行和企业的健康发展筑牢安全防线。
  • Linux 时钟同步原理分析与实践指南:精准时间背后的技术奥秘
    在分布式系统和网络环境中,Linux 系统的时钟同步至关重要,它影响着日志分析、分布式事务等多个关键环节。下面这篇博客将从原理入手,结合实际操作,为你全面讲解 Linux 时钟同步。Linux 时钟同步原理分析与实践指南:精准时间背后的技术奥秘在数字化时代,时间的精准性对于计算机系统至关重要。无论是分布式系统中的数据一致性保障,还是网络服务的日志追踪,都依赖于准确的时钟。对于 Linux 系统而言,时钟同步是确保系统稳定运行、服务可靠提供的基础功能。本文将深入剖析 Linux 时钟同步的原理,并通过详细的实践步骤,带你掌握这一核心技术。一、Linux 时钟同步的重要性在企业级应用场景中,不准确的时钟可能引发严重问题。例如,在分布式数据库的主从复制中,时间不一致会导致数据同步错误;在微服务架构里,错误的时间戳会使服务调用链追踪失去意义;在安全审计领域,混乱的时间记录将无法准确还原操作顺序。因此,实现 Linux 系统的精准时钟同步,是保障系统正常运行的必要条件。二、Linux 时钟系统基础概念2.1 硬件时钟与系统时钟Linux 系统存在两种时钟概念:硬件时钟(RTC,Real - Time Clock):由计算机主板上的专用芯片维持,即使系统断电,也能依靠主板电池持续计时,是系统时间的物理基础。系统时钟:Linux 内核在系统运行时维护的时钟,其时间来源初始时通常是硬件时钟,在系统运行过程中,可通过网络时间协议等方式进行更新和校准 。2.2 时间标准全球通用的时间标准主要有:UTC(协调世界时):基于原子钟的高精度时间标准,同时结合天文观测结果,通过闰秒调整来保持与地球自转时间的同步,是国际标准时间的基础。NTP 时间:网络时间协议(Network Time Protocol)所使用的时间标准,常用于计算机网络中的时钟同步,以 UTC 为基础进行时间传递和校准。三、Linux 时钟同步原理3.1 网络时间协议(NTP)NTP 是 Linux 系统实现时钟同步的常用协议,其工作原理基于客户端 - 服务器模型:时间请求与响应:客户端向 NTP 服务器发送时间同步请求,请求报文中包含客户端发送请求的时间戳(T1)。服务器接收到请求后,记录接收时间(T2),并在处理请求后,记录发送响应的时间(T3),然后将 T1、T2、T3 以及服务器自身的当前时间(T4)封装在响应报文中返回给客户端。时间计算:客户端收到响应后,根据公式计算与服务器的时间偏移量和网络延迟。时间偏移量 = [(T2 - T1) + (T3 - T4)] / 2,网络延迟 = (T4 - T1) - (T3 - T2)。通过计算出的时间偏移量,客户端调整自身的系统时钟,实现与服务器的时间同步 。层级体系(Stratum):NTP 采用层级体系来组织服务器,Stratum 0 为最顶层,通常是原子钟、GPS 接收器等高精度时间源;Stratum 1 服务器直接与 Stratum 0 设备相连,作为一级时间服务器;Stratum 2 服务器从 Stratum 1 服务器获取时间,依此类推。层级越低,时间精度越高,客户端通常选择较低层级的 NTP 服务器进行同步 。3.2 其他时钟同步机制除了 NTP,还有一些其他的时钟同步技术:PTP(精确时间协议,Precision Time Protocol):适用于对时间精度要求极高的场景,如工业自动化、金融交易系统等。PTP 不仅依赖软件,还需要硬件支持,通过专用的 PTP 网卡和支持 PTP 协议的交换机,能够实现亚微秒级的时间同步精度 。Chrony:是 NTP 的一种实现方式,相比传统 NTP,Chrony 在时钟同步的快速性和准确性上有显著提升,尤其在网络条件不稳定的情况下,能更好地适应时间变化,减少时间同步的误差和延迟 。四、Linux 时钟同步实践4.1 使用 NTP 进行时钟同步(以 Ubuntu 系统为例)安装 NTP 服务:打开终端,输入命令sudo apt - get install ntp,按照提示完成安装。配置 NTP 服务器:NTP 服务安装完成后,其配置文件位于/etc/ntp.conf。默认情况下,Ubuntu 系统会自动配置一些公共的 NTP 服务器。如果需要自定义服务器,可以在配置文件中添加或修改。例如,添加阿里云的 NTP 服务器。启动和重启 NTP 服务:安装和配置完成后,使用命令sudo systemctl start ntp启动 NTP 服务;如果之前已经启动过 NTP 服务,在修改配置后,可使用命令sudo systemctl restart ntp重启服务,使配置生效。验证时钟同步状态:使用命令ntpq -p查看 NTP 服务器的连接状态和同步信息。命令执行后,会列出 NTP 服务器列表,包括服务器的地址、层级、延迟、偏移量等信息。如果reach列的值不为 0,且offset列的值在可接受范围内(通常较小),则表示时钟同步正常 。4.2 使用 Chrony 进行时钟同步(以 CentOS 系统为例)安装 Chrony:在 CentOS 系统中,使用命令sudo yum install chrony安装 Chrony 服务。启动和设置开机自启:安装和配置完成后,使用命令sudo systemctl start chronyd启动 Chrony 服务;使用命令sudo systemctl enable chronyd设置 Chrony 服务开机自启,确保系统每次启动时都能自动进行时钟同步 。查看同步状态:使用命令chronyc sources -v查看 Chrony 与 NTP 服务器的同步状态,命令执行后会显示服务器的相关信息以及同步情况;使用命令chronyc tracking查看当前系统时钟的详细同步信息,包括时间源、偏移量、误差等 。4.3 手动同步时钟在某些特殊情况下,如无法连接到网络时间服务器,或者需要紧急校准时间时,可以手动同步时钟:设置系统时间:使用命令sudo date -s "YYYY - MM - DD HH:MM:SS"手动设置系统时间,将YYYY - MM - DD HH:MM:SS替换为实际的日期和时间 。将系统时间写入硬件时钟:设置好系统时间后,使用命令sudo hwclock -w将系统时间写入硬件时钟,确保下次系统启动时,硬件时钟的时间是准确的 。五、时钟同步常见问题与解决方法5.1 无法连接到 NTP 服务器原因:可能是网络连接问题、防火墙阻止了 NTP 服务的端口(UDP 123 端口)、NTP 服务器地址配置错误等。解决方法:检查网络连接是否正常;如果是防火墙问题,可使用命令sudo ufw allow 123/udp开放 UDP 123 端口;检查 NTP 服务器地址配置,确保地址正确且可用,可以尝试更换其他 NTP 服务器进行同步 。5.2 时钟同步后时间仍然不准确原因:NTP 服务器自身时间不准确、网络延迟较大导致同步误差、系统时钟存在较大偏差等。解决方法:更换更可靠的 NTP 服务器;检查网络环境,减少网络延迟;如果系统时钟偏差较大,可以尝试多次进行时钟同步,或者手动设置一个较准确的初始时间,再进行同步 。5.3 硬件时钟时间错误原因:主板电池电量不足、硬件时钟芯片故障等。解决方法:更换主板电池;如果怀疑硬件时钟芯片故障,可能需要专业人员进行检修或更换硬件 。六、总结Linux 时钟同步是一项看似基础却又至关重要的技术,深入理解其原理并熟练掌握实践方法,能够有效保障系统的正常运行和服务的可靠提供。无论是通过 NTP、Chrony 等协议进行网络时间同步,还是在特殊情况下手动同步时钟,都需要我们根据实际需求和场景进行选择和操作。同时,对于时钟同步过程中可能出现的问题,要能够准确分析原因并采取有效的解决措施。通过不断学习和实践,我们可以更好地驾驭 Linux 系统的时钟同步,为数字化工作和生活提供坚实的时间保障。如果你在实际操作中遇到其他问题,或者想了解更多关于 Linux 系统优化的内容,欢迎在评论区留言交流!以上博客涵盖了 Linux 时钟同步多方面内容。若你觉得某些部分需要补充案例、调整深度,或有其他修改需求,随时和我说。
  • [技术干货] Linux 时钟同步原理分析与实践指南:从 NTP 到 PTP
    Linux 时钟同步原理分析与实践指南:从 NTP 到 PTP在分布式系统中,时钟同步是保障系统正常运行的基石。从数据库主从复制到微服务调用链追踪,从金融交易记录到安全审计,准确的时间戳是所有分布式应用的生命线。本文将深入探讨 Linux 系统中时钟同步的核心原理、主流技术方案及实战配置方法。一、时钟同步的核心价值与挑战1.1 为什么需要时钟同步?分布式事务一致性:确保跨节点事务的时间顺序正确性日志关联分析:统一时间戳便于故障排查和日志聚合安全审计:准确的时间戳是安全事件追溯的基础协议运行依赖:如 MySQL 主从复制、Kafka 消息顺序等1.2 分布式系统中的时钟挑战物理时钟差异:不同服务器的硬件时钟存在固有漂移网络延迟不确定性:NTP 协议受网络抖动影响闰秒处理:UTC 与 TAI 时间的差异调整可能导致系统异常安全威胁:时钟被攻击可能导致数据混乱或安全漏洞二、Linux 时钟同步的基本原理2.1 硬件时钟与系统时钟硬件时钟(RTC):主板上的实时时钟,断电后由电池供电系统时钟(System Time):Linux 内核维护的时钟,启动时从 RTC 同步关系:系统时钟通过 NTP/PTP 等协议定期校准,硬件时钟可通过hwclock命令与系统时钟同步2.2 时间标准体系UTC(协调世界时):全球通用的时间标准,基于原子钟并定期调整闰秒TAI(国际原子时):连续计时,不调整闰秒,与 UTC 存在固定偏差(当前为 37 秒)GPS 时间:基于 GPS 卫星的时间系统,与 TAI 同步但无闰秒调整2.3 时钟同步算法基础SNTP(简单 NTP):单向时间同步,精度约 100msNTP(网络时间协议):双向时间同步,通过往返延迟计算,精度可达 10msPTP(精确时间协议):基于硬件时钟同步,精度可达亚微秒级(需专用网卡支持)三、NTP 协议详解与实战配置3.1 NTP 协议工作原理NTP 通过交换时间戳报文,计算客户端与服务器之间的时间偏移和网络延迟:图片代码sequenceDiagram Client->>Server: T1时刻发送请求 Server->>Client: T2时刻接收请求,T3时刻发送响应 Client->>Client: T4时刻接收响应 Note right of Client: 计算偏移量θ = [(T2-T1)+(T3-T4)]/2 Note right of Client: 计算往返延迟δ = (T4-T1)-(T3-T2) ServerClientServerClient计算偏移量θ = [(T2-T1)+(T3-T4)]/2计算往返延迟δ = (T4-T1)-(T3-T2)T1时刻发送请求T2时刻接收请求,T3时刻发送响应T4时刻接收响应3.2 NTP 服务器层级(Stratum)Stratum 0:原子钟、GPS 接收器等物理时钟源Stratum 1:直接连接 Stratum 0 的 NTP 服务器Stratum 2:从 Stratum 1 同步的 NTP 服务器依此类推:每增加一级,精度降低约 10%3.3 Ubuntu/Debian 系统 NTP 配置实战安装 NTP 服务bashsudo apt-get install ntp配置 NTP 服务器(/etc/ntp.conf)ini# 上游NTP服务器(中国地区推荐) server ntp.aliyun.com iburst server ntp.tencent.com iburst server cn.pool.ntp.org iburst # 禁止外部访问本服务器的NTP服务 restrict default kod nomodify notrap nopeer noquery restrict 127.0.0.1 restrict ::1 启动并验证服务bashsudo systemctl start ntp sudo systemctl enable ntp ntpq -p # 查看NTP服务器同步状态 手动同步时钟(紧急情况)bashsudo timedatectl set-ntp false # 临时禁用NTP服务 sudo date -s "2023-06-30 12:00:00" # 手动设置时间 sudo hwclock -w # 将系统时间写入硬件时钟 sudo timedatectl set-ntp true # 重新启用NTP服务 四、PTP 协议详解与高精度同步方案4.1 PTP 与 NTP 的核心差异特性NTPPTP精度毫秒级(10ms-100ms)亚微秒级(<1μs)实现方式纯软件实现需要硬件支持(PTP 网卡)网络要求标准以太网支持 IEEE 1588v2 协议的网络适用场景普通服务器时钟同步工业控制、金融交易等高精度场景4.2 PTP 协议工作模式E2E(端到端)模式:只在报文的发送和接收端记录时间戳P2P(点对点)模式:在网络路径中的每个交换机都记录时间戳,补偿网络延迟4.3 Linux 系统 PTP 配置实战确认网卡支持 PTPbashethtool -T eth0 # 查看网卡时间戳能力 安装 PTP 服务(以 LinuxPTP 为例)bashsudo apt-get install linuxptp配置 PTP 主时钟(Grandmaster)ini# /etc/linuxptp/ptp4l.conf [global] logging_level 7 uds_transport 1 time_stamping hardware # 使用硬件时间戳 [eth0] # 替换为实际网卡名 delay_mechanism E2E 配置 PTP 从时钟ini# /etc/linuxptp/ptp4l.conf [global] logging_level 7 uds_transport 1 time_stamping hardware [eth0] delay_mechanism E2E slaveOnly 1 # 设置为从时钟模式启动服务并验证同步bashsudo systemctl start ptp4l # 启动PTP服务 sudo phc2sys -s eth0 -c system # 将PTP时钟同步到系统时钟 watch -n 1 "ptp4l -c eth0 -m" # 实时监控同步状态 五、时钟同步的监控与故障排查5.1 常用监控工具ntpq:NTP 服务状态查询工具bashntpq -p # 查看NTP服务器连接状态 ntpq -c rv # 查看详细同步信息 chronyc:Chrony 服务监控工具bashchronyc sources # 查看时间源状态 chronyc tracking # 查看时钟追踪信息 timedatectl:系统时间管理工具bashtimedatectl status # 查看当前时间同步状态 5.2 常见故障排查问题现象可能原因解决方法NTP 无法同步防火墙阻止 UDP 123 端口开放防火墙规则:sudo ufw allow 123/udp时钟偏差持续增大NTP 服务器选择不当更换更可靠的 NTP 服务器(如阿里云、腾讯云 NTP)PTP 同步失败网卡不支持硬件时间戳更换支持 IEEE 1588v2 的网卡闰秒调整导致服务异常应用程序未正确处理闰秒升级应用或配置 NTP 服务忽略闰秒:tinker panic 0六、时钟同步的安全考量6.1 时钟攻击类型拒绝服务攻击:通过发送虚假 NTP 报文扰乱时钟同步重放攻击:利用过时的时间戳进行恶意操作时间偏移攻击:通过调整时钟影响事务顺序6.2 安全增强措施启用 NTP 认证:在ntp.conf中配置密钥认证initrustedkey 1 2 3 key 1 md5 your-secret-key使用 Chrony 替代传统 NTP:Chrony 对网络抖动更具弹性部署本地 NTP 服务器:减少对公共 NTP 服务器的依赖监控时钟异常:设置阈值监控时钟偏移,异常时触发告警七、总结与最佳实践按需选择同步方案:普通应用:使用 NTP(如 chrony)即可满足需求高精度场景:部署 PTP 并使用专用网卡混合方案:NTP 作为基础同步,PTP 用于关键节点配置建议:优先选择地理位置近的 NTP 服务器至少配置 3 个不同层级的 NTP 服务器定期检查硬件时钟电池状态监控与应急:建立时钟偏移监控系统(阈值建议:±50ms)制定时钟异常应急预案,包括手动同步流程
  • [技术干货] 永不休眠:Linux 守护进程的工作原理-转载
    前言在 Linux 系统中,守护进程(Daemon)是指那些在后台运行的进程,通常不与用户直接交互,而是提供某种服务或者完成系统任务。守护进程通常在系统启动时启动,并在系统运行时持续存在。进程信息字段含义字段    含义    用途    示例PPID    父进程 ID    表示当前进程的父进程的进程 ID。帮助追踪进程的父子关系。    23449PID    进程 ID    唯一标识当前进程。通过 PID 可以管理进程。    24284PGID    进程组 ID    标识当前进程所在的进程组。用于管理相关进程。    24284SID    会话 ID    标识当前进程所属的会话 ID。会话是共享同一个控制终端的进程集合。    23449TTY    终端类型    指当前进程所使用的终端设备。    pts/0TPGID    控制终端的进程组 ID    标识该进程所属的控制终端的进程组。    24284STAT    进程状态    表示进程当前的状态。常见状态包括休眠、运行、停止等。    S+UID    用户 ID    表示当前运行该进程的用户的标识符。    1000TIME    进程占用的 CPU 时间    显示该进程使用的 CPU 时间,格式为“分钟:秒”。    0:00COMMAND    执行的命令    显示当前进程正在执行的命令或程序。    sleep 100进程组ID(PGID)PGID(进程组 ID) 表示进程所在的进程组的标识符。在该输出中,所有进程的 PGID 都是 25091,说明这些进程都属于同一个进程组。这个进程组的 leader(进程组长) 是 PID 25091(它的 PGID 值是它自己的 PID),也就是说,这个进程(PID 25091)是该进程组的领导者。该进程组中的其他进程(例如 PID 25092、25093)都是由该进程创建的,它们与进程组共享同一个 PGID。为什么 PGID 相同?进程组是一个将多个相关进程组织在一起的机制。在这个例子中,sleep 100 进程的多个实例(PID 25091、25092、25093)都属于同一个进程组,它们的 PGID 是相同的。这种设计允许操作系统同时管理多个进程,比如向整个进程组发送信号,进行进程组控制等。会话ID(SID)在这里面我们创建了三个会话,SID 分别为 22449、22403、25410分别控制着不同的终端( TTY)在此会话中我们执行观察进程 sleep 的 SID = 24003:所有显示的 sleep 进程的 SID 都是 24003。这表明所有这些 sleep 进程属于同一个会话,即它们共享相同的会话 ID。SID 表示这些进程是同一个会话中的进程,会话中的所有进程都具有相同的 SID。bash : 会话的领导者:会话的 SID 通常等于会话的 leader(会话领导进程)的 PID。因此,SID = 24003 表明会话中的领导进程的 PID 是 24003。这个进程的 PID 会作为会话的 SID。这些 sleep 进程的 SID 为 24003,表明它们是由 PID = 24003 启动的进程所创建,并且它们共享该会话。前后台进程定义前台进程 是那些直接与用户交互并占用当前终端的进程,通常它们会接收用户输入并显示输出。#include <iostream>                                                                     #include <unistd.h>        using namespace std;        int main ()    {        while(1)        {            cout << "hello proc "<<endl;            sleep(1);        }        return 0;    }执行代码在前台进程,执行指令(./文件名):后台进程 则是在后台运行的进程,它们不直接与用户交互,不占用终端,通常用于执行长时间运行的任务,如守护进程或定时任务。如果在后台进程的执行的指令就是:./文件名 &后台进程的特点不占用终端:后台进程不会占用当前的控制终端(即用户的输入输出设备)。当你将一个进程放入后台运行时,终端仍然可以用来执行其他命令。不与用户交互:后台进程不直接与用户交互,因此它不会阻塞终端的使用。例如,你可以在后台运行一个长时间的下载任务,而继续在前台执行其他任务(如编辑文件、查看文件等)。异步执行:后台进程通常是异步执行的,即它们独立于当前正在运行的进程执行,不会干扰前台进程的执行前后台进程的操作jobs显示后台作业当前证明有11个任务在同时跑。fg将后台作业带回前台fg -进程编号分析:后台运行程序:执行了 ./a.out &,该命令将程序 a.out 在后台运行,并返回了进程号 [1] 27998,表示后台程序正在运行。查看输出:输入了 hello proc,终端多次显示了这个字符串,可能是 a.out 程序的输出内容。调到前台:使用 fg 1 将后台运行的程序(作业号 1)调到前台,使其开始在前台运行。此时可以看到程序输出持续显示。终止程序:按下 CTRL + C(中断信号),终止了在前台运行的程序。bg将后台作业带回前台bg -进程编号分析:./a.out:执行这个命令来运行已编译的程序 a.out。程序打印了三次 hello proc 到终端。^Z:这是一个键盘快捷键,用来暂停(停止)正在运行的程序。程序被挂起,并显示消息 [1]+ Stopped,表示该进程已暂停。bg 1:bg 命令用于将停止的进程(此处为作业号 1)恢复到后台继续运行。这样程序就可以继续执行,而不会占用终端。./a.out &:程序现在在后台运行,输出继续显示 hello proc。守护进程守护进程(Daemon)是计算机中在后台运行的一个长期存在的进程,通常在操作系统启动时自动启动,并在系统关闭时停止。它不与用户直接交互,而是负责执行一些后台任务,如定时任务、系统监控、服务提供等。守护进程的特点后台运行:守护进程不与终端直接交互,它们在后台运行,并且不会因用户登出而终止。、自启动和长期运行:大多数守护进程在系统启动时自动启动,并且通常会一直运行直到系统关闭或守护进程被手动停止。与终端分离:守护进程通常会与终端或控制台分离,这意味着它们不依赖于任何终端会话,甚至在用户退出登录后也会继续运行。编写守护进程#pragma once  // 防止该头文件被多次包含#include <iostream>      // 引入输入输出流库#include <unistd.h>      // 引入Unix标准函数库(比如fork, setsid等)#include <string>        // 引入C++标准字符串库#include <signal.h>      // 引入信号处理库(signal相关函数)#include <sys/types.h>   // 包含系统数据类型(pid_t等)#include <sys/stat.h>    // 引入文件状态和权限库#include <fcntl.h>       // 引入文件控制库const std::string nullfile = "/dev/null";  // 定义一个常量 nullfile,表示 Unix 系统中的空设备文件 /dev/nullvoid daemon(const std::string chdir = ""){    // 忽略一些常见的信号    signal(SIGCHLD, SIG_IGN);  // 忽略子进程结束信号(不需要等待子进程)    signal(SIGPIPE, SIG_IGN);  // 忽略管道破裂信号    signal(SIGSTOP, SIG_IGN);  // 忽略停止信号(通常用户发送的 Ctrl+Z)    // 将当前进程变为独立会话的领导者    if (fork() > 0)    {        // 父进程退出,子进程继续        exit(1);    }    setsid();  // 创建新的会话,脱离终端,成为会话领导者    // 如果传入了工作目录路径,尝试更改目录权限    if (!chdir.empty())        chmod(chdir.c_str(), 0777);  // chmod 需要传递权限值参数,这里假设为 0777    // 打开 /dev/null 设备文件,以只读方式打开    int fd = open(nullfile.c_str(), O_RDONLY);    if (fd > 0)    {        // 将标准输入、输出和错误输出重定向到 /dev/null        dup2(0, fd);  // 将标准输入(fd 0)重定向到 /dev/null        dup2(1, fd);  // 将标准输出(fd 1)重定向到 /dev/null        dup2(2, fd);  // 将标准错误输出(fd 2)重定向到 /dev/null        close(fd);    // 关闭文件描述符    }}忽略异常信号:守护进程通常不会干扰终端信号,因此忽略了与子进程、管道破裂和停止信号相关的信号。脱离终端:通过 fork() 和 setsid() 创建一个新的会话,使得守护进程不再受控制终端影响。修改工作目录:尝试修改工作目录(但代码存在错误,应改为 chdir())。重定向输入输出:将标准输入、输出和错误输出重定向到 /dev/null,避免进程与终端交互。————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/Cayyyy/article/details/148642085
  • [技术干货] 【Linux我做主】进度条小程序深度解析-转载
    前言​ 在Linux系统编程中,控制台交互的视觉反馈是提升用户体验的重要环节。进度条作为经典的人机交互组件,在软件安装、文件传输、数据处理等场景中具有广泛应用价值。本文将以Linux环境下C语言实现的进度条程序为切入点,深入探讨控制台输出控制、缓冲区机制、函数指针应用等核心技术。通过三个版本迭代的代码解析(基础版/V1、模拟多任务版/V2),读者将掌握从原理到实践的完整知识链路。前置知识回车换行(CR/LF)的深度解析在C语言中,我们使用\n来表示换行,这其实是C语言帮我们做了处理。实际上,回车和换行其实是两个动作。C语言中用\n来表示回车和换行。以上图片深入阐述了回车和换行概念以及和区别。\r:回车,光标回到当前行的最开始。C语言中用\r来表示仅回车。\n:换行,光标垂直向下移动一行,叫做换行。历史渊源与技术规范ASCII规范定义:CR(Carriage Return,\r,ASCII 13)将光标移动到行首LF(Line Feed,\n,ASCII 10)使光标下移一行Windows系统采用CRLF组合实现新行操作Linux/Unix系统使用LF单独完成换行在进度条/倒计时中的应用printf("%-3d\r", cnt);  // 关键代码示例1此代码实现:使用%-3d保证3字符宽度左对齐3表示该值位宽为3,C语言默认为右对齐,用-来表示左对齐。\r使每次输出回到行首配合fflush(stdout)强制刷新缓冲区实现原地更新的数字倒计时效果缓冲区机制的全面剖析缓冲区引入先看如下两个例子:有换行符\n时显示器直接刷新无换行符时,像是先执行了sleep再执行printf经分析得知:C语言中一定是按顺序执行代码的,因此一定是printf先执行,再执行sleep。那么,在sleep期间,printf函数一定已经执行完了。那么,sleep期间,hello wolrd在哪里?综上,hello wolrd一定是被保存起来了!!!保存hello wolrd,必然 需要一块内存空间,这块内存空间被称为缓冲区。缓冲区就是由C语言维护的一段内存。C程序运行时,默认会帮助我们打开三个输入输出流stdin:标准输入stdout:标准输出(默认是显示器)stderr:标准错误C语言的默认行为是在程序退出时,再刷新缓冲区。printf打印消息,是向stdout输入,消息暂存在了stdout中,当我们不想让消息暂存在缓冲区中,而是想直接刷新stdout的内容到显示器时,可以使用fflush刷新,默认stdout在程序结束时刷新,使用fflush可以强制进行刷新输入输出流。以下:此时printf("hello world")没有\n使用fflush(stdout)强制将缓冲区中的数据刷新到显示器上通过以上两个例子,我们已经对缓冲区有了一个大概的理解了。缓冲类型对比缓冲类型 特征 典型应用场景全缓冲 缓冲区满时刷新 文件操作行缓冲 遇到换行符或缓冲区满时刷新 终端输出(默认)无缓冲 立即输出 标准错误流stderr进度条开发中的关键控制手动刷新机制:fflush(stdout);  // 强制立即输出缓冲区内容1进度条实现以小见大——倒计时倒计时最终效果演示代码如下:void test() {    //实现一个倒计时    int cnt = 100;    while (cnt >= 0) {        // printf("%-2d\r", cnt);//使用\r回车会导致三位数只刷新了两位数        printf("%-3d\r", cnt);  // %3d\r 可以实现在行的开头更新数字  -相当于反转  确保是左对齐        fflush(stdout);        --cnt;        sleep(1);    }    printf("\n");}int main() {    test();    return 0;}当前设置倒计时从100开始关于printf中的参数%-3d\r的解释%d的作用:表示输出数字cnt,用于显示倒计时3的作用:用于控制输出显示位宽为3,倒计时的数字是几位,位宽就设置为几。-的作用:设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用-实现左对齐。\r的作用:用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。使用fflush(stdout)将缓冲区内的数据立即刷新出来sleep(1)每隔一秒循环一次错误演示位宽不够带来的影响位宽小于数字的位数时,会出现数字残余的情况。由于显示器是字符设备,只会一个一个打印字符,123实际上是1 2 3三个字符连在一起表示的以下是从10开始计数的错误例子正确设置位宽即可解决。设置位宽后不反转带来的影响不用-进行反转会导致数字不靠左显示对于倒计时来说影响甚微,但靠右显示的话,会导致进度条从右向左加载!不使用\r回车带来的影响不使用\r会导致数字接连不断的出现,不符合倒计时的效果。总结回顾倒计时printf中的格式化控制参数缺一不可关于printf中的参数%-3d\r的理解%d表示输出数字cnt,用于显示倒计时3用于控制输出显示位宽为3,倒计时的数字是几位,位宽就设置为几。设置位宽后,C程序默认为右对齐,我们想让数字在当前行的最左侧显示,要用-实现左对齐。\r用于实现仅回车,回到当前行的开始,覆盖打印实现倒计时的效果。使用fflush(stdout)将缓冲区内的数据立即刷新出来进度条架构设计组件关系图main函数模拟downLoadprogressbar回调initBar初始化bar数组操作核心数据结构#define NUM 102       // 缓冲区长度(含终止符)#define BODY '='      // 进度条主体字符#define HEAD '>'      // 进度头部指示符#define TOP 100       // 进度最大值typedef void (*callback_t)(int);  // 标准化回调接口 利用函数指针实现回调。版本迭代解析v1版本悟原理progressBar.h头文件#pragma once#include <stdio.h>//缓冲区长度(含终止符)#define NUM 102    // 102 表示字符数组的长度 0-100 101个字符  末尾是\0, 因此大小是 102#define BODY '='      // 进度条主体字符#define HEAD '>'      // 进度头部指示符#define TOP 100       // 进度最大值extern void progressbar(int speed);  // extern 声明外部变量时必须加上  函数声明可加可不加#pragma once:防止头文件重复包含#define NUM 102 :102 表示字符数组的长度,0-100,共101个字符 ,字符串末尾是\0, 因此数组长度是102#define BODY '=':定义进度条的形体为=#define HEAD '>':定义进度条的头部为>#define TOP 100:定义进度条的区间长度,暂定为100通过宏的方式定义,可以方便的实现进度条样式的修改!progressBar.c源文件#include "progressBar.h"#include <string.h>#include <unistd.h>char bar[NUM] = {0};const char* label = "|/-\\";void progressbar(int speed) {    memset(bar, '\0', sizeof(bar));  //整体将字符串设为\0,可以方便的输出    int len = strlen(label);    int cnt = 0;    while (cnt <= TOP) {        //没有\n 就没有立即刷新,因为显示器默认是行刷新        printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len]);        //预留出100空间,100s 默认是右对齐,进度条是反的, 用-100s解决        //用变长的字符串,循环覆盖输出,实现进度条光标移动的效果        //给进度条跑  %%显示百分号        fflush(stdout);        bar[cnt++] = BODY;  //更改进度条的风格        if (cnt < TOP)            bar[cnt] = '>';        // sleep(1);        usleep(speed);  // 100000微秒,用usleep实现更快的跑完    }    printf("\n");  //防止命令行提示符影响效果}char bar[NUM] = {0}:进度条主体使用长度不断改变的字符串来实现初始化为{0},这样就不用手动设置\0终止符了,用%s输出变化的字符串从0-100,恰好是char bar[NUM] = {0}字符数组中每个字符的下标每次循环内cnt会++利用cnt将0-100每个位置的字符都设置为进度条主体=。随着cnt++,数组内字符串的长度也在增长,再通过%s\r回车数组字符串,从而实现进度条的动态增长const char* label = "|/-\\"通过0-4五个字符的顺序循环输出,实现光标闪动的效果。printf("[%-100s][%d%%][%c]\r", bar, cnt, label[cnt % len])[%-100s]-:确保进度条不反方向增长100s:预留出100长度,供进度条字符串填充[%d%%]:%d:输出进度数字cnt%%:控制输出字符%[%c]:控制循环顺序输出|/-\\中的每个字符,实现光标闪动的效果用cnt % len实现0-4的循环\r:实现每次从行首开始输出,实现进度条的动态增长!fflush(stdout):每次printf过后,刷新缓冲区usleep(speed):usleep结合函数参数speed,实现进度条时长的控制main.c调用#include <unistd.h>#include "progressBar.h"int main(){    progressbar(20000);return 0;}效果如下:V2版本求拓展进度条最常见的适用场景就是在下载任务中,具体的运行方式应该是:下载任务向进度条函数传递下载任务已完成的进度百分比,进度条函数根据比率动态显示因此下载任务内一定要反复调用进度条程序。我们可以传入进度条函数的地址进行实现,也就是函数指针的回调函数。progressBar.h头文件#pragma once#include <stdio.h>//缓冲区长度(含终止符)#define NUM 102    // 102 表示字符数组的长度 0-100 101个字符  末尾是\0, 因此大小是 102#define BODY '='      // 进度条主体字符#define HEAD '>'      // 进度头部指示符#define TOP 100       // 进度最大值typedef void (*callback_t)(int);  //函数指针类型extern void progressbar(int rate);  // extern 声明外部变量时必须加上  函数声明可加可不加extern void downLoad(callback_t cb);extern void initBar();typedef void (*callback_t)(int) :callback_t是函数指针类型,我们可以拆解帮助理解:void (*)(int):其中:* :表示这是一个指针,且必须用括号包裹。否则会被解析为函数返回指针(如 void *func(int) 是返回 void* 的函数)(*):表示这是一个函数指针void:表示该函数的返回值为void,(int):表示该函数的参数类型为一个inttypedef void (*callback_t)(int)可以理解为typedef void (*)(int) callback_ttypedef:在typedef中,参数名会被省略,只保留类型。因此可以拆解为:typedef void (*)(int) callback_t:将void (*)(int)类型的指针定义为类型别名 callback_tprogressBar.c源文件#include "progressBar.h"#include <string.h>#include <unistd.h>// v2 应用char bar[NUM] = {0};const char* label = "|/-\\";void initBar() {    memset(bar, '\0', sizeof(bar));}void progressbar(int rate) {    if (rate < 0 || rate > 100)        return;    int len = strlen(label);    //用单个字符循环覆盖输出实现光标闪动    printf("[%-100s][%d%%][%c]\r", bar, rate, label[rate % len]);    fflush(stdout);    bar[rate++] = BODY;  //更改进度条的风格    if (rate < TOP)        bar[rate] = HEAD;}优化亮点:全局状态保存实现多任务支持initBar()提供重置进度条的能力动态头部指示符(>)增强视觉效果增加非法进度的判断if (rate < 0 || rate > 100) returnmain.c模拟多任务调度实现#include <unistd.h>#include "progressBar.h"// 模拟下载任务调用进度条void downLoad(callback_t cb) {     int total = 1000;    int curr = 0;  //目前curr需要从0开始    while (curr <= total) {        //进行某种下载任务,模拟时使用手动控制速度        usleep(50000);        int rate = curr * 100 / total;        cb(rate);  // 传入参数,回调展示进度        curr += 10;    }    printf("\n");  //防止命令行提示符影响效果}int main() {    printf("downLoan 1:\n");    downLoad(progressbar);    initBar();    printf("downLoan 2:\n");    downLoad(progressbar);    initBar();    printf("downLoan 3:\n");    downLoad(progressbar);    initBar();    return 0;}通过任务调用进度条,外部程序通过回调,调用进度条void (callback_t)(int),callback_t是函数指针类型。相当于typedef void (*)(int) callback_t,把callback_t变成函数指针类型的别名关键技术:函数指针实现回调机制速率换算算法(curr * 100 / total)时间控制(usleep微秒级延时)char bar[NUM]为全局数组,每次模拟download后,需initbar()函数重置保证独立性模块化设计,确保了可维护性。最终效果演示Makefile配置要点# 依赖关系# 依赖方法progressBar:*.c  @gcc $^ -o $@# clean和上面是独立的.PHONY:clean   clean:@rm -f progressBar结语关键知识点回顾控制台输出控制:回车符与换行符的灵活运用缓冲区机制:行缓冲特性与强制刷新策略可视化设计:进度条元素(主体、头部、百分比)的协同软件工程实践:模块化设计、回调机制、多任务支持扩展应用场景大数据处理进度监控嵌入式系统固件更新自动化测试进度反馈游戏加载界面优化​ 通过本文对Linux下C语言进度条程序的深度解析,我们系统性地掌握了控制台交互的核心技术。从回车换行符的底层原理到缓冲区刷新机制,从进度条动态显示到模块化设计,每一步都揭示了控制台可视化反馈的实现精髓。通过函数指针与回调机制的精妙配合,我们实现了多任务场景下的独立进度管理,展现了C语言在系统编程中的强大灵活性。​ 本项目的核心价值在于:不仅实现了基础的进度展示功能,更通过版本迭代演进,示范了软件开发的渐进式优化思路。在性能层面,未来可结合纳秒级延时控制与多线程安全机制提升精度;在交互层面,可考虑引入ANSI色彩代码或动态图标可进一步增强用户体验。————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/2301_80064645/article/details/147645600
  • [技术干货] 【Linux】网络基础-转载
    一、网络的发展独立模式产生背景:在计算机发展的早期阶段,计算机系统主要以单机形式存在,每台计算机都是一个独立的个体,不与其他计算机进行数据通信和资源共享,这就是独立模式,当时的计算机主要用于科学计算和简单的数据处理,用户只能在本地使用计算机的硬件和软件资源特点独立性:每台计算机独立运行,有自己的处理器、存储器、输入输出设备等,数据和程序都存储在本地,不依赖其他计算机资源有限性:用户只能使用本地计算机的资源,如本地的硬盘空间、内存、打印机等,无法共享其他计算机的资源,资源利用效率较低功能局限性:主要用于完成本地的计算任务,如数值计算、文本处理等,无法实现多台计算机之间的协同工作和信息共享局域网LAN产生背景:随着计算机应用的逐渐普及,人们开始意识到多台计算机之间进行通信和资源共享的需求,于是局域网应运而生,20世纪70年代,一些科研机构和企业开始尝试将多台计算机连接在一起,形成一个小型的网络,以实现文件共享、打印机共享等功能特点地理范围有限:通常覆盖范围在几十米到几公里以内,如一个办公室、一栋建筑物或一个校园等高数据传输速率:一般能提供较高的数据传输速率,通常在10Mbps到1000Mbps甚至更高,能够快速地传输数据、文件和多媒体信息低误码率:由于传输距离较短,信号传输质量较好,误码率通常较低,一般在10⁻⁸到10⁻¹¹之间,保证了数据传输的准确性和完整性共享资源丰富:可以实现计算机之间的文件共享、打印机共享、数据库共享等,还能支持用户之间的信息交流和协同工作,如共享文档编辑、视频会议等易于管理和维护:网络规模相对较小,设备数量相对较少,因此网络的管理和维护相对简单,如网络配置、用户管理、故障排查等都比较容易实现广域网WAN产生背景:随着计算机网络应用的不断拓展,人们需要将不同地区、甚至不同国家的计算机连接起来,实现更广泛的信息交流和资源共享,广域网便在此背景下迅速发展起来,20世纪80年代,随着通信技术的进步,如光纤通信、卫星通信等的应用,使得远距离的计算机通信成为可能,广域网得到了快速发展特点地理范围广:覆盖范围可以跨越城市、国家甚至全球,能够连接不同地区的局域网和计算机系统,实现全球范围内的信息传输和资源共享多种通信介质:由于传输距离远,需要使用多种通信介质来实现数据传输,如电话线、光纤、卫星通信等,以满足不同距离和环境的通信需求数据传输速率差异大:不同的广域网技术和通信介质提供的数据传输速率有所不同,从较低的拨号上网速率(如56Kbps)到高速的光纤网络速率(如10Gbps甚至更高)都有,整体数据传输速率相对局域网较低,但随着技术的发展,高速广域网连接也越来越普及复杂的网络结构:由多个节点交换机、路由器和通信线路组成,网络结构复杂,涉及到不同地区的网络设备和通信链路的互联,需要采用复杂的路由算法和网络协议来实现数据的准确传输和网络的高效运行可扩展性强:能够容纳大量的计算机和局域网接入,具有很强的可扩展性,可以根据用户需求不断增加网络节点和扩展网络覆盖范围,以满足不断增长的通信和业务需求二、认识网络协议协议就是一种由某一方制定出来的,大家共同遵守的标准1、OSI七层模型OSI七层模型是一个开放性的通信系统互联参考模型,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,其主要的功能就是帮助不同类型的主机实现数据传输,它最大的优点就是将服务、接口和协议这三个概念明确地区分出来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯这是早期的标准,我们现在使用更加广泛的是TCP/IP五层模型层    名称    主要功能    协议及设备举例7    应用层    为应用程序提供网络服务,直接与用户和应用程序交互,负责处理特定的应用程序协议,如文件传输、电子邮件、远程登录等    HTTP、FTP、SMTP、DNS;网关6    表示层    处理数据的表示、转换和加密等,确保不同系统之间能够正确地理解和处理数据,包括数据格式转换、数据加密和解密、数据压缩和解压缩等功能    ASCII、JPEG、SSL/TLS5    会话层    建立、维护和管理会话,负责在不同主机上的应用程序之间建立、维持和终止会话连接,并提供会话同步和检查点功能,以确保数据传输的可靠性和连续性    NetBIOS、RPC4    传输层    提供端到端的通信服务,负责在不同主机上的应用程序之间进行数据传输,确保数据的可靠传输和流量控制,主要功能包括分段和重组数据、确认和重传、流量控制等    TCP、UDP;四层交换机3    网络层    负责网络之间的数据路由和寻址,将数据从源主机传输到目标主机,主要功能包括寻址、路由选择、分组转发等    IP、ICMP、IGMP;路由器2    数据链路层    将物理层接收到的信号转换为数据帧,并进行错误检测和纠正,负责在相邻节点之间传输数据帧,主要功能包括成帧、差错控制、流量控制、介质访问控制等    Ethernet、PPP、HDLC;网桥、交换机1    物理层    负责处理物理介质上的信号传输,定义了设备与物理介质之间的电气、机械、功能和规程特性,包括电缆、连接器、信号的传输与接收等    RS-232、RJ45、光纤;集线器、中继器2、TCP/IP五层模型TCP/IP五层模型从下到上依次为物理层、数据链路层、网络层、传输层、应用层层    名称    主要功能    协议及设备举例5    应用层    为用户提供网络应用服务,直接与用户和应用程序交互,负责处理特定的应用程序协议,如文件传输、电子邮件、远程登录等    HTTP、FTP、SMTP、DNS、SNMP;网关4    传输层    提供端到端的通信服务,负责在不同主机上的应用程序之间进行数据传输,确保数据的可靠传输和流量控制,主要功能包括分段和重组数据、确认和重传、流量控制等    TCP、UDP;四层交换机3    网络层    负责网络之间的数据路由和寻址,将数据从源主机传输到目标主机,主要功能包括寻址、路由选择、分组转发等    IP、ICMP、IGMP、ARP、RARP;路由器2    数据链路层    将物理层接收到的信号转换为数据帧,并进行错误检测和纠正,负责在相邻节点之间传输数据帧,主要功能包括成帧、差错控制、流量控制、介质访问控制等    Ethernet、PPP、HDLC、SLIP;网桥、交换机1    物理层    负责处理物理介质上的信号传输,定义了设备与物理介质之间的电气、机械、功能和规程特性,包括电缆、连接器、信号的传输与接收等    RS-232、RJ45、光纤、同轴电缆;集线器、中继器由于物理层我们考虑地比较少,所以有时候又把第一层和第二层看作一层,叫网络接口层,这也是有说法说TCP/IP四层模型的依据下图是操作系统结构图和TCP/IP五层模型相对应的图三、网络传输流程在网络传输时数据在每一层都要添加报头,以让该层知道这个数据可以在本层被解析本层的整个数据叫做报文,报文=报头+有效载荷发送数据时自上而下,也就是从应用层到链路层(硬件),由硬件发出解析数据时自下而上,也就是从链路层(硬件)到应用层,由硬件接收每个计算机上的网络模型一致,对应的层与层的协议是一致的,这也是保证我们能够正确解析报文的原因之一封装:几乎任何层的协议,都要提供将报头和有效载荷分离的能力分用:几乎任何层的协议,都要在报头中提供决定将自己的有效载荷交付给上层哪一个协议的能力1、同网段通信我们直接看图,对称分为两边,假设一个情境,左边用户1用着1号电脑(客户)给用着2号电脑的用户2(服务器)发了一个hello world,首先信息要到应用层,给上报头之后传到传输层,给上报头,以此类推到达链路层,以太网驱动程序(在网卡上)通过以太网的连接将数据发送到用户2(服务器)的网卡上,然后向上解析,通过报头找到对应的层,然后丢掉报头,最后解析出发出的内容2、跨网段通信以太网和令牌环是两种不同的局域网技术以太网的成本低,设备广泛普及,它在数据传输时的特点是多点接入、竞争式传输,要先监听网络介质是否空闲,空闲再发数据,如果两个设备同时发送数据会发生冲突,设备会检测到冲突并在随机时间后重试令牌环网设备较为昂贵,基本上已经被淘汰,它在数据传输时的特点是顺序接入、非竞争式传输,令牌在环形网络中按固定方向传递,只有持有令牌的设备才能发送数据,发送完成后,该设备会将令牌传递给下一个设备,避免了数据冲突,这里的令牌类似于我们的互斥锁我们这里只是想演示出不同类型的局域网之间的跨网通信的可行性,彰显网络设计结构的强大首先还是类似上面的,一个用户发送一个hello world,信息向下而行,发送到以太网当中,路由器连接在以太网中,通过以太网驱动程序将该信息捕捉,然后去掉以太网报头转移到IP层,再将有效载荷加上令牌环网报头通过令牌环驱动程序发送到令牌环网中(路由器只有第一层和第二层),然后被另一个用户的令牌环驱动程序接收并向上传递,最终传递到用户手中,这样就实现了不同用户跨网段的交流,以后所有局域之间的网络就算是不同的,我们通过路由器也是可以将用户发送的数据获取到,所以IP协议通过工作在IP层的路由器屏蔽了底层网络的差异化四、以太网通信1、MAC地址MAC 地址是固化在网络设备硬件(如网卡)中,用于在数据链路层唯一标识网络设备的一组物理地址,在相同局域下MAC地址保持它的唯一性2、通信原理以太网驱动程序发送数据的时候所带的紫色四角星报头,其实是一个结构体,实际上,几乎所有层的报头都是结构体,偶尔在轻量化的网络通信中报头的设计可能是一个类似int的内置类型,这个结构体中有两个信息,一个是发送数据网卡的MAC地址,一个是将要接收数据网卡的MAC地址,数据在以太网中是共享的,但是通过这个报头就可以实现定向发送,只有字段相同的网卡才可以接收该数据————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/s_little_monster/article/details/145917125
  • [问题求助] 【紧急问题求助】麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错Unexpected error Ambari repo file path not set for current OS.
    麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错,查看 cat /var/log/ambari-server/ambari-server-command.log 信息如下:INFO 2025-05-19 18:06:20,382 ambari-server.py:911 - loglevel=logging.INFOINFO 2025-05-19 18:06:20,385 serverSetup.py:1151 - Setup ambari-server.ERROR 2025-05-19 18:06:21,770 ambari-server.py:1015 - 'Fatal exception: Failed to create user. Exiting., exit code 1'Traceback (most recent call last):  File "/usr/sbin/ambari-server.py", line 998, in main    action_obj.execute()  File "/usr/sbin/ambari-server.py", line 78, in execute    self.fn(*self.args, **self.kwargs)  File "/usr/lib/ambari-server/lib/ambari_server/serverSetup.py", line 1178, in setup    raise FatalException(retcode, err)FatalException: 'Fatal exception: Failed to create user. Exiting., exit code 1'具体操作报错截图如下:求助各位大佬如何解决,感谢。
  • [问题求助] 调研下,云股东们,开发一款Linux 服务器的桌面可视化管理工具有没有市场前景
    通过 SSH 协议,我们开发了一款可视化桌面式交互的服务器管理工具 GMSSH 。与市面上常见的传统管理后台不同,我们采用前端技术打造了一套桌面的交互式服务器管理工具。现在想调研下,例如如果你使用这个工具,你想要什么功能,或者什么建议和意见。或者你看不看好这个方向服务器连接数据加密传输,系统不做任何形式的存储 。 目前服务器部署在境外,防止被人恶意使用。首次初始化可能会需要一点时间目前是云版,只是为了能够快速根据大家的反馈去更新迭代我们的产品。而并不是我们只是云版本,后面会出客户端。(如果不放心,也可以点击体验地址体验服务器,或者加我 15195951508 ,我发给你一台高性能服务器体验)欢迎大家前往体验,并提出建设性建议。可直接浏览器搜索gmssh官网,点击在线体验功能特色极强的可视化桌面:桌面交互设计、直观的界面交互代替复杂的命令操作SSH 远程连接:通过 SSH 安全连接到远程服务器执行命令、无需放开额外端口。AI 问答:在线 AI 问答,未来接入 MCP 实现服务器自动化运维架构简单,无需安装:无需在服务器安装,直接通过 SSH 连接服务器即可使用。技术栈后端:Golang前端:Vue.js通信协议:SSH 协议、SSH 隧道转发后续规划应用中心:便捷地管理服务器各个中间件,环境等、以及各色各样的业务应用(财务、管理、分析等);开发者中心:一键创建自己的应用,人人都是开发者;AI 自动化:交互式 MCP 问答,实现 AI 自动化运维服务器;客户端版本:推出客户端版本,消除大家对隐私相关的顾虑;开源:产品正式成熟后在 github 开源核心代码、并提供私有化部署解决方案;批量管理:支持批量管理服务器、发送服务器命令执行;内嵌浏览器:桌面版内嵌浏览器,试用服务器的网络访问网站!
  • [技术干货] Linux 指令初探:开启终端世界的大门-转载
    前言当我们初次接触 Linux,往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而,正是这些看似晦涩的命令,构建了服务器、嵌入式系统乃至云计算的世界。本篇将带你从最基础的 Linux 指令开始,逐步揭开命令行的神秘面纱。从 ls 到 cat,从文件浏览到简单操作,每一条指令都是通往操作系统本质的阶梯。ls 指令语法: ls [选项] [目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:• -a 列出目录下的所有文件,包括以 . 开头的隐含文件。• -d 将目录像文件一样显示,而不是显示其下的文件。 如:ls ‒d 指定目录• -i 输出文件的 i 节点的索引信息。 如 ls ‒ai 指定文件• -k 以 k 字节的形式 表示文件的大小。ls ‒alk 指定文件• -l 列出文件的详细信息• -n 用数字的 UID,GID 代替名称。 (介绍 UID, GID)• -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。(目录类型识别)• -r 对目录反向排序• -t 以时间排序• -s 在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)• -R 列出所有子目录下的文件。(递归)• -1 一行只输出一个文件。指令可以串起来使用,空格+ -也可以用指令的缩写,像ll ,la之类的,ll就是ls -l -a -F的缩写,我们可以用*alias命令+指令查看 alias llpwd 命令语法: pwd功能:显示用户当前所在的目录cd 指令语法: cd 目录名功能:改变工作目录。将当前工作目录改变到指定的目录下我们通过cd命令进入指定的目录,然后用pwd查看我们是否进入成功cd -返回上一个目录。cd ~进到根目录Linux理论知识:路径的认识对于Linux中的目录,其实相当于文件夹,对于文件夹下文件的操作,不是对内容就是对属性操作,通俗来讲,文件=内容+属性。Linux的文件结构,是一颗从根目录/开始的一个多叉树!• Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件• 其中普通文件一定是目录树的叶子节点• 目录可能是叶子(空目录), 也可能是路上节点任何一个目录即使是空的额,系统也会生成.和..• 理解路径存在的意义: 树状组织方式,都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案来进行定位文件。其中任何一个节点,都只有一个父节点,所以,从根目录开始,定位指定文件,路径具有唯一性。• 绝对路径:一般从/开始,不依赖其他目录的定位文件的方式• 相对路径:相对于当前用户所处目录,定位文件的路径方式• 绝对路径一般不会随着用户的路径变化而丧失唯一性,一般在特定服务的配置文件中经常被使用• 相对路径因为它的便捷性,一般在命令行中使用较多每一次新建一个用户都会在/home目录下为新用户创建新的工作目录,目录以新用户名称命名root用户在安装操作系统的时候,就已经内置了工作目录: /root touch 指令Linux理论知识:文件类型的认识🗂 常见文件类型及标识字符    类型名称    说明-    普通文件(regular file)    文本、二进制、脚本等d    目录(directory)    文件夹l    符号链接(symbolic link)    指向其他文件的快捷方式b    块设备文件(block device)    硬盘、U 盘等块设备c    字符设备文件(character device)    串口、键盘等字符设备s    套接字(socket)    进程间通信使用p    命名管道(named pipe / FIFO)    进程间通信方式之一语法: touch [选项]... 文件...功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。常⽤选项:• -a : change only the access time• -c : change only the modification timemkdir 指令语法: mkdir [选项] dirname...功能:在当前目录下创建一个名为 “dirname”的目录常⽤选项:• -p/--parents: 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录我们在jinmo用户下创建了一个test文件夹,在该文件夹中也创建了test.c文件tree命令是一个递归以树状结构显示指定目录的命令rmdir 指令 && rm 指令rmdir是一个与mkdir相对应的命令,mkdir是建立目录,而rmdir是删除命令语法: rmdir [-p] [dirName]适用对象:具有当前目录操作权限的所有使用者功能:删除空目录常⽤选项:• -p 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。当目录不为空时,不能删除rm 命令可以同时删除文件或目录语法: rm [-f-i-r-v] [dirName/dir]适用对象:所有使用者功能:删除文件或目录常用选项:• -f 即使文件属性为只读(即写保护),亦直接删除• -i 删除前逐一询问确认• -r 删除目录及其下所有文件echo命令常用用法1.输出普通字符串2.输出重定向到文件,如果不存在,则新建,存在则覆盖(>)的用法补充: >>追加重定向man 指令Linux的命令有很多参数,我们不能全记住,可以通过查看联机手册获取帮助可语法: man [选项] 命令常⽤选项• -k 根据关键字搜索联机帮助• num 只在第num章节查找• -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用a选项,当按下q退出,他会继续往后面搜索,直到所有章节都搜索完毕解释一下:man手册分为9章(不同系统可能会有差别)• 1 是普通的命令• 2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)• 3 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件• 4 略• 5 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义• 6 是给游戏留的,由各个游戏自己定义• 7 是附件还有一些变量,比如像environ这种全局变量在这里就有说明• 8 是系统管理用的命令,这些命令只能由root使用,如ifconfig• 9 略 cp 指令语法: cp [选项] 源文件或目录 目标文件或目录功能: 复制文件或目录说明:• cp指令用于复制文件或目录• 如同时指定两个以上的文件或目录,且最后的目的地是⼀个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中常⽤选项• -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在• -i 或 --interactive 覆盖文件之前先询问用户• -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理 mv 指令mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files,经常用来备份文件或者目录语法: mv [选项] 源文件或目录 目标文件或目录功能:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。常⽤选项:• -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖• -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!如果当前路径存在同名文件,改名前可以添加i选项,让系统提出警告供用户做选择mv整个目录cat 指令语法: cat [选项] [文件]功能: 查看目标文件的内容常⽤选项:• -b 对非空输出行编号• -n 对输出的所有行编号• -s 不输出多行空行命令行构建多行文本加cat测试行号输出测试-n 对输出的所有行编号 测试 -s 不输出多行空行,多行空行压缩成为一行more 指令语法: more [选项]功能:more命令,功能类似 cat常用选项:• -n 指定输出行数• q 退出moreless 指令• less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大• less 的用法比起 more 更加的有弹性,在 more 的时候,我们并没有办法向前面翻, 只能往后面看• 但若使用了 less 时,就可以使用[pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容• 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。语法: less [参数] 文件功能:less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。选项:• -i 忽略搜索时的大小写• -N 显示每行的行号• /字符串:向下搜索“字符串”的功能• ?字符串:向上搜索“字符串”的功能• n:重复前一个搜索(与 / 或 ? 有关)• N:反向重复前一个搜索(与 / 或 ? 有关)• q:quithead 指令head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然就是看档案的结尾。语法:head [参数]... [文件]...功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。选项:• -n<行数> 显示的行数tail 指令tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容.语法: tail 必要参数 [文件]功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。选项:• -f 循环读取• -n<行数> 显示行数举例:(简单讲解重定向和管道)两者结合区间查找结束语我们在这篇中熟悉了 Linux 指令的基础用法,但这只是冰山一角。命令行的世界远不止列出文件或复制粘贴这么简单。下一篇,我们将探索更多进阶命令,掌握文本流处理、用户权限、查找与过滤等技巧,真正开始 “像黑客一样使用终端”。👉 准备好进入下一个阶段了吗?走起!————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/2302_79376097/article/details/147016464
  • [技术干货] linux安装及管理程序-转载
    一 linux应用程序基础1.linux命令和应用程序的关系两者的区别如下:系统命令    应用程序文件位置    一般在/bin和/sbin目录中,称为shell内部指令    通常放在/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin等目录主要用途    用于辅助操作系统本身的管理    在操作系统之外另行安装,提供相对独立操作系统的功能适用环境    命令只在字符操作界面中运行    应用程序可能会用到图形界面运行格式    一般包括命令字,选项,参数    没有固定的执行格式2.linux应用程序的组成普通的可执行程序文件:一般保存在/usr/bin目录中,普通用户可执行服务器程序,管理程序文件:保存在/usr/sbin目录中,只有管理员可执行配置文件:保存在/etc目录中日志文件:保存在/var/log目录中关于应用程序的参考文档等数据:保存在/usr/share/doc//目录中执行文件及配置文件的man手册页:保存在/usr/share/man目录中3.软件包的封装模型常见的软件包封装类型如下RPM软件包:扩展名为“.rpm”,只能在使用rpm(RPM package manager,rpm软件管理器)机制的linux系统上安装,rpm软件包一般针对特定版本的操作系统量身定制,依赖性强。DEB软件包:扩展名".deb",只能在使用DPKG(DebianPackage,Debian包管理器)机制的linux’系统中安装,安装DEB软件需使用dpkg命令源代码软件包:这种软件包是程序员开发完成的原始代码,一般被制作成“.tar.gz”或".tar.bz2"等格式,安装源代码软件包需使用相对应的编译工具,如 Linux 中的 c语言编译器 gcc。附带安装程序的软件包:这种软件包的扩展名不一,但仍以 TarBa11 格式的居多。软件包中会提供用于安装的可执行程序或脚本文件,如 insta11.sh、setup 等,有时候会以“.bin”格式的单个安装文件形式出现。安装时只需运行安装文件就可以根据向导程序的提示完成安装操作。二使用rpm软件包管理工具1.rpm概述RPM软件包管理器通过建立统一的文件数据库,对在 Linux 操作系统中安装、卸载、升级的各种.rpm软件包进行详细的记录,并能够自动分析软件包之间的依赖关系,保持各应用程序在一个协调、有序的整体环境中运行。使用 RPM机制封装的软件包文件拥有约定俗成的命名格式,一般使用“软件名-软件版本-发布次数.操作系统类型,硬件架构类型.rpm”的文件名形式,如“bash-4.2.46-20.e17_2.x86_64.rpm”。其中硬件平台通常为“i386”或“i686”等,表示适用于 ntel 公司的处理器,“x86_64”表示适用于 64 位的系统查看光盘里的rpm包[root@localhost ~]# mkdir /media/cdrom[root@localhost ~]# mount /dev/cdrom /media/cdrom    //挂载光盘[root@localhost ~]# cd /media/cdrom/Packages/       //光盘rpm软件包位置1232.rpm命令的格式用法:rpm [选项…]rpm可以实现3类功能查询、验证 RPI 软件包的相关信息安装、升级、卸载 RPI 软件包。维护 RPI 数据库信息等综合管理操作。3.查询rpm软件包信息rpm 命令的查询功能主要通过“-q”选项实现,主要针对当前系统中已经安装的软件包;通过“-qp选项可以针对尚未安装的 RPM软件包文件进行查询。根据所需查询的具体项目不同,还可以为这两个选页指定相关的子选项。(1)查询已安装的rpm信息不带子选项的“-q”选项可用于查询已知名称的软件包是否已经安装,需要使用准确的软件名作为参数(可以有多个)。结合不同的子选项使用时,可以实现更具体的查询。常用的几个子选项如下所述。-qa:显示当前系统中以 RPM 方式安装的所有软件列表。-qi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息(-info)。-ql:显示指定的软件包在当前系统中安装的所有目录、文件列表(-list)。-qf:查看指定的文件或目录是由哪个软件包所安装的(一file)。对于系统中已经安装的各种软件程序,如果不知道其中某个软件的用途,同样可以通过rpm 工具进行查询。例如 ssh 软件,可以执行“rpm -qi openssh”命令来了解 ssh 软件包的摘要信息,具体操作如下:当需要查看某个软件包安装的目录和文件清单时,可以使用“-q1”选项。例如,执行“rpm -ql wget’命令可以列出 wget 软件包安装的目录和文件清单,具体操作如下:当需要知道系统中的某个文件是由哪一个软件包生成的时候,可以使用“-qf”选项。例如,执行以下操作可以获知 vim 编辑器程序是在安装 vim-enhanced 软件包时生成的。(2) 查询未安装rpm软件包的信息使用“-qp”选项时,必须以 RPI 软件包文件的路径作为参数(可以有多个),而不是软件包名称。其相关的子选项与使用“-q”查询时类似,常用的两个查询选项如下所述。-qpi:查看指定软件包的名称、版本、许可协议、用途描述等详细信息。-qpl:查看该软件包准备要安装的所有目标目录、文件列表。例如:(3)安装,升级,卸载rpm软件包使用 rpm命实现这些操作时,基本的命令选项如下所述。-i:在当前系统中安装(Install)一个新的 RPM 软件包。-e:卸载指定名称的软件包。-U:检查并升级系统中的某个软件包,若该软件包原来并未安装,则等同于“-i”选项。-F:检查并更新系统中的某个软件包,若该软件包原来并未安装,则放弃安装。-h:在安装或升级软件包的过程中,以“#”号显示安装进度。-v:显示软件安装过程中的详细信息。-force:强制安装某个软件包,当需要替换已安装的软件包及文件,或者安装一个比当前使用的软件版本更旧的软件时,可以使用此选项。-nodeps:在安装或升级、卸载一个软件包时,不检查与其他软件包的依赖关系。安装操作如下:ethtool是 Linux 系统下的命令行工具,用于管理以太网网卡。能查网卡基本信息、链路状态,可设置速率、双工模式,控制唤醒功能,调整队列等参数,还能借助错误统计辅助诊断网络问题。卸载软件包如下(4)维护rpm数据库下面维护 RPI 数据库的操作步骤。重建 RPM 数据库RPI 数据库用于记录在 Linux 操作系统中安装、卸载、升级应用程序的相关信息,由RPM 软件包管理系统自动完成维护,一般不需要用户干预。当 RPM数据库发生损坏(可能由误删文件、非法关机、病毒破坏等导致),且 Linux 操作系统无法自动完成修复时,将导致无法使用 rpm 命令正常地安装、卸载及查询软件包。这时可以使用 rpm 命令的“-rebuilddb”或“-initdb”功能对 RPI 数据库进行重建,具体操作如下:[root@localhost ~]# rpm --rebuilddb或[root@localhost ~]# rpm --initdb三,从源代码编译安装程序1源代码编译我们用源码包的原因有以下几种:安装较新版本的应用程序时::大多数的 Linux 发行版都提供了相当丰富的应用程序,而这些程序的版本往往滞后于该软件的最新源代码版本,因为大多数的开源软件总是以源代码的形式最先发布,之后才会逐渐出现.rpm、.deb 等二进制封装的版本。下载应用程序的最新源代码包并编译安装,可以在程序功能、安全补丁等方面得到及时更新当前安装的程序无法满足应用需求时:对于 RPM 格式封装的应用程序,一般只包含该软件所能实现的一小部分功能,而难以由用户自行修改、定制。通过对程序的源代码进行重新配置并编译安装后,可以定制更灵活、更丰富的功能。许多 Linux 服务器程序都采用源代码编译的方式进行安装,以获得更适于企业实际应用需求的服务为应用程序添加新的功能时:当需要利用现有的程序源代码进行适当的修改以便增加新的功能时必须释放出该软件的源代码,修改后再重新编译安装。由此可得,源代码安装给使用者提供了更加灵活的程序定制途径。编译源代码需要有相应的开发环境,对于自由软件来说,gcc和 make是最佳的编译工具。gcc 和make 是由 GNU 项目所贡献的功能强大的 c/c++语言编译器,在全世界的自由软件开发者中广受欢迎查看gcc和make工具的版本信息如下:gcc工具默认是没有安装的所以要先安装gcc gcc-c++ 软件包make工具的查询2.编译安装的基本过程编译安装的过程分为:解包,配置,编译,安装以apache软件为例,用源码包安装,Apache是运行在Linux操作系统下的 web 服务器软件,能够用于架设 web 服务器。执行下面的命令可以查看当前目录中上传的Apache服务的源代码安装包文件对于从互联网中下载的软件包,建议使用 md5sum 命令工具检查MD5 校验和。例如,执行“md5sum httpd-2.4.25.tar.gz”操作后可计算出 httpd-2.4.25.tar.gz 软件包文件的 m5 校验和“24fb8b9e36cf131d78caae864fea0f6a”,操作如下所示。将其与软件官方提供的校验值进行比较,若相同则说明该软件包在网络传输过程中没有被非法改动;对于校验和不一致的软件包,应尽量不要使用,以免带来病毒、木马等不安全因素。在安装apache的配置时需要apr pcre等软件包的支持,这些是软件包的开发包(devel) ,以便提供相应的库和头文件,确保apache的安装顺利先挂载光盘安装头和库文件,这里用yum安装方便解决依赖关系[root@localhost ~]#   make安装[root@localhost ~]#   make install使用安装完成后需对文件进行配置调整:然后修改配置文件 httpd.conf 的第 195 行,将前面的’#’去掉,保存并退出。最后启动 Apache,操作如下:启动apache 并用curl命令访问127.0.0.1验证服务运行情况————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/king05yh/article/details/147423957
  • [技术干货] 探索Telnet:远程连接与管理的经典工具
    探索Telnet:远程连接与管理的经典工具在数字化时代,远程访问和管理服务器是网络管理员和系统工程师的日常工作之一。尽管近年来,SSH(Secure Shell)因其更高的安全性而逐渐取代了Telnet,但了解Telnet的基本用法仍然对理解网络协议的发展历史及某些特定场景下的应用具有重要意义。本文将带你深入了解Telnet的基本功能、使用方法以及注意事项。一、Telnet简介Telnet是一种网络协议,用于在远程计算机上执行命令,就像你在本地终端上操作一样。它工作在TCP/IP协议栈的应用层,默认使用TCP端口23。通过Telnet,用户可以登录到远程服务器,执行命令、查看文件、修改配置等。然而,由于其传输的数据(包括密码)是明文形式,安全性较低,容易受到中间人攻击和数据窃听,因此在现代网络环境中,除非在安全的内部网络中使用,否则不推荐使用Telnet。二、安装Telnet在大多数Linux发行版中,Telnet客户端通常是预装的,但如果没有,你可以通过包管理器安装。例如,在Debian/Ubuntu系统上,可以使用以下命令:sudo apt-get update sudo apt-get install telnet在Windows系统中,Telnet客户端可能默认未启用。你可以通过“控制面板” -> “程序” -> “启用或关闭Windows功能”来找到并启用Telnet客户端。三、使用Telnet连接到远程服务器打开命令行界面(Linux的Terminal或Windows的CMD),输入以下命令连接到远程服务器:telnet hostname_or_ip_address或者指定端口(如果非默认23端口):telnet hostname_or_ip_address port_number连接成功后,你会看到登录提示,输入用户名和密码即可登录。基本操作登录后,你可以像在本地终端一样输入命令。退出:要断开连接,可以输入exit或按Ctrl+]进入Telnet命令模式,然后输入quit。注意事项安全性:如前所述,Telnet传输的数据未加密,因此不要在公共网络或不安全的网络环境中使用。防火墙配置:确保防火墙允许通过TCP端口23(或你指定的端口)的流量。服务器配置:确保远程服务器上的Telnet服务已启动并正确配置。四、替代方案:SSH鉴于Telnet的安全性问题,推荐使用SSH作为远程访问的替代方案。SSH提供了加密的数据传输,有效防止了数据泄露和中间人攻击。大多数现代操作系统都内置了SSH客户端和服务器软件。安装SSH客户端(如未预装):Linux:sudo apt-get install openssh-client # Debian/Ubuntu sudo yum install openssh-clients # CentOS/RHEL Windows: 可以使用PowerShell内置的SSH功能,或者安装第三方SSH客户端如PuTTY。使用SSH连接:ssh username@hostname_or_ip_address同样,你可以指定端口(如果非默认22端口):ssh -p port_number username@hostname_or_ip_address五、总结虽然Telnet因其安全性问题在现代网络环境中逐渐被淘汰,但了解它的基本用法对于理解网络协议的发展具有重要意义。对于需要远程访问和管理服务器的场景,推荐使用更安全的SSH协议。通过本文的介绍,希望你能对Telnet有一个全面的认识,并在适当的时候选择最合适的工具来完成任务。
  • MySQL性能优化实战指南
    MySQL性能优化实战指南在当今的互联网应用中,数据库的性能直接影响着整个系统的响应速度和用户体验。MySQL作为最流行的关系型数据库管理系统之一,其性能优化显得尤为重要。本文将深入探讨MySQL性能优化的各个方面,包括表结构优化、索引优化、查询优化、配置优化、缓存使用等,并辅以具体的代码示例,帮助大家更好地理解和应用这些优化技巧。一、表结构优化1. 选择合适的数据类型在设计数据库表时,选择合适的数据类型至关重要。不同的数据类型在存储效率和查询性能上存在差异。例如,整数类型比字符串类型存储效率更高,因此应优先使用整数类型来存储数值数据。-- 使用整数类型存储标识符 CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE ); 2. 字段设计规范化字段长度要合理,避免浪费存储空间。对于频繁重复的字符串数据,可以使用枚举类型(ENUM)来替代。-- 使用枚举类型替代频繁重复的字符串数据 CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(255), category ENUM('Electronics', 'Clothing', 'Books') ); 3. 分区和分表对于超大表,使用表分区或水平分表可以减小单表的存储规模,提高查询效率。-- 使用RANGE分区 CREATE TABLE logs ( id INT NOT NULL AUTO_INCREMENT, log_date DATE NOT NULL, message VARCHAR(255), PRIMARY KEY (id, log_date) ) PARTITION BY RANGE (YEAR(log_date)) ( PARTITION p2019 VALUES LESS THAN (2020), PARTITION p2020 VALUES LESS THAN (2021), PARTITION p2021 VALUES LESS THAN (2022), PARTITION p2022 VALUES LESS THAN (2023) ); 二、索引优化1. 合理使用索引创建索引可以显著提高查询速度,但过多的索引也会影响写性能。因此,在为列创建索引时,需要考虑查询的频率和性能。-- 为查询频繁的列创建索引 CREATE INDEX idx_customer_id ON orders (customer_id); -- 创建复合索引 CREATE INDEX idx_category_price ON products (category, price); 2. 避免冗余索引减少不必要的索引以节省存储空间。例如,如果已经为某个列创建了单列索引,就不需要再为该列创建复合索引。3. 覆盖索引覆盖索引可以代替多个单独的索引,减少回表次数,提高查询性能。-- 创建覆盖索引 CREATE INDEX idx_customer_date ON orders (customer_id, order_date); 4. 定期维护索引随着数据的更新和增长,索引可能会变得不再紧凑。定期运行维护命令可以更新索引统计信息、整理碎片,从而帮助查询优化器生成更优的执行计划。-- 分析表以更新索引统计信息 ANALYZE TABLE orders; -- 优化表以整理碎片 OPTIMIZE TABLE orders; 三、查询优化1. 避免SELECT *只查询需要的列可以减少数据传输量,提高查询速度。-- 不推荐 SELECT * FROM orders; -- 推荐 SELECT order_id, order_date FROM orders; 2. 优化JOIN操作尽量减少复杂的JOIN操作,JOIN操作越多,查询效率越低。可以考虑重构表结构或使用其他方法来减少JOIN操作。-- 优化前 SELECT c.customer_name, o.order_date FROM customers c JOIN orders o ON c.customer_id = o.customer_id; -- 优化后 SELECT c.customer_name, o.order_date FROM customers c INNER JOIN orders o ON c.customer_id = o.customer_id; 3. 避免在WHERE子句中使用函数或表达式在WHERE子句中使用函数或表达式会导致索引失效,降低查询效率。-- 不推荐 SELECT * FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m-%d') > '2022-01-01'; -- 推荐 SELECT * FROM orders WHERE order_date > UNIX_TIMESTAMP('2022-01-01'); 4. 使用LIMIT分页使用LIMIT子句来分页查询,限制返回的行数,以减少数据传输。-- 查询前10条记录 SELECT * FROM products LIMIT 10; 5. 使用EXPLAIN分析查询计划使用EXPLAIN关键字分析查询执行计划,以便了解查询是如何使用索引、连接和排序等操作的。-- 分析查询语句的执行计划 EXPLAIN SELECT * FROM orders WHERE customer_id = 10; 四、配置优化1. 调整MySQL参数根据服务器的硬件资源和业务需求,合理调整MySQL参数以提高性能。-- 分配更多内存用于InnoDB缓冲池 SET GLOBAL innodb_buffer_pool_size = 2G; -- 为查询缓存设置合适大小 SET GLOBAL query_cache_size = 100M; -- 根据应用负载调整最大连接数 SET GLOBAL max_connections = 200; 2. 日志和慢查询分析开启慢查询日志,分析耗时查询,优化其执行计划。-- 开启慢查询日志 SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; -- 超过1秒的查询会记录 五、缓存使用1. MySQL查询缓存MySQL提供了查询缓存功能,可以将经常执行的查询结果缓存起来,以提高查询性能。-- 启用查询缓存 SET GLOBAL query_cache_size = 100M; SET GLOBAL query_cache_type = 1; 2. 外部缓存系统如Redis等高性能的内存数据存储系统,可以作为外部缓存系统与MySQL配合使用,以减轻MySQL的压力,提高查询性能。// 使用Jedis客户端连接Redis Jedis jedis = new Jedis("localhost", 6379); String key = "user:12345"; String userData = jedis.get(key); if (userData == null) { // 从数据库中查询数据 userData = queryUserFromDB(12345); // 将查询结果缓存到Redis,设置过期时间为600秒 jedis.setex(key, 600, userData); } 六、总结MySQL性能优化是一项持续的工作,需要结合具体应用场景、数据量和访问模式进行定制化调整。从表结构设计到查询语句优化,再到系统配置和硬件支持,全面优化可大幅提升数据库的性能和稳定性。通过监控和实践积累经验,才能在复杂的业务场景中做到游刃有余。希望本文能为大家在MySQL性能优化方面提供一些有用的参考和启示。
  • [技术干货] MySQL主备切换详解与实战
    MySQL主备切换详解与实战在当今的数据驱动时代,数据库的高可用性和数据一致性成为了企业应用不可或缺的重要部分。MySQL作为一款开源的关系型数据库管理系统,广泛应用于各种场景。为了保障MySQL数据库的高可用性,主备切换(也称为主从切换)技术显得尤为重要。本文将详细介绍MySQL主备切换的原理、步骤,并附带实战代码,帮助读者掌握这一关键技能。一、MySQL主备切换的原理MySQL的主备切换是基于主从复制技术实现的。主从复制是指将主数据库(Master)上的数据实时或异步地复制到备数据库(Slave)上,从而保持主备数据库的数据一致性。当主数据库出现故障时,可以迅速切换到备数据库,确保服务的连续性。MySQL的主从复制是通过二进制日志(binlog)和中继日志(relay log)来实现的。主库在有数据更新时,会将更新事件写入到binlog文件中。备库通过I/O线程向主库的log dump线程请求binlog文件的副本,并将其存储到本地的relay log中。然后,备库的SQL线程读取relay log,解析出日志中的命令并执行,从而确保主备库数据同步。二、MySQL主备切换的步骤MySQL主备切换的流程主要包括以下几个步骤:准备环境、配置主从同步、验证同步、切换主备、更新应用程序配置以及健康检查。下面我们将详细介绍每个步骤,并附带相应的代码示例。1. 准备环境首先,需要选择两台服务器分别作为主库和备库,并确保它们能够互相通信。然后,在这两台服务器上安装相同版本的MySQL数据库。# 在主库和备库上安装MySQL数据库 yum install mysql mysql-server # 启动MySQL服务 service mysqld start2. 配置主从同步在主库和备库的MySQL配置文件中(通常是my.cnf),需要设置不同的server-id,并启用binlog和relay log。主库配置(my.cnf):[mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=your_database_name # 如果需要同步特定的数据库,可以加上这一行备库配置(my.cnf):[mysqld] server-id=2 relay-log=mysql-relay-bin read_only=1 # 设置备库为只读模式,防止误操作配置完成后,重启MySQL服务使配置生效。# 重启MySQL服务 service mysqld restart接下来,在主库上创建一个用于复制的用户,并授予相应的权限。-- 在主库上创建复制用户并授权 CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 然后,查看主库的状态信息,获取binlog文件名和位置。-- 查看主库状态 SHOW MASTER STATUS; 在备库上执行CHANGE MASTER TO命令,绑定主库的信息。-- 在备库上绑定主库信息 CHANGE MASTER TO MASTER_HOST='your_master_ip', MASTER_USER='repl', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='mysql-bin.000001', # 替换为SHOW MASTER STATUS输出的File值 MASTER_LOG_POS=154; # 替换为SHOW MASTER STATUS输出的Position值 最后,在备库上启动复制线程。-- 在备库上启动复制线程 START SLAVE; 3. 验证同步在主库上插入一些数据,然后在备库上验证这些数据是否已经同步过来。如果数据一致,说明主从同步配置成功。-- 在主库上插入数据 USE your_database_name; CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO test (id, name) VALUES (1, 'test1'), (2, 'test2'); -- 在备库上验证数据 USE your_database_name; SELECT * FROM test; 4. 切换主备当主库出现故障时,需要切换到备库。在切换之前,需要确保备库已经同步了主库的所有数据,并且不再接收新的写入请求。首先,在主库上执行FLUSH TABLES WITH READ LOCK命令,阻止写入操作。注意,这个命令会保持一个读锁,直到你手动解锁。-- 在主库上阻止写入操作 FLUSH TABLES WITH READ LOCK; 然后,在备库上执行STOP SLAVE命令停止复制线程,并检查备库的同步状态。-- 在备库上停止复制线程 STOP SLAVE; -- 检查备库同步状态 SHOW SLAVE STATUS\G; 观察Seconds_Behind_Master字段,确保这个值为0,意味着备库已经完全同步。接下来,在备库上执行RESET SLAVE和RESET MASTER命令,重置备库和主库的状态。注意,这一步会删除所有的binlog和relay log文件,因此在执行之前一定要确保数据已经同步。-- 在备库上重置状态 RESET SLAVE; RESET MASTER; 然后,修改备库的my.cnf文件,将其server-id修改为唯一的值(如果之前配置为备库时使用了不同的server-id,则无需修改),并去掉read_only选项,使其能够作为新的主库运行。# 修改备库的my.cnf文件 [mysqld] server-id=1 # 修改为唯一的server-id # read_only=1 # 去掉只读选项重启备库(现在的新主库)服务。# 重启MySQL服务 service mysqld restart如果有其他从库,需要重新配置它们以指向新的主库。-- 在其他从库上重新配置主库信息 CHANGE MASTER TO MASTER_HOST='<新主库的IP>', MASTER_USER='<复制用户>', MASTER_PASSWORD='<复制用户密码>', MASTER_LOG_FILE='<新主库的binlog文件名>', MASTER_LOG_POS=<新主库的binlog位置>; -- 启动复制线程 START SLAVE; 最后,更新应用程序的数据库连接配置,指向新的主库。这通常涉及到修改配置文件或环境变量。5. 健康检查切换完成后,需要进行健康检查,确保新的主库和从库都在正常运行。-- 在新主库上检查表是否存在 SHOW TABLES; -- 在从库上检查同步状态 SHOW SLAVE STATUS\G; 三、注意事项数据一致性:在切换之前,一定要确保备库已经同步了主库的所有数据,否则会导致数据丢失或不一致。备份与恢复:在执行主备切换之前,一定要做好备份,以防万一。MySQL提供了多种备份工具和方法,如mysqldump和xtrabackup。监控与报警:建议配置数据库监控和报警系统,以便在主库出现故障时能够及时发现并自动触发切换操作。四、总结MySQL主备切换是实现数据库高可用性的重要手段之一。通过合理配置主从同步、验证同步效果以及掌握备份与恢复方法,可以确保在主库出现故障时迅速切换到备库,保证服务的连续性。本文详细介绍了MySQL主备切换的原理、步骤和注意事项,并附带了相应的代码示例。希望读者能够通过本文的学习和实践,掌握这一关键技能,为企业的数据库运维工作提供有力的支持。
  • [技术干货] Linux 用户管理:深入解析与实践
    Linux 用户管理:深入解析与实践引言Linux 是一个开源、多用户、多任务的操作系统,广泛应用于服务器、桌面、移动设备和嵌入式系统等多种计算平台。其多用户特性使得用户管理成为 Linux 系统管理中的一个重要组成部分。本文将深入解析 Linux 中的用户管理,包括用户和用户组的基本概念、相关配置文件、用户管理命令以及实践案例。一、用户和用户组基础1. 用户和用户组的概念在 Linux 系统中,用户是系统中的一个账户,可以登录系统并执行操作。每个用户都有唯一的用户名和密码,用于身份验证。用户组则是具有相同特征用户的逻辑集合,用于简化用户权限的管理。通过将用户分组,管理员可以方便地为整个组分配权限,而不是逐个用户进行配置。2. 用户和用户组的文件Linux 系统通过一系列配置文件来管理用户和用户组信息。主要的配置文件包括:/etc/passwd:存储用户账户信息。每行记录对应一个用户,字段之间用冒号分隔,包含用户名、密码占位符、用户ID(UID)、组ID(GID)、描述性信息、主目录和默认Shell等信息。/etc/shadow:存储加密的用户密码和密码过期信息。只有root用户有权限访问该文件。/etc/group:存储用户组信息。每行记录对应一个用户组,字段之间用冒号分隔,包含组名、组密码占位符、组ID(GID)和属于该组的用户列表等信息。/etc/gshadow:存储加密的用户组密码信息。二、用户管理命令1. 添加用户使用 useradd 命令可以添加新用户。其基本语法为:sudo useradd [选项] 用户名常用选项包括:-u:指定用户UID。-g:指定用户的默认组(主组)。-G:指定用户附加组。-d:指定用户家目录。-s:指定用户默认Shell。示例:sudo useradd -d /home/sam -m sam此命令创建了一个用户 sam,并为其生成主目录 /home/sam。2. 修改用户信息使用 usermod 命令可以修改已有用户的信息。其基本语法为:sudo usermod [选项] 用户名常用选项与 useradd 命令类似。示例:sudo usermod -s /bin/ksh -d /home/z -g developer sam此命令将用户 sam 的登录Shell修改为 ksh,主目录改为 /home/z,用户组改为 developer。3. 删除用户使用 userdel 命令可以删除用户。其基本语法为:sudo userdel [选项] 用户名常用选项包括:-r:删除用户及其家目录和邮箱。示例:sudo userdel -r sam此命令将删除用户 sam 及其家目录。4. 设置密码使用 passwd 命令可以设置或修改用户密码。其基本语法为:passwd [选项] 用户名常用选项包括:-l:锁定密码,即禁用账号。-u:密码解锁。-d:使账号无密码。-f:强迫用户下次登录时修改密码。示例:sudo passwd sam此命令将为用户 sam 设置新密码。三、用户组管理命令1. 添加用户组使用 groupadd 命令可以添加新用户组。其基本语法为:sudo groupadd [选项] 组名常用选项包括:-g:指定新用户组的GID。示例:sudo groupadd -g 1001 newgroup此命令创建了一个GID为1001的用户组 newgroup。2. 修改用户组使用 groupmod 命令可以修改用户组信息。其基本语法为:sudo groupmod [选项] 组名常用选项包括:-g:更改组ID。-n:更改组名。示例:sudo groupmod -g 1002 newgroup此命令将用户组 newgroup 的GID修改为1002。3. 删除用户组使用 groupdel 命令可以删除用户组。其基本语法为:sudo groupdel 组名示例:sudo groupdel newgroup此命令将删除用户组 newgroup。四、实践案例案例1:创建用户并设置密码# 创建用户 sudo useradd -d /home/newuser -m newuser # 设置密码 sudo passwd newuser案例2:修改用户信息并添加附加组# 修改用户信息 sudo usermod -s /bin/zsh -d /home/newuser2 -g developers newuser # 添加附加组 sudo usermod -aG admins newuser案例3:删除用户及其家目录sudo userdel -r newuser案例4:创建用户组并添加用户# 创建用户组 sudo groupadd -g 1003 devteam # 添加用户到组 sudo usermod -aG devteam newuser五、总结Linux 用户管理是系统管理员必须掌握的重要技能之一。通过合理配置用户和用户组,可以确保系统的安全性和高效运行。本文详细介绍了 Linux 用户管理的基本概念、相关配置文件以及常用命令,并通过实践案例展示了如何在实际操作中应用这些命令。希望本文能为广大 Linux 系统管理员提供有益的参考和帮助。
  • [技术干货] MySQL主备搭建详解
    MySQL主备搭建详解在当前的数据库管理系统中,MySQL以其高效、灵活和开源的特性,赢得了众多开发者和企业的青睐。为了保障数据库的高可用性和数据的一致性,MySQL的主备(主从)架构显得尤为重要。本文将详细介绍MySQL主备搭建的步骤,并提供相应的代码示例,以便读者更好地理解和实施。一、MySQL主备架构概述MySQL主备架构由主服务器(Master)和备服务器(Slave)组成。主服务器负责处理所有的写入操作,而备服务器则从主服务器复制数据,处理读请求。这种架构确保了当主服务器发生故障时,备服务器能够迅速接管,从而实现高可用性。主服务器(Master):负责处理所有的写入操作,如数据的增删改查等。备服务器(Slave):从主服务器复制数据,并处理读请求,以实现负载均衡和数据备份。二、MySQL主备搭建步骤以下是MySQL主备搭建的详细步骤,包括配置主服务器、配置备服务器以及启动和验证复制过程。1. 准备两台服务器首先,我们需要准备两台安装了MySQL的服务器。本文将以两台虚拟机为例,IP地址分别为128.196.110.107(主服务器)和128.196.111.128(备服务器)。2. 配置主服务器在主服务器上,我们需要进行以下操作:(1)修改MySQL配置文件打开MySQL的配置文件(通常为/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),并添加或修改以下内容:[mysqld] server-id = 1 # 设置服务器ID,必须唯一 log_bin = /var/log/mysql/mysql-bin.log # 启用二进制日志,并设置日志路径 binlog_format = ROW # 设置二进制日志格式,ROW格式可以记录每一行的变化 保存配置文件后,重启MySQL服务以使改动生效:sudo systemctl restart mysql(2)创建复制用户在主服务器上创建一个用于复制的用户,并授予其必要的权限:CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES; (3)获取主服务器状态执行以下命令,获取主服务器的状态,并记录File和Position的值,这两个值将在配置备服务器时使用:SHOW MASTER STATUS; 3. 配置备服务器在备服务器上,我们需要进行以下操作:(1)修改MySQL配置文件打开MySQL的配置文件,并添加或修改以下内容:[mysqld] server-id = 2 # 设置服务器ID,必须唯一且不同于主服务器 relay_log = /var/log/mysql/relay-bin.log # 设置中继日志路径(可选) 保存配置文件后,重启MySQL服务:sudo systemctl restart mysql(2)配置备服务器以连接到主服务器在备服务器上执行以下命令,以连接到主服务器并配置复制参数:CHANGE MASTER TO MASTER_HOST='128.196.110.107', # 主服务器IP地址 MASTER_USER='replicator', # 复制用户名 MASTER_PASSWORD='your_password', # 复制用户密码 MASTER_LOG_FILE='mysql-bin.000001', # 主服务器二进制日志文件名(根据SHOW MASTER STATUS获取) MASTER_LOG_POS=154; # 主服务器二进制日志位置(根据SHOW MASTER STATUS获取) (3)启动复制执行以下命令以启动复制:START SLAVE; (4)检查复制状态使用以下命令检查复制状态,确保Slave_IO_Running和Slave_SQL_Running的值都为Yes:SHOW SLAVE STATUS\G; 4. 测试主备复制在主服务器上创建一个新的数据库或表,并检查备服务器是否同步了这些更改。例如,在主服务器上执行以下命令:CREATE DATABASE test_db CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin'; 然后,在备服务器上执行以下命令,检查是否同步了新创建的数据库:SHOW DATABASES; 如果备服务器上显示了test_db数据库,则说明主备复制配置成功。三、常见问题及解决方案复制用户权限不足:确保复制用户具有REPLICATION SLAVE权限,并正确配置了server-id和log_bin。网络问题:检查主备服务器之间的网络连接,确保它们可以相互通信。日志损坏:如果中继日志或二进制日志损坏,可以尝试重新配置复制并重新启动复制进程。数据不一致:如果主备服务器之间的数据不一致,可以使用mysqlbinlog工具进行日志恢复或重新同步数据。四、总结MySQL主备搭建是实现数据库高可用性和数据一致性的重要手段。通过配置主服务器和备服务器,并正确设置复制参数,我们可以确保在主服务器发生故障时,备服务器能够迅速接管并继续处理请求。本文详细介绍了MySQL主备搭建的步骤和常见问题解决方案,希望能为读者提供实用的参考和指导。在实际应用中,我们还需要根据具体的业务需求和系统环境进行相应的调整和优化,以确保MySQL主备架构的稳定性和可靠性。同时,定期备份数据和监控数据库状态也是保障数据安全的重要手段。希望读者能够结合本文的内容和实践经验,更好地掌握MySQL主备搭建的技术和方法。