首页 文章 精选 留言 我的

精选列表

搜索[安全机制],共10000篇文章
优秀的个人博客,低调大师

Nature子刊:脑成像揭示“顿悟”的神经机制

大脑成像研究的最新成果揭示,洞察力的闪现并非仅令人愉悦,它们实际上会重塑大脑对信息的表征方式,并助力将这些信息深深刻入记忆。这项研究由美国杜克大学以及德国洪堡大学和汉堡大学的研究人员联合开展,其发现对教育领域具有深远意义,表明培养“尤里卡时刻”或许能够使学习效果超越课堂,实现长期记忆与知识的深度内化。

优秀的个人博客,低调大师

探索 Gateway API 在 Service Mesh 中的工作机制

前几天 Gateway API 宣布在 0.8.0 中支持服务网格,这意味着 GAMMA(GatewayAPI forMeshManagement andAdministration)有了新进展,虽然目前还是实验阶段。去年 6 月 Gateway API 发布 0.5.0 时,我还写了一篇 SMI 与 Gateway API 的 GAMMA 倡议意味着什么?。如今,SMI 作为 sandbox 项目的年度审查已经 过了几个月仍未提交,唏嘘。 废话不多说,我们来看下 0.8.0 下的 Gateway API 如何在 Service Mesh 中工作。 TL;DR Gateway API 对服务网格的支持仍然是实验阶段,但是已经有厂商跟进(当然也都是实验阶段)。 相比 Gateway API 处理南北向流量将路由绑定到 Gateway 资源 相比,在网格中路由则是与 Service 进行绑定。简单理解成 Service 代理了 Gateway 的角色,不过该 Service 是目标 Service。 Gateway API 中的服务网格 要说服务网格,我们先来看下服务 Service。 抽象 Service Service 中 Kubernetes 中是一个独立的资源,这里说的抽象是从逻辑上进行抽象,抽象成前端和后端两部分。 前端(Frontend)通常就是 Service 的 DNS 名字或者 ClusterIP;后端(Backend)则是通过标签选择器选择的 Endpoint 或者 EndpointSlice。 路由与服务 把路由直接绑定到 Service 上,被认为是当下最优的选择。Service 与其他资源的耦合度太高,比如 IP 分配、DNS、端点集合、负载均衡等等,但在目前的网格设计中也是唯一的最优选择,未来会寻求更好的选择,比如 ServiceBinding(见后文) 这样做的好处呢,就是将服务的前后端分别与现在的 xRoute API 中的 parentRef 和 backendRef 关联,无需引入额外的 API。 不同的时候,在 xRoute API 中的 backendRef 也可以是一个 Service,但是最终在路由请求时,目标还是 Endpoint 或者 EndpointSlice,只不过他们与 parentRef 中的 Service 不是强关联的。 kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley kind: Service group: core port: 80 rules: ... 如果一个 Service 上配置了多个路由,匹配到多条路由的请求将被拒绝。 请求流程 客户端发送请求 网格数据面代理拦截请求 通过虚拟 IP 地址、DNS 主机名、或者名字来确认流量是属于哪个 Service(不会使用 xRoute 上的 hostname 字段) 如果 Service 没有配置路由,将使用请求的原始目的地进行转发 找到匹配的优先级最高(消费者路由高于生产者路由,见下文)的路由进行转发 如果配置了路由,但都无法匹配,则拒绝请求 路由的命名空间 为什么要提命名空间,是因为路由与服务在相同或者不同命名空间下所代表的含义不同。 同命名空间 路由 smiley-route 与 Service smiley 位于同一个命名空间 faces,该路由上设置了请求超时时间 100ms。这意味着,所有访问 Service smiley (来自任一命名空间下的任一工作负载)并匹配 smiley-route 路由规则的请求,都受该超时配置的影响。 这种路由被称为 生产者路由(Producer Route),影响目标为该服务的所有请求。 kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 不同命名空间 路由 smiley-route 与 Service smiley 位于不同的命名空间,与上面不同的是,所有访问 Service smiley (来自命名空间 fast-clients 下的任一工作负载)并匹配 smiley-route 路由规则的请求,都受该超时配置的影响。 这种路由被称为 消费者路由(Consumer Route),影响同命名空间下访问木雕服务的所有请求。 kind: HTTPRoute metadata: name: smiley-route namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 同一 Service 上的多个路由 这里的前提条件是这些路由都位于同一命名空间下,即同为生产者路由,或同为消费者路由。这种情况将会遵循 路由合并规则 多这个路由进行合并,如果要为同一命名空间下的多个工作负载配置不同的消费者路由,目前还无法实现。唯一的 比如下面定义了两个消费者路由 smiley-route-50 和 smiley-route-100 kind: HTTPRoute metadata: name: smiley-route-50 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 50ms --- kind: HTTPRoute metadata: name: smiley-route-100 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 路由与策略 之前也写文介绍过 Gateway API 中的策略,有兴趣的可以看一下 一文搞懂 Kubernetes Gateway API 的 Policy Attachment。 在网格中策略附加可以非常简单。策略可以应用于任何命名空间中的任何资源,但如果目标位于不同的命名空间中,则它只能应用于来自同一命名空间的请求(跟随消费者路由的逻辑)。 网格一致性测试 首先来看下何为 一致性配置文件: Gateway API 会提供用于一致性测试的配置文件,在运行一致性测试可以选择这些配置文件。然后将一致性结果报告回网关 API 项目并获得认证(例如徽章)。除了测试核心的功能,也可以自主添加厂商的特定实现中的扩展功能进行测试。 这些 Gateway API 的实现会将测试报告提交到 官方仓库的一致性测试报告目录 中,可以作为大家选型时的依据之一。 目前有 HTTP、TLS、TLSPassthrough(基本上都是根据 xRoute 来进行组织,因此后续也会有 GRPC、TCP、UDP)。针对服务网格,也提出了 mesh 配置文件。 官方博客 中提到 Kuma 2.3+、Linkerd 2.14+、和 Istio 1.16+ 中的 Gateway API 实现已经全部通过 mesh 一致性测试,但截止目前未看到测试报告,估计还在上传中。

