WWW.YOUINFO.SITE
标签聚合 发行版

/tag/发行版

LinuxDo 最新话题 · 2026-06-07 22:33:24+08:00 · tech

cd Change Directory(Linux 发行版命令)。 OK 算是最早的烂梗,“all correct”被错拼成“oll korrect”,然后就抽出首字母成了“OK”。 目测是国内到迅哥儿那时候就很常用了。《故事新编·理水》里边就有。 [!QUOTE] 每月一次,照例的半空中要簌簌的发响,愈响愈厉害,飞车看得清楚了,车上插一张旗,画著一个黄圆圈在发毫光。离地五尺,就挂下几只篮子来,别人可不知道里面装的是什么,只听得上下在讲话: “古貌林!” “好杜有图!” “古鲁几哩……” “O.K!” Leading 中文意思是“行距”,但是它不读作 /ˈliː.dɪŋ/,而是读作 /ˈled.ɪŋ/。因为这个词最早是用来指代排铅字时每一行中间的铅条,因此保留了铅(lead)的读音 /led/。 Dashboard 中文意思是“仪表盘”。dash 是马儿飞跑的意思,因为马奔跑时会不可避免地溅起泥点,因此有人就在马车前安装了一块挡泥板,就有了这个复合词 dashboard。后来到了汽车时代,挡泥板移动到了驾驶员的面前,变成了汽车操纵台,一直到今天,就把安装有各种表、按钮和仪器的板面叫做 dashboard。 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-05-31 03:59:10+08:00 · tech

又是一个老生常谈的问题了,我的娱乐生活办公都离不开电脑,但是window的系统环境就是一个消耗品,日常用起来非常的省心,但是有些时候吧就挺那个的。 最近是越来越想换了系统的,但是学习成本真的劝退,还有生态什么的。 我主要使用的软件如下 现在已知的是换系统后会面临一下问题 使用习惯需要重新适用(毕竟windows从小学用到现在) 很多软件不提供linux版本|linux是残缺版 打游戏不方便 光是这三点就够折腾的了,想换又被死死束缚在舒适区域(啊巨婴!) 想听听各位佬友们的建议 35 个帖子 - 25 位参与者 阅读完整话题

V2EX - 技术 · 2026-05-22 22:29:19+08:00 · tech

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅 项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。 前端集成引发的连锁反应 原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑: Vue SPA 路由 fallback:Spring Boot 3.x 默认用 PathPatternParser ,addViewControllers 不支持 {spring:\w+} 正则。最终用 @Order(HIGHEST_PRECEDENCE) 的 Filter 拦截无后缀路径 forward 到 index.html 。 Spring Security 6 ignoring() 不生效:日志明确警告 You are asking Spring Security to ignore... This is not recommended 。改为 authorizeHttpRequests().permitAll() 才生效。 字体文件 401:Security 的静态资源豁免模式漏了 .woff/.woff2/.ttf/.eot 。 前端构建 API baseURL 双层 /api/api/:VITE_API_BASE_URL=/api 拼接 url: '/api/xxx' → /api/api/xxx 。改为空值。 发行包瘦身:260MB → 120MB 三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案: 去掉未用依赖:jaxb-api(零 import)、mysql-connector-j(纯配置模块不需要)、activemq(仅编译,运行时用 RabbitMQ) 共享 lib:maven-dependency-plugin 收集所有传递依赖到 lib/(自动去重 182 个),antrun 解压 fat JAR 提取 BOOT-INF/classes/ 打包为 flat thin JAR(1.7-5MB) 启动方式:从 java -jar fat.jar 改为 java -cp "lib/*:apps/app.jar" MainClass 循环依赖根治 去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链: ┌─────┐ │ SysConfigService 自引用 (删 @ Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上) 修复策略: 自引用:删字段,改用 this.xxx () 三角循环( PayInterfaceConfigService ↔ MchAppService/MchInfoService ):PayInterfaceConfigService.selectAllPayIfConfigListByAppId() 内部反向调用了 mchAppService.getById() 和 mchInfoService.getById()——这些只是 MyBatis-Plus 的简单 CRUD 委托。将这两个查询上移到 Controller 层,Service 方法改为接收 MchInfo 参数,依赖方向恢复。 两两循环:MchInfoService 注入 IsvInfoService 只是为了 getById(),IsvInfoService 注入 MchInfoService 只是为了 count()。直接替换为对应的 Mapper 注入,因为 MyBatis-Plus 的 ServiceImpl.getById() 底层就是 BaseMapper.selectById()。 关键认知: 依赖只能单向流动。找到"谁在反向调用"就是断环点。 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。 不要用 @ Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。 最终效果 ┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @ Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