优秀的个人博客,低调大师

声网 Token 鉴权机制,以及常见的问题

Token鉴权是什么? Token也称为动态密钥,是在加入频道时用于校验用户权限的一组字符串;鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网会使用 Token 对其鉴权。 我们为这种方式提供了一个较为形象的比喻,即: 某个展览馆需要游客实名认证后,获取专属入场券才可参观。游客在完成实名认证后可以获取到具备有效期限制的专属入场券,在进场时提供在有效期内的入场券,方能进场。其中: 展览馆相当于声网的服务,即音视频频道或信令系统等; 专属入场券相当于 Token; 实名认证步骤相当于结合 声网 AppID、频道号、用户 ID 等信息 获取到专属 Token 的步骤; 进场时校验入场券相当于鉴权,即校验 Token 是否和 声网 AppID、频道号、用户 ID 等信息匹配,且在有效期内。 声网的产品和服务中大部分采用Token 鉴权的方式。下面,我们针对如何生成和使用 Token,以及 Token 鉴权中常见的问题进行详细的讲解。 如何生成和使用Token? 1、Token 鉴权原理 在了解如何生成和使用Token 前,需要先了解 Token 鉴权的原理。 如图所示,共分为9个步骤: 1.客户端根据需要,向 app 服务端申请 Token 2.App 服务端生成并返回 Token 3.客户端以 UID、频道名以及获取到的 Token 加入频道 4.声网平台读取该 Token 中包含的信息,并进行校验 5.客户端收到加入频道成功回调,并获取用户 UID 6.Token 最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调 7.此时,如果客户端需要继续进行音视频互动,需要申请新的 Token 8.App 服务端生成并返回 Token 9.客户端更新 Token 这个过程中,用户需要自行实现步骤1、2、3、7、8、9 的代码逻辑。 其中,对应的Token 包含以下信息: 你在声网控制台创建项目时生成的 App ID 频道名 用户 ID 用户权限,如是否能发流或收流 Token 的过期时间 2、申请与生成Token 可以看到,在用户加入频道前,客户端需要先向服务器申请Token,并在 服务器 生成 Token,且 Token 必须与 需要加入频道的用户所对应的 AppID、频道名、用户 ID(UID)信息、用户权限(是否能发流或收流) 一一对应,并且确保生成的 Token 在有效期内。然后才能以 UID、频道号 和 Token 加入对应频道。 向服务器申请Token,可以通过向服务器发送 GET 请求等方式自行实现,以下文章以供参考: 部署 Token 服务器(官方文档): https://docs.agora.io/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS#部署-token-服务器 用Token-Flutter 连接 Agora (2021-09-15) https://www.rtcdeveloper.cn/cn/community/blog/22929 使用 Swift 部署声网 Token 服务器 (2022-10-27): https://www.rtcdeveloper.cn/cn/community/blog/24981 在NET Core 上建立 Agora AccessToken 服务 (2020-11-14): https://www.rtcdeveloper.cn/cn/community/blog/19790 如何用 GoLang 为声网 Agora 应用构建 Token 服务器 (2020-12-09): https://www.rtcdeveloper.cn/cn/community/blog/20102 如何使用 NodeJS 为声网 Agora 应用构建 Token 服务器 (2020-12-03): https://www.rtcdeveloper.cn/cn/community/blog/20024 使用 Java 构建 Agora 令牌服务器 (2021-02-07): https://www.rtcdeveloper.cn/cn/community/blog/20709 用 Java 构建声网令牌服务器 (2023-01-10): https://www.rtcdeveloper.cn/cn/community/blog/25430 生成Token,可以使用声网提供的 Demo 实现,Demo 地址请参考:Token 生成器代码 请务必注意:例如用户使用 UID=123456(int 型)加入频道 ChannelName="test",那么生成 Token 时传入的参数 UID 和 ChannelName 必须是相对应的,即 UID=123456(int 型)且 ChannelName="test",否则会导致鉴权失败。 3、Token 过期处理 Token最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调;Token 过期时,SDK 会触发 Token 过期回调。具体处理方式如下: 在 Token 过期前 30 秒,SDK 会触发 tokenPrivilegeWillExpire 回调。收到该回调后,客户端需要从服务器获取新的Token 并调用 renewToken 将新生成的 Token 传给 SDK。 Token 过期时,SDK 会触发 rtcEngineRequestToken 回调。收到该回调后,客户端需要从服务器获取新的 Token 并调用 joinChannel 方法,再使用新的 Token 重新加入频道。 一般来说,我们建议在Token 过期前,及时更新 Token,即从服务器获取新的 Token 并调用 renewToken 将新生成的Token 传给 SDK。 常见问题 当你的声网项目中不存在无证书并且启用了主要/次要证书,则表示你选择使用动态密钥 Token 对用户进行鉴权。 由于Token 具有一定的时效性,因此 app 在运行过程中,你有可能会收到如下与 Token 相关的错误码或事件回调。本文对这些事件进行了梳理,提供触发的原因以及解决方法,帮助你在 App 出现异常时进行问题排查。 101:App ID无效 问题描述: Native 端:SDK 在初始化声网服务时返回错误码 ERR_INVALID_APP_ID(101);或调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_APP_ID(101)。 Web 端:在初始化 声网服务或调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_INVALID_VENDOR_KEY(101)。 问题原因: 不是有效的App ID,一般是由于 App ID 的数据类型不对引起的。 解决方法: 建议检查 App ID 数据格式是否有效。声网的 App ID 为 String 型,请使用正确数据类型的 App ID,重新初始化声网服务。 109/118/2:Token 已过期 问题描述: Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_TOKEN_EXPIRED(109)。 Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_KEY_TIMEOUT(109)或ERR_DYNAMIC_KEY_EXPIRED(118)。 问题原因: Token过期。 解决方法: Token一旦过期,你就需要在服务端重新生成一个 Token,然后调用 renewToken 方法尝试重新加入频道。 110:Token 无效 问题描述: Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_TOKEN(110)。 Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_NO_AUTHORIZED(110)。 问题原因: 生成的 Token 无效。一般有以下原因: 你的声网项目中不存在无证书并且启用了主要/次要证书,但是加入频道时却未传入 Token;或者项目未开启主要/次要证书,就试图使用 Token 加入频道。 你在服务端生成 Token 时填入的 App ID、用户 ID 和频道名,与你初始化和加入频道时填入的 App ID、用户 ID 和频道名不匹配。 解决方法: 在加入频道前,请确认你在初始化时填入的 App ID 对应的项目是否已启用主要/次要证书。 如果未启用主要/次要证书,则不能使用 Token 加入频道。 如果项目中存在无证书并且已启用主要/次要证书,则既可以仅使用 App ID 加入频道,也可以使用主要/次要证书生成的 Token 加入频道。 如果项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 加入频道。 当确认使用 Token 加入频道时,还需要确认: 用于生成 Token 的 App ID 和初始化服务时填入的 App ID 一致。 用于生成 Token 的用户 ID 和加入频道时填入的用户 ID 一致,且数据类型也一致。 用于生成 Token 的频道名和加入频道时填入的频道名一致。 119:静态厂商使用动态密钥 该错误码仅适用于RTC Web SDK。 问题描述: Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_STATIC_USE_DYNAMIC_KEY(119)。 问题原因: 表示静态厂商使用了动态密钥。一般是由于使用的 App ID 对应的声网项目未启用主要/次要证书,却试图使用 Token 加入频道引起。 解决方法: 对于未开启主要/次要证书的项目,你可以不使用 Token 加入频道。你也可以先启用主要/次要证书,然后在服务端生成 Token 后重新加入频道。 120:动态厂商使用静态密钥 该错误码仅适用于RTC Web SDK。 问题描述: Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_USE_STATIC_KEY(120)。 问题原因: 表示动态厂商使用了静态密钥。一般是由于使用的 App ID 对应的声网项目中不存在无证书并且已启用主要/次要证书,加入频道时却没有传入 Token 引起。 解决方法: 如果 App ID 对应的项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 进行鉴权。你也可以换一个没有启用主要/次要证书的项目的 App ID,然后尝试重新加入频道。 Token过期相关事件回调 为保证通信体验,声网提供如下两个回调,提醒用户Token 即将过期或已经过期: onTokenPrivilegeWillExpire:该回调表示 Token 即将在 30 秒内失效。收到这个回调时,你需要在服务端重新生成Token,然后调用 renewToken 方法,将新生成的 Token 传给 SDK。 onRequestToken(Web 平台为 onTokenPrivilegeDidExpire):该回调表示 Token 已经失效。收到这个回调时,你需要在服务端重新生成 Token,然后调用 joinChannel 方法重新尝试加入频道。 各语言Token错误码对照 附录 注册并试用每月 10000 分钟免费的声网视频SDK,体验四行代码、三十分钟快速构建沉浸式实时互动场景 下载体验声网相关 SDK & Demo