V2EX - 技术 · 2026-05-22 22:29:19+08:00 · tech

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅 项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。 前端集成引发的连锁反应 原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑: Vue SPA 路由 fallback:Spring Boot 3.x 默认用 PathPatternParser ,addViewControllers 不支持 {spring:\w+} 正则。最终用 @Order(HIGHEST_PRECEDENCE) 的 Filter 拦截无后缀路径 forward 到 index.html 。 Spring Security 6 ignoring() 不生效:日志明确警告 You are asking Spring Security to ignore... This is not recommended 。改为 authorizeHttpRequests().permitAll() 才生效。 字体文件 401:Security 的静态资源豁免模式漏了 .woff/.woff2/.ttf/.eot 。 前端构建 API baseURL 双层 /api/api/:VITE_API_BASE_URL=/api 拼接 url: '/api/xxx' → /api/api/xxx 。改为空值。 发行包瘦身:260MB → 120MB 三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案: 去掉未用依赖:jaxb-api(零 import)、mysql-connector-j(纯配置模块不需要)、activemq(仅编译,运行时用 RabbitMQ) 共享 lib:maven-dependency-plugin 收集所有传递依赖到 lib/(自动去重 182 个),antrun 解压 fat JAR 提取 BOOT-INF/classes/ 打包为 flat thin JAR(1.7-5MB) 启动方式:从 java -jar fat.jar 改为 java -cp "lib/*:apps/app.jar" MainClass 循环依赖根治 去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链: ┌─────┐ │ SysConfigService 自引用 (删 @ Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上) 修复策略: 自引用:删字段,改用 this.xxx () 三角循环( PayInterfaceConfigService ↔ MchAppService/MchInfoService ):PayInterfaceConfigService.selectAllPayIfConfigListByAppId() 内部反向调用了 mchAppService.getById() 和 mchInfoService.getById()——这些只是 MyBatis-Plus 的简单 CRUD 委托。将这两个查询上移到 Controller 层,Service 方法改为接收 MchInfo 参数,依赖方向恢复。 两两循环:MchInfoService 注入 IsvInfoService 只是为了 getById(),IsvInfoService 注入 MchInfoService 只是为了 count()。直接替换为对应的 Mapper 注入,因为 MyBatis-Plus 的 ServiceImpl.getById() 底层就是 BaseMapper.selectById()。 关键认知: 依赖只能单向流动。找到"谁在反向调用"就是断环点。 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。 不要用 @ Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。 最终效果 ┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @ Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