优秀的个人博客,低调大师

以openGauss Connector下推为例剖析Connector下推机制

本次推文投稿:程一舰中国人民大学硕士 中国光大银行总行信息科技部 1.下推是什么? 下推其实就是将查询中的谓词或算子尽可能地向查询计划树的叶子结点靠近,最理想的情况就是将谓词或算子下推至叶子结点,这样就意味着可以将它们推至数据源了,通过数据源的预处理,可以极大的减少引擎从数据源拉取的数据量,从而极大提高查询效率。最简单的如下图所示。之前也写过一篇sparksql下推的文章,有兴趣可以去看一下https://mp.weixin.qq.com/s/NgrRuKUaVi-pknVnHcK32g。 2openLooKeng引擎的Connector下推 下面是一条SQL语句执行的各个环节,查询语句经过解析之后形成抽象语法树,然后经过Analyze生成逻辑计划,逻辑计划再通过一系列的优化规则来生成优化后的更高效的逻辑计划进而转成物理计划。而Connector下推就处于逻辑计划优化阶段的某一环节。 我们来看一下下面这张图,openLooKeng新下推框架的主要思想是把执行计划子树暴露给connector,让connector提供PlanOptimizers(基于visitor模式的)给执行优化引擎,这样可以让connector引入任意的优化。这张图展示了Connector下推在整个查询优化缓环节的位置,其实不难看出,真正触发这个过程的就是ApplyConnectorOptimization这条优化规则,它也仅仅是众多优化规则中的一条规则。只是这条规则会把关于该Connector相关的最大子查询计划(maxsubplan)推给Connector去优化,该Connector针对本数据源进行一系列的定制优化。 3openGauss Connector下推优化实践 上面说了这么多,到底怎么来具体实现一个Connector的下推优化呢,我们接下来以openGauss Connector为例。这个Connector顾名思义,就是用来连接GaussDB数据库的,它本身继承或复用了postgresql和basejdbc的一些类,所以在进行下推实现的时候,我们也可以继续去复用一些类。 首先,我们从逻辑计划开始,LogicalPlanner类是对刚刚解析出来的抽象语法树(AST)进行逻辑计划生成的类,在生成逻辑计划的同时,他还会做一件很重要的事就是对逻辑计划进行优化,我们可以从222行看到,这里的planOptimizers包含了几十条优化规则,而我们上面提到的ApplyConnectorOptimization就在第55条规则中,当循环遍历到这条规则的时候,其实也就是Connector逻辑优化的开始了。 然后,就如上面我所介绍的,当遍历到ApplyConnectorOptimization规则的时候,就会调用对应的Connector 的 Optimizer,在这里我们可以清晰地看到,因为我查询的catalog是一个GaussDB表,所以这个Optimizer就是JdbcPlanOptimizer(按理说应该是opengaussPlanOptimizer,但是上面说到过,因为openGauss Connector很多功能都是复用了Jdbc,这里也不意外),这个优化器中包含的一个比较重要的成员变量就是queryGenerator,因为正是通过他来进行后续的sql语句的生成。 这里我们可以看到这个具体的Generator是opengaussQueryGenerator,为了方便,在具体实现这个类的时候,里面也是复用了BaseJdbcQueryGenerator类中的内容 那接下来我们就看看JdbcPlanOptimizer做了哪些具体的优化。首先我们看到它会调用自己的optimize方法,来对推下来的maxSubPlan进行优化,具体的执行就通过调用accept方法来调用Visitor这个类来进行具体的节点遍历。 然后就是通过调用visitPlan来进行算子的转换,如下图就是主备对聚合算子AggregationNode进行相关操作。 tryCreatingNewScanNode会调用queryGenerator对象来进行算子的重写(其实就是把能推下去的通过重写SQL的方式把该算子加进去)。 我们看到这里开始准备重写,就进入到了BaseJdbcQueryGenerator类中来了(其实是进入到了openGaussQueryGenerator类,只是我复用了BaseJdbc,所以最后实在这里来做的),这里是调用的visitAggregation方法,主要就是来进行聚合算子的提取工作, 进一步,buildSql方法顾名思义,将提取出来的算子进行推到重写的SQL中,如下所示 最后重写完成,又回到了JdbcPlanOptimizer进行下一步的操作。毕竟优化器只是将子计划进行重新优化,所以最后还是要返回一个PlanNode的,所以我们看到接下来我们在上面重写的sql会被用来进行封装,最后封装成了TableScanNode里被返回。 其实到了这里就已经完成了具体的opengauss Connector的下推了,但是我们如果跳出来,看看它在整个执行过程中的位置,回想一下前面我们提到的,这也仅仅是我们完成了ApplyConnectorOptimization这一条优化规则的任务,如果你忘了我再重新贴一下图。 所以接下来,还会把我们刚刚返回的封装好的子查询计划继续应用其他规则。 再往后,引擎其实还会在全局的角度对整个查询进行一个重写,也就是在BaseJdbcClient这里所做的。 这里会通过QueryBuilder来重新梳理出一条sql语句,最终推给数据源。如下图所示,其实我们前面做的那么多,在全局看来只是一个table,别名为pushdown。 这里再次重写完的SQL,其实就是最终我们推给数据源执行的SQL了。 4优化效果 通过查看执行计划,我们来看(下推)优化与不优化的效果对比 即使不标明,我相信你也应该能看出哪一个是进行优化的效果了。第一张图片,我们可以看到正常情况下会从数据源读取数据,然后进行过滤、聚合、shuffle再聚合,而第二张图片我们看到Connector直接将条件和聚合算子推给了数据源,最后只接收一个聚合结果,从而大大解放了Connector,减少了数据的传输等效率损耗,从而提高查询性能。 5openGauss Connector下推优化实践 通过本篇文章,我相信你已经大致对Connecor下推以及查询下推的原理有了一个比较形象的了解了,如果你想继续深入了解,可以再次按照这个思路去捋一捋源码,其他情况的话,相信这篇文章已经足够能够解答你的疑惑了。opengauss connector下推的PR我已经提到社区了https://gitee.com/openlookeng/hetu-core/pulls/1354,欢迎交流。 openLooKeng 如果您在使用openLooKeng过程中,有任何疑问与建议,请在社区代码仓中提Issue,或加小助手微信(openLooKengoss)进入专属交流群 openLooKeng代码仓地址: https://gitee.com/openlookeng https://github.com/openlookeng 【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。 [Disclaimer] This article only represents the author's opinions, and is irrelevant to this website. This website is neutral in terms of the statements and opinions in this article, and does not provide any express or implied warranty of accuracy, reliability, or completeness of the contents contained therein. This article is for readers' reference only, and all legal responsibilities arising therefrom are borne by the reader himself. 社区公众号|openLooKeng 社群小助手|openLooKengoss

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册