V2EX - 技术 · 2026-05-22 21:49:51+08:00 · tech

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅 项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。 前端集成引发的连锁反应 原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑: Vue SPA 路由 fallback:Spring Boot 3.x 默认用 PathPatternParser ,addViewControllers 不支持 {spring:\w+} 正则。最终用 @Order(HIGHEST_PRECEDENCE) 的 Filter 拦截无后缀路径 forward 到 index.html 。 Spring Security 6 ignoring() 不生效:日志明确警告 You are asking Spring Security to ignore... This is not recommended 。改为 authorizeHttpRequests().permitAll() 才生效。 字体文件 401:Security 的静态资源豁免模式漏了 .woff/.woff2/.ttf/.eot 。 前端构建 API baseURL 双层 /api/api/:VITE_API_BASE_URL=/api 拼接 url: '/api/xxx' → /api/api/xxx 。改为空值。 发行包瘦身:260MB → 120MB 三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案: 去掉未用依赖:jaxb-api(零 import)、mysql-connector-j(纯配置模块不需要)、activemq(仅编译,运行时用 RabbitMQ) 共享 lib:maven-dependency-plugin 收集所有传递依赖到 lib/(自动去重 182 个),antrun 解压 fat JAR 提取 BOOT-INF/classes/ 打包为 flat thin JAR(1.7-5MB) 启动方式:从 java -jar fat.jar 改为 java -cp "lib/*:apps/app.jar" MainClass 循环依赖根治 去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链: ┌─────┐ │ SysConfigService 自引用 (删 @ Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上) 修复策略: 自引用:删字段,改用 this.xxx () 三角循环( PayInterfaceConfigService ↔ MchAppService/MchInfoService ):PayInterfaceConfigService.selectAllPayIfConfigListByAppId() 内部反向调用了 mchAppService.getById() 和 mchInfoService.getById()——这些只是 MyBatis-Plus 的简单 CRUD 委托。将这两个查询上移到 Controller 层,Service 方法改为接收 MchInfo 参数,依赖方向恢复。 两两循环:MchInfoService 注入 IsvInfoService 只是为了 getById(),IsvInfoService 注入 MchInfoService 只是为了 count()。直接替换为对应的 Mapper 注入,因为 MyBatis-Plus 的 ServiceImpl.getById() 底层就是 BaseMapper.selectById()。 关键认知: 依赖只能单向流动。找到"谁在反向调用"就是断环点。 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。 不要用 @ Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。 最终效果 ┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @ Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

v2ex · 2026-05-22 21:49:51+08:00 · tech

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅 项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。 前端集成引发的连锁反应 原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑: Vue SPA 路由 fallback:Spring Boot 3.x 默认用 PathPatternParser ,addViewControllers 不支持 {spring:\w+} 正则。最终用 @Order(HIGHEST_PRECEDENCE) 的 Filter 拦截无后缀路径 forward 到 index.html 。 Spring Security 6 ignoring() 不生效:日志明确警告 You are asking Spring Security to ignore... This is not recommended 。改为 authorizeHttpRequests().permitAll() 才生效。 字体文件 401:Security 的静态资源豁免模式漏了 .woff/.woff2/.ttf/.eot 。 前端构建 API baseURL 双层 /api/api/:VITE_API_BASE_URL=/api 拼接 url: '/api/xxx' → /api/api/xxx 。改为空值。 发行包瘦身:260MB → 120MB 三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案: 去掉未用依赖:jaxb-api(零 import)、mysql-connector-j(纯配置模块不需要)、activemq(仅编译,运行时用 RabbitMQ) 共享 lib:maven-dependency-plugin 收集所有传递依赖到 lib/(自动去重 182 个),antrun 解压 fat JAR 提取 BOOT-INF/classes/ 打包为 flat thin JAR(1.7-5MB) 启动方式:从 java -jar fat.jar 改为 java -cp "lib/*:apps/app.jar" MainClass 循环依赖根治 去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链: ┌─────┐ │ SysConfigService 自引用 (删 @ Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上) 修复策略: 自引用:删字段,改用 this.xxx () 三角循环( PayInterfaceConfigService ↔ MchAppService/MchInfoService ):PayInterfaceConfigService.selectAllPayIfConfigListByAppId() 内部反向调用了 mchAppService.getById() 和 mchInfoService.getById()——这些只是 MyBatis-Plus 的简单 CRUD 委托。将这两个查询上移到 Controller 层,Service 方法改为接收 MchInfo 参数,依赖方向恢复。 两两循环:MchInfoService 注入 IsvInfoService 只是为了 getById(),IsvInfoService 注入 MchInfoService 只是为了 count()。直接替换为对应的 Mapper 注入,因为 MyBatis-Plus 的 ServiceImpl.getById() 底层就是 BaseMapper.selectById()。 关键认知: 依赖只能单向流动。找到"谁在反向调用"就是断环点。 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。 不要用 @ Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。 最终效果 ┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @ Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

V2EX - 技术 · 2026-05-22 21:49:51+08:00 · tech

Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅 项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。 前端集成引发的连锁反应 原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑: Vue SPA 路由 fallback:Spring Boot 3.x 默认用 PathPatternParser ,addViewControllers 不支持 {spring:\w+} 正则。最终用 @Order(HIGHEST_PRECEDENCE) 的 Filter 拦截无后缀路径 forward 到 index.html 。 Spring Security 6 ignoring() 不生效:日志明确警告 You are asking Spring Security to ignore... This is not recommended 。改为 authorizeHttpRequests().permitAll() 才生效。 字体文件 401:Security 的静态资源豁免模式漏了 .woff/.woff2/.ttf/.eot 。 前端构建 API baseURL 双层 /api/api/:VITE_API_BASE_URL=/api 拼接 url: '/api/xxx' → /api/api/xxx 。改为空值。 发行包瘦身:260MB → 120MB 三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案: 去掉未用依赖:jaxb-api(零 import)、mysql-connector-j(纯配置模块不需要)、activemq(仅编译,运行时用 RabbitMQ) 共享 lib:maven-dependency-plugin 收集所有传递依赖到 lib/(自动去重 182 个),antrun 解压 fat JAR 提取 BOOT-INF/classes/ 打包为 flat thin JAR(1.7-5MB) 启动方式:从 java -jar fat.jar 改为 java -cp "lib/*:apps/app.jar" MainClass 循环依赖根治 去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链: ┌─────┐ │ SysConfigService 自引用 (删 @ Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上) 修复策略: 自引用:删字段,改用 this.xxx () 三角循环( PayInterfaceConfigService ↔ MchAppService/MchInfoService ):PayInterfaceConfigService.selectAllPayIfConfigListByAppId() 内部反向调用了 mchAppService.getById() 和 mchInfoService.getById()——这些只是 MyBatis-Plus 的简单 CRUD 委托。将这两个查询上移到 Controller 层,Service 方法改为接收 MchInfo 参数,依赖方向恢复。 两两循环:MchInfoService 注入 IsvInfoService 只是为了 getById(),IsvInfoService 注入 MchInfoService 只是为了 count()。直接替换为对应的 Mapper 注入,因为 MyBatis-Plus 的 ServiceImpl.getById() 底层就是 BaseMapper.selectById()。 关键认知: 依赖只能单向流动。找到"谁在反向调用"就是断环点。 大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。 不要用 @ Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。 最终效果 ┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @ Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘

IT之家 · 2026-05-21 15:24:25+08:00 · tech

IT之家 5 月 21 日消息,科技媒体 cyberkendra 昨日(5 月 20 日)发布博文, 报道称 Linux 内核再次曝光名为 PinTheft 的提权漏洞,相关补丁已经进入上游内核。 在 Copy Fail (4 月 29 日)、 Dirty Frag (5 月 7 日)、Fragnesia (5 月 13 日)以及 Qualys 威胁研究部门(TRU)披露 CVE-2026-46333 漏洞外,这是过去 3 周内曝光的第 5 个高危漏洞。 PinTheft 漏洞由 V12 安全团队的 Aaron Esau 发现,问题出在 RDS(Reliable Datagram Sockets,可靠数据报套接字)的零拷贝发送路径。 rds_message_zcopy_from_user()在逐页把用户态内存固定到内核空间后,如果后续页面触发错误,错误处理路径会先释放已固定页面;但后续 RDS 消息清理又会再次释放一次,于是形成 double-free。 单看引用计数错误,这类问题通常不容易直接变成稳定提权。不过 PinTheft 把 io_uring 拉进了利用链。 攻击者先把一个匿名内存页注册成 io_uring 固定缓冲区,并赋予 1024 个引用偏置;随后通过 1024 次故意失败的 RDS 发送,逐步耗尽这些引用,最终让 io_uring 手里留下一个本不该再持有的悬空指针。 接下来,利用代码会把目标 SUID 二进制的第一页逐出缓存,再回收同一个物理页,并借助 io_uring 的悬空缓冲区指针覆写特权程序的页缓存。 原文提到, /usr/bin/su 、passwd 和 pkexec 都是优先目标,攻击者随后运行被改写的程序,就能直接拿到 root shell。 不过,这个漏洞的利用门槛并不算低。除了需要加载 RDS 模块,系统还必须启用 io_uring,存在可读的 SUID-root 二进制文件,并且运行在 x86_64 平台。 按原文测试结果,在常见发行版中,只有 Arch Linux 默认加载了所需的 RDS 模块,其他主流发行版并不会开箱即用加载它,因此受影响范围相对有限。 IT之家附上参考地址 PinTheft

cnBeta全文版 · 2026-05-19 19:05:46+08:00 · tech

在美国明尼阿波利斯举行的北美开源峰会上,微软意外公布了其首个面向服务器场景的通用 Linux 发行版——Azure Linux 4.0。这意味着,长期深度依赖 Linux 的微软,正以官方发行版的形式,进一步承认自己在云和服务器领域“事实上是一家以 Linux 为基础”的公司。 发布这一消息的是 Kubernetes 联合创始人、现任微软 Azure 云原生与管理平台及开源业务公司副总裁 Brendan Burns。他在演讲中回顾称,自己十年前加入 Azure 时,Linux 还不是该云平台上的主流操作系统,而如今 Linux 已成为 Azure 上的主要操作系统。随后他宣布,微软将向所有 Azure 用户提供一个由微软官方支持的开源 Linux 发行版,并可在 Azure 上自由使用。这一突如其来的消息让在场不少业内人士一度愣住,连 Linux 基金会 CEO Jim Zemlin 都特意把他叫回台上确认是否真的“宣布了一个微软 Linux 发行版”。 事实上,微软此前已多次在特定场景中采用自研 Linux 方案,例如用于边缘计算设备的 Azure Sphere,以及后来用于容器平台的 CBL-Mariner,这一发行版后来被更名为 Azure Linux。不过,这些系统一直主要服务于内部或特定云场景,并非面向公众的一般用途发行版。Azure Linux 4.0 的推出则标志着微软首次将自家 Linux 打造成面向广泛云工作负载的通用云发行版。 根据微软 Azure 开源团队首席项目经理 Lachlan Everson 的介绍,当前的 Azure Linux 被一分为二:一条线是全新版本 Azure Linux 4.0,定位为面向所有 Azure 客户的通用虚拟机镜像;另一条线则是基于 Flatcar Container Linux 打造的 Azure Container Linux(ACL),专门用于提供强化、安全、不可变的容器宿主环境。此前的 Azure Linux 3.0 仅通过 Azure Kubernetes Service(AKS)向第三方客户提供,主要作为容器主机使用,未来这一角色将由 Azure Container Linux 来承担。 Everson 表示,Azure Linux 4.0 是微软在内部长期运行和迭代 Azure Linux 的成果延伸,也是早期 Mariner 发行版演进的集中体现。在技术架构上,Azure Linux 4.0 以上游 Fedora Linux 为基础,使用 Fedora 生态的 RPM 包,并以开源形式在 GitHub 上提供源代码。微软在此基础上对软件包和供应链进行统一策划和裁剪,使其更适配 Azure 云平台的基础设施,并实现与 Azure 底层环境的深度垂直整合,从而为用户提供针对 Azure 场景优化的 Linux 体验。 在交付形态上,Azure Linux 4.0 首先以虚拟机镜像的方式在 Azure 上提供。微软同时计划通过 Windows Subsystem for Linux(WSL)为开发者带来桌面侧的使用路径,让开发者可以在 Windows 11 设备上本地运行 Azure Linux,以获得与云端一致的运行环境。不过,Everson 明确表示,Azure Linux 并不会被打造成传统意义上的桌面 Linux 发行版,目前没有提供图形界面的计划。其核心目标仍是为云端和服务器场景提供一个精简、可复现、与 Azure 环境高度一致的开发和运行平台。 与 Azure Linux 4.0 相对,Azure Container Linux 则聚焦于容器化工作负载,尤其是在 AKS 上的容器宿主需求。Flatcar 仍将作为上游社区项目存在,而微软会在此基础上进行加固和产品化,提供默认安全、不可变、面向生产的容器宿主系统。在这种不可变架构下,系统不提供传统的包管理器,系统组件和应用由镜像构建阶段一次性“烘焙”进系统,运行中不建议直接修改系统或应用包,业务变更应通过容器工作负载进行交付和更新。 针对现有 Azure Linux 3.x 用户,微软承诺提供顺畅的升级路径,而非破坏性迁移。Everson 表示,用户可以直接从现有环境升级,无需重新部署。在生命周期方面,Azure Linux 单个版本的支持周期为两年,在此期间微软将选取并维持相对稳定的内核版本,并提供可预期的升级路径及每月安全更新节奏。如果出现严重漏洞(如重大 CVE),微软则将尽快推出修复后的系统镜像,而不会仅仅等待例行的月度补丁节奏。 安全性被视为 Azure Linux 的核心价值之一。微软希望通过自建和自控整个发行版供应链,将系统暴露的攻击面降到最低,并通过精选内核和精简软件包来强化安全基线。在运维方面,Azure Linux 支持按需“自动升级”模式,用户可以选择基于安全级别自动完成更新,特别是对大规模部署场景,系统会以渐进方式滚动升级,以降低对业务的影响。同时,对于负载特殊或对变更敏感的用户,仍可选择关闭自动升级,按自身节奏控制更新。 在更宏观的定位上,微软将 Azure Linux 视作对“AI 原生”时代基础平台需求的回应。Everson 指出,当前几乎所有 AI 应用都构建在 Linux 栈之上,微软在为自身 AI 服务(包括 Microsoft 365、GitHub、以及 OpenAI 的 ChatGPT 等)构建和运营大规模 Linux 平台方面积累了丰富实践,而 Azure Linux 正是把这些经验产品化,赋能客户在 AI 原生时代构建自己的云工作负载。根据微软公开的数据显示,如今 Azure 上超过三分之二的客户计算核心运行在 Linux 上,支撑 ChatGPT 每天处理数十亿次请求的,也是基于 Linux 和 Kubernetes 的基础设施。 值得注意的是,微软强调 Azure Linux 并非要取代 Azure 生态中既有的 Linux 发行版,而是作为“电池全配”的一项新增选项。微软表示,已与 Red Hat 等合作伙伴保持沟通,后者知晓 Azure Linux 的推出。当前 Azure 平台上仍有多家获官方背书的 Linux 发行版,包括 Red Hat、Ubuntu 等,用户可以继续像以往一样在 Azure 上选择偏好的 Linux 系统。Azure Linux 则更多承担起由微软统一提供、统一维护、安全强化的一体化平台角色,为那些希望获得“微软原生”云体验的客户提供选择。 从曾经的“Linux 是癌症”言论,到今天正式发布面向云服务器场景的 Linux 发行版并将其置于战略核心,微软在开源与 Linux 生态中的角色已经发生根本转变。在桌面之外,微软正在事实上成为一家高度依赖 Linux 的公司,而 Azure Linux 4.0 的出现,无疑是这一长期演变过程中的关键一步。 了解更多: https://opensource.microsoft.com/blog/2026/05/18/from-open-source-to-agentic-systems-microsoft-at-open-source-summit-north-america-2026/ 查看评论

cnBeta全文版 · 2026-05-18 22:35:11+08:00 · tech

Mozilla 已正式提供 Firefox 151 的发行版安装包,这是其开源浏览器的最新月度更新。此次版本原本一度传出会加入原生 JPEG-XL 图像解码器,但该功能已推迟到 Firefox 152 beta。该版本同时带来了内置 VPN 支持更新、隐私浏览改进、多项设置调整,以及在 Firefox PDF 查看器中直接合并多个 PDF 的能力。 在面向 Linux 和 macOS 的改动中,Firefox 151 新增了本地配置文件备份功能,并支持跨平台恢复。对于经常在 macOS 与 Linux 之间迁移或找回 Firefox 配置的用户来说,这意味着无需再手动复制隐藏目录,就能更方便地完成转移与恢复。 Firefox 151 还加入了对 Document Picture-in-Picture API 的支持。这项 API 允许创建一个始终置顶的窗口,并在其中放入任意 HTML 内容,适合用于视频会议等场景下的自定义控制面板或补充信息展示,从而比传统的视频画中画更灵活。 Mozilla 的开发者文档已对 documentPictureInPicture 作出说明,而 Google Chrome 早在 Chrome 116 起就已经支持这一能力。Firefox 151.0 的官方发行版二进制文件现已可从 Mozilla 的发布页面下载: https://ftp.mozilla.org/pub/firefox/releases/151.0/ 查看评论