<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Arvin的网络日志</title>
    <link>https://www.arvintian.cn/</link>
    <description>Recent content on Arvin的网络日志</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>Arvin | &lt;a href=&#39;https://beian.miit.gov.cn/&#39; style=&#39;color: #8a8a8a&#39; &gt;豫ICP备17028438号&lt;/a&gt;</copyright>
    <lastBuildDate>Fri, 08 May 2026 20:42:18 +0800</lastBuildDate>
    
        <atom:link href="https://www.arvintian.cn/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>关于</title>
      <link>https://www.arvintian.cn/about/</link>
      <pubDate>Sat, 09 May 2026 10:55:12 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/about/</guid>
      
        <description>&lt;h3 id=&#34;技术栈&#34;&gt;技术栈&lt;/h3&gt;
&lt;p&gt;Python/Golang&lt;br /&gt;
Web开发&lt;br /&gt;
Unix系统、网络编程&lt;br /&gt;
容器技术&lt;/p&gt;
&lt;h3 id=&#34;关注领域&#34;&gt;关注领域&lt;/h3&gt;
&lt;p&gt;Web开发、Serverless&lt;br /&gt;
云、容器、PaaS&lt;/p&gt;
&lt;h3 id=&#34;工作经历&#34;&gt;工作经历&lt;/h3&gt;
&lt;p&gt;老虎证券（2024——至今），高级云平台运维工程师&lt;br /&gt;
百度（2023——2024），高级运维开发工程师&lt;br /&gt;
新浪网（2020——2023），高级运维开发工程师&lt;br /&gt;
北京时代复兴投资管理有限公司（2018——2020）, 全栈研发工程师&lt;/p&gt;
&lt;h3 id=&#34;社交&#34;&gt;社交&lt;/h3&gt;
&lt;p&gt;Github: &lt;a href=&#34;https://github.com/Arvintian&#34;&gt;https://github.com/Arvintian&lt;/a&gt;&lt;br /&gt;
Weibo: &lt;a href=&#34;https://weibo.com/u/5803745670&#34;&gt;https://weibo.com/u/5803745670&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;开源项目&#34;&gt;开源项目&lt;/h3&gt;
&lt;p&gt;FaaS Platform: &lt;a href=&#34;https://github.com/refunc/refunc&#34;&gt;https://github.com/refunc/refunc&lt;/a&gt;&lt;br /&gt;
Python Web框架: &lt;a href=&#34;https://github.com/Arvintian/nuxt&#34;&gt;https://github.com/Arvintian/nuxt&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;感谢您的关注&#34;&gt;感谢您的关注&lt;/h2&gt;
&lt;center&gt;&lt;img src=&#34;https://www.arvintian.cn/server/index.php?s=/api/attachment/visitFile/sign/d9c51da228e4723a9788375043de9072&#34; width=&#34;40%&#34; height=&#34;40%&#34;&gt;&lt;/center&gt;
&lt;h2 id=&#34;感谢您的支持&#34;&gt;感谢您的支持&lt;/h2&gt;
&lt;center&gt;&lt;img src=&#34;https://www.arvintian.cn/server/index.php?s=/api/attachment/visitFile&amp;sign=74b78845b88ee8db06ad0a0504c18a98&#34; width=&#34;40%&#34; height=&#34;40%&#34;&gt;&lt;/center&gt;
&lt;h2 id=&#34;赞助者名单&#34;&gt;赞助者名单&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;赞赏者&lt;/th&gt;
&lt;th&gt;赞赏金额&lt;/th&gt;
&lt;th&gt;赞赏日期&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;闫*飞&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;2021-08-19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;唐*&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2022-10-21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description>
      
    </item>
    
    <item>
      <title>SD卡速度规格详解及使用场景对照</title>
      <link>https://www.arvintian.cn/post/other/it/sd%E5%8D%A1%E9%80%9F%E5%BA%A6%E8%A7%84%E6%A0%BC%E8%AF%A6%E8%A7%A3%E5%8F%8A%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%AF%B9%E7%85%A7/</link>
      <pubDate>Fri, 08 May 2026 20:42:18 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/other/it/sd%E5%8D%A1%E9%80%9F%E5%BA%A6%E8%A7%84%E6%A0%BC%E8%AF%A6%E8%A7%A3%E5%8F%8A%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E5%AF%B9%E7%85%A7/</guid>
      
        <description>&lt;h3 id=&#34;sd卡速度规格详解及使用场景对照&#34;&gt;SD卡速度规格详解及使用场景对照&lt;/h3&gt;
&lt;p&gt;SD卡的速度等级由多个不同的标准组成，分别针对&lt;strong&gt;最低写入速度&lt;/strong&gt;、&lt;strong&gt;总线传输速度&lt;/strong&gt;和&lt;strong&gt;应用性能&lt;/strong&gt;。以下是详细的对照表和使用建议：&lt;/p&gt;
&lt;h4 id=&#34;1-核心速度等级对照表&#34;&gt;1. 核心速度等级对照表&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;left&#34;&gt;标识图标&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;全称/含义&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;最低持续写入速度&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;主要应用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;Class 2&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Speed Class 2&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;早期SD卡，仅适合低分辨率视频或音频存储（现已淘汰）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;Class 4&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Speed Class 4&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;4 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;普通标清视频、非高清照片存储（现已较少见）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;Class 6&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Speed Class 6&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;6 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;高清视频录制、普通数码相机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;Class 10&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Speed Class 10&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;10 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;1080P全高清视频录制、单反相机连拍（经典入门标准）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;U1&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;UHS Speed Class 1&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;10 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;等同于Class 10，用于1080P视频、普通4K视频&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;U3&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;UHS Speed Class 3&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;30 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;高码率4K视频&lt;/strong&gt;、8K视频基础、高速连拍、专业摄影&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;V6&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Video Speed Class 6&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;6 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;低码率视频录制（较少见）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;V10&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Video Speed Class 10&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;10 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;1080P视频录制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;V30&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Video Speed Class 30&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;30 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;主流4K视频&lt;/strong&gt;、高像素连拍（目前最通用的中高端标准）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;V60&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Video Speed Class 60&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;60 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;高码率4K/8K视频、RAW格式高速连拍、双卡槽写入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;V90&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Video Speed Class 90&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;90 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;极致专业视频&lt;/strong&gt;（如8K 60fps）、高码率RAW连拍、电影制作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;2-总线传输速度层级-uhs&#34;&gt;2. 总线传输速度层级 (UHS)&lt;/h4&gt;
&lt;p&gt;这代表了SD卡与读卡器/相机之间的&lt;strong&gt;理论最大传输带宽&lt;/strong&gt;，影响照片/视频从卡导出到电脑的速度。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;left&#34;&gt;标准&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;理论最大读取速度&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;UHS-I&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;104 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;最常见，单排金手指。满足绝大多数消费级需求。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;UHS-II&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;312 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;双排金手指（底部多一排触点）。需配合UHS-II读卡器使用，导出速度极快，适合专业摄影师。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;UHS-III&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;624 MB/s&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;较新标准，双排金手指，速度翻倍，目前高端专业设备开始支持。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;3-应用性能等级-a-class---主要针对手机microsd&#34;&gt;3. 应用性能等级 (A-Class) - 主要针对手机/microSD&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;left&#34;&gt;等级&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;含义&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;适用场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;A1&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;随机读取/写入性能提升&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;适合在手机上运行APP、存储游戏数据。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;A2&lt;/strong&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;随机读写性能大幅提升（IOPS更高）&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;strong&gt;推荐用于Android手机、Switch、无人机&lt;/strong&gt;，能显著提升APP加载速度和系统流畅度。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;选购建议与使用场景匹配&#34;&gt;选购建议与使用场景匹配&lt;/h3&gt;
&lt;h4 id=&#34;-场景一普通家用--行车记录仪--监控摄像头&#34;&gt;📷 场景一：普通家用 / 行车记录仪 / 监控摄像头&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐规格&lt;/strong&gt;：&lt;strong&gt;Class 10&lt;/strong&gt; 或 &lt;strong&gt;U1 / V10&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;：这类设备对持续写入速度要求不高，10MB/s 足以应对1080P视频循环覆盖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：监控/行车记录仪需选择“高耐久（High Endurance）”系列，因为它们是7x24小时不断写入。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;-场景二日常摄影--旅行--1080p-或-基础-4k-视频&#34;&gt;📸 场景二：日常摄影 / 旅行 / 1080P 或 基础 4K 视频&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐规格&lt;/strong&gt;：&lt;strong&gt;U3 / V30&lt;/strong&gt; + &lt;strong&gt;UHS-I&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;：V30保证30MB/s的持续写入，能稳定录制4K视频不卡顿。UHS-I接口足以应付日常照片导入。这是目前&lt;strong&gt;性价比最高、最通用&lt;/strong&gt;的选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;-场景三专业视频创作--8k视频--高码率4k&#34;&gt;🎥 场景三：专业视频创作 / 8K视频 / 高码率4K&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐规格&lt;/strong&gt;：&lt;strong&gt;V60&lt;/strong&gt; 或 &lt;strong&gt;V90&lt;/strong&gt; + &lt;strong&gt;UHS-II&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;：拍摄高码率视频（如4K 120fps或8K）时，数据量巨大，V60/V90能防止缓冲区溢出（爆红/停止录制）。UHS-II接口能实现秒传大量素材，节省后期时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：必须搭配支持UHS-II的读卡器和电脑接口（USB 3.1/3.2 Gen 2或Thunderbolt）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;-场景四手机扩容--switch--无人机--运动相机&#34;&gt;📱 场景四：手机扩容 / Switch / 无人机 / 运动相机&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐规格&lt;/strong&gt;：&lt;strong&gt;microSDXC&lt;/strong&gt; + &lt;strong&gt;A2&lt;/strong&gt; + &lt;strong&gt;V30/U3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A2&lt;/strong&gt;：确保在手机或Switch上运行大型游戏和APP时加载速度快。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V30/U3&lt;/strong&gt;：确保在GoPro、大疆无人机等设备上录制4K高清视频不掉帧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;耐用性&lt;/strong&gt;：运动相机建议使用“加固版”或“高耐用”系列，以抵抗高温和震动。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>RHEL系Linux更新内核</title>
      <link>https://www.arvintian.cn/post/linux/rhel%E7%B3%BBlinux%E6%9B%B4%E6%96%B0%E5%86%85%E6%A0%B8/</link>
      <pubDate>Thu, 11 Sep 2025 15:20:23 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/linux/rhel%E7%B3%BBlinux%E6%9B%B4%E6%96%B0%E5%86%85%E6%A0%B8/</guid>
      
        <description>&lt;h2 id=&#34;elrepo-简介&#34;&gt;ELRepo 简介&lt;/h2&gt;
&lt;p&gt;项目主页：http://elrepo.org&lt;/p&gt;
&lt;p&gt;Enterprise Linux 软件包的 RPM 存储库。ELRepo 支持 Red Hat Enterprise Linux (RHEL) 及其衍生产品，如CentOS Linux、AlmaLinux 和 Rocky Linux。&lt;/p&gt;
&lt;h2 id=&#34;启用-elrepo&#34;&gt;启用 ELRepo&lt;/h2&gt;
&lt;p&gt;从 CentOS 8 开始，ELRepo 已经加入到官方软件仓库中，名称为 “elrepo-release”。&lt;/p&gt;
&lt;p&gt;AlmaLinux 和 Rocky Linux 同样适用。&lt;/p&gt;
&lt;p&gt;启用 ELRepo 只需要执行命令：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dnf -y install elrepo-release
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;升级内核&#34;&gt;升级内核&lt;/h2&gt;
&lt;p&gt;查询 ELRepo 中的 kernel 版本&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum --disablerepo=&amp;#34;*&amp;#34; --enablerepo=&amp;#34;elrepo-kernel&amp;#34; list available
yum --disablerepo=&amp;#34;*&amp;#34; --enablerepo=&amp;#34;elrepo-kernel&amp;#34; list available --showduplicates #查看所有版本
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;kernel-ml 中的 ml 是英文 “mainline stable” 的缩写，elrepo-kernel 中列出来的是最新的稳定主线版本。&lt;br /&gt;
kernel-lt 中的 lt 是英文 “long term support” 的缩写，elrepo-kernel 中列出来的长期支持版本。&lt;/p&gt;
&lt;p&gt;安装 kernel&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum --disablerepo=&amp;#34;*&amp;#34; --enablerepo=elrepo-kernel install kernel-ml kernel-ml-core kernel-ml-devel kernel-ml-modules  kernel-ml-modules-extra
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;慎重装kernel-ml-headers包，会和发行版的kernel-headers包冲突&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error:
 Problem: package kernel-ml-headers-6.16.6-1.el8.elrepo.x86_64 from elrepo-kernel conflicts with kernel-headers &amp;lt; 6.16.6-1.el8.elrepo provided by kernel-headers-4.18.0-553.34.1.el8_10.x86_64 from @System
  - cannot install the best candidate for the job
  - problem with installed package kernel-headers-4.18.0-553.34.1.el8_10.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;elrepo官方提示:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;There is no need to install the kernel-lt-headers package. It is only necessary if you intend to rebuild glibc and, thus, the entire operating system. If there is a need to have the kernel headers installed, you should use the current distributed kernel-headers package as that is related to the current version of glibc. When you see a message like “your kernel headers for kernel xxx cannot be found …”, you most likely need the kernel-lt-devel package, not the kernel-lt-headers package.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;kernel-headers包是给用户态程序用的，个人理解为类似libc标准库里的*unix规范接口函数，不同版本内核间相当稳定，所以使用发行版的即可。&lt;br /&gt;
kernel-devel包是给开发内核态程序\内核模块用的，不通版本内核间就有差异，所以需要单独装。&lt;/p&gt;
&lt;p&gt;所以常规仅仅是使用新版本内核，不需要装kernel-ml-headers，保持使用发行版的kernel-headers，而且升级发行版的kernel版本时kernel-headers也可能不会一起更新，kernel-headers在需要时才会更新。&lt;/p&gt;
&lt;p&gt;发行版源的其他软件，都依赖发行版的kernel-headers，忽略冲突安装可能造成其他软件安装失败，&lt;a href=&#34;https://www.rockylinux.cn/notes/rocky-linux-9-nei-he-sheng-ji-zhi-6.html&#34;&gt;https://www.rockylinux.cn/notes/rocky-linux-9-nei-he-sheng-ji-zhi-6.html&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;查询安装的 kernel 包&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rpm -qa|grep kernel
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看和设置默认启动项&lt;/p&gt;
&lt;p&gt;grubby 是一个命令行工具，用于更新和显示有关 grub2 和 zipl 引导加载程序的配置文件的信息。它主要设计用于安装新内核并需要查找有关当前引导环境的信息的脚本。同时也可以对启动内核的各项信息参数进行修改。&lt;/p&gt;
&lt;p&gt;在 CentOS 8 在已经自带该命令，如果没有通过 yum install grubby 来安装即可。&lt;/p&gt;
&lt;p&gt;查看当前的默认启动内核：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --default-kernel
/boot/vmlinuz-5.15.4-1.el8.elrepo.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看系统安装的全部内核：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --info=ALL

index=0
kernel=&amp;#34;/boot/vmlinuz-5.15.4-1.el8.elrepo.x86_64&amp;#34;
args=&amp;#34;ro crashkernel=auto net.ifnames=0 $tuned_params&amp;#34;
root=&amp;#34;UUID=56c34ece-6010-480e-aeac-dea98b8ffcd3&amp;#34;
initrd=&amp;#34;/boot/initramfs-5.15.4-1.el8.elrepo.x86_64.img $tuned_initrd&amp;#34;
title=&amp;#34;Rocky Linux (5.15.4-1.el8.elrepo.x86_64) 8.5 (Green Obsidian)&amp;#34;
id=&amp;#34;032ed95ba9c0471381bbb6b416eff523-5.15.4-1.el8.elrepo.x86_64&amp;#34;
index=1
kernel=&amp;#34;/boot/vmlinuz-4.18.0-348.2.1.el8_5.x86_64&amp;#34;
args=&amp;#34;ro crashkernel=auto net.ifnames=0 $tuned_params&amp;#34;
root=&amp;#34;UUID=56c34ece-6010-480e-aeac-dea98b8ffcd3&amp;#34;
initrd=&amp;#34;/boot/initramfs-4.18.0-348.2.1.el8_5.x86_64.img $tuned_initrd&amp;#34;
title=&amp;#34;Rocky Linux (4.18.0-348.2.1.el8_5.x86_64) 8.5 (Green Obsidian)&amp;#34;
id=&amp;#34;032ed95ba9c0471381bbb6b416eff523-4.18.0-348.2.1.el8_5.x86_64&amp;#34;
index=2
kernel=&amp;#34;/boot/vmlinuz-4.18.0-348.el8.x86_64&amp;#34;
args=&amp;#34;ro crashkernel=auto net.ifnames=0 $tuned_params intel_iommu=on&amp;#34;
root=&amp;#34;UUID=56c34ece-6010-480e-aeac-dea98b8ffcd3&amp;#34;
initrd=&amp;#34;/boot/initramfs-4.18.0-348.el8.x86_64.img $tuned_initrd&amp;#34;
title=&amp;#34;AlmaLinux (4.18.0-348.el8.x86_64) 8.5 (Arctic Sphynx)&amp;#34;
id=&amp;#34;032ed95ba9c0471381bbb6b416eff523-4.18.0-348.el8.x86_64&amp;#34;
index=3
kernel=&amp;#34;/boot/vmlinuz-0-rescue-032ed95ba9c0471381bbb6b416eff523&amp;#34;
args=&amp;#34;ro crashkernel=auto net.ifnames=0&amp;#34;
root=&amp;#34;UUID=56c34ece-6010-480e-aeac-dea98b8ffcd3&amp;#34;
initrd=&amp;#34;/boot/initramfs-0-rescue-032ed95ba9c0471381bbb6b416eff523.img&amp;#34;
title=&amp;#34;AlmaLinux (0-rescue-032ed95ba9c0471381bbb6b416eff523) 8.5 (Arctic Sphynx)&amp;#34;
id=&amp;#34;032ed95ba9c0471381bbb6b416eff523-0-rescue&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看特定内核的具体信息：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --info=/boot/vmlinuz-4.18.0-348.el8.x86_64
index=1
kernel=&amp;#34;/boot/vmlinuz-4.18.0-348.el8.x86_64&amp;#34;
args=&amp;#34;ro crashkernel=auto net.ifnames=0 $tuned_params&amp;#34;
root=&amp;#34;UUID=56c34ece-6010-480e-aeac-dea98b8ffcd3&amp;#34;
initrd=&amp;#34;/boot/initramfs-4.18.0-348.el8.x86_64.img $tuned_initrd&amp;#34;
title=&amp;#34;AlmaLinux (4.18.0-348.el8.x86_64) 8.5 (Arctic Sphynx)&amp;#34;
id=&amp;#34;032ed95ba9c0471381bbb6b416eff523-4.18.0-348.el8.x86_64&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;设置新的默认启动内核：&lt;/p&gt;
&lt;p&gt;使用路径来指定内核，可以使用 &amp;ndash;set-default=kernel-path&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --set-default=/boot/vmlinuz-4.18.0-348.el8.x86_64
The default is /boot/loader/entries/032ed95ba9c0471381bbb6b416eff523-4.18.0-348.el8.x86_64.conf with index 1 and kernel /boot/vmlinuz-4.18.0-348.el8.x86_64

grubby --default-kernel
/boot/vmlinuz-4.18.0-348.el8.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;使用 index 来指定内核，则使用 &amp;ndash;set-default-index=entry-index&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --set-default-index=1
The default is /boot/loader/entries/032ed95ba9c0471381bbb6b416eff523-4.18.0-348.el8.x86_64.conf with index 1 and kernel /boot/vmlinuz-4.18.0-348.el8.x86_64

grubby --default-kernel
/boot/vmlinuz-4.18.0-348.el8.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重启后生效&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;删除旧内核（可选）&lt;/p&gt;
&lt;p&gt;从启动项中删除旧内核&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grubby --remove-kernel=/boot/vmlinuz-4.18.0-348.el8.x86_64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;删除旧内核文件&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 删除旧内核
yum remove kernel-4.18.0 kernel-core-4.18.0 kernel-modules-4.18.0 kernel-devel-4.18.0
# 需要注意，是否同时删除一些依赖包。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;kernel相关的rpm包说明&#34;&gt;Kernel相关的RPM包说明&lt;/h2&gt;
&lt;p&gt;kernel-core&lt;br /&gt;
提供内核的二进制镜像、所有与 initramfs相关的对象来引导系统，以及确保核心功能的最小内核模块数量。&lt;/p&gt;
&lt;p&gt;kernel-modules&lt;br /&gt;
提供 kernel-core 中不存在的其余内核模块。&lt;/p&gt;
&lt;p&gt;kernel-modules-extra&lt;br /&gt;
为罕见硬件提供内核模块。默认禁用模块的加载。&lt;/p&gt;
&lt;p&gt;kernel-debug&lt;br /&gt;
提供了启用了许多调试选项的内核，以便进行内核诊断，以降低性能为代价。&lt;/p&gt;
&lt;p&gt;kernel-tools&lt;br /&gt;
提供了操作 Linux 内核和支持文档的工具。&lt;/p&gt;
&lt;p&gt;kernel-devel&lt;br /&gt;
提供了内核标头和 makefile，来足以针对 kernel 软件包构建模块。&lt;/p&gt;
&lt;p&gt;kernel-abi-stablelists&lt;br /&gt;
提供与 RHEL 内核 ABI 相关的信息，包括外部 Linux 内核模块所需的内核符号列表和 yum 插件以协助执行。&lt;/p&gt;
&lt;p&gt;kernel-headers&lt;br /&gt;
包括指定 Linux 内核和用户空间库以及程序间接口的 C 标头文件。头文件定义构建大多数标准程序所需的结构和常量。&lt;/p&gt;
&lt;h2 id=&#34;安装elrepo历史版本内核&#34;&gt;安装ELRepo历史版本内核&lt;/h2&gt;
&lt;p&gt;官方的elrepo, lt和ml都只有当前版本的包。&lt;/p&gt;
&lt;p&gt;如果要指定安装指定版本的内核，可以从这里&lt;a href=&#34;https://mirrors.coreix.net/elrepo-archive-archive/kernel/&#34;&gt;https://mirrors.coreix.net/elrepo-archive-archive/kernel/&lt;/a&gt;下载RPM包。&lt;/p&gt;
&lt;p&gt;例如rockylinux8目前了mainline是6.x，安装高版本的5.x:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget -c https://mirrors.coreix.net/elrepo-archive-archive/kernel/el8/x86_64/RPMS/kernel-ml-5.19.9-1.el8.elrepo.x86_64.rpm
wget -c https://mirrors.coreix.net/elrepo-archive-archive/kernel/el8/x86_64/RPMS/kernel-ml-core-5.19.9-1.el8.elrepo.x86_64.rpm
wget -c https://mirrors.coreix.net/elrepo-archive-archive/kernel/el8/x86_64/RPMS/kernel-ml-devel-5.19.9-1.el8.elrepo.x86_64.rpm
wget -c https://mirrors.coreix.net/elrepo-archive-archive/kernel/el8/x86_64/RPMS/kernel-ml-modules-5.19.9-1.el8.elrepo.x86_64.rpm
wget -c https://mirrors.coreix.net/elrepo-archive-archive/kernel/el8/x86_64/RPMS/kernel-ml-modules-extra-5.19.9-1.el8.elrepo.x86_64.rpm

# rpm -ivh --oldpackage kernel-ml-*
rpm -ivh kernel-ml-*
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;文章参考&#34;&gt;文章参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://sysin.org/blog/centos-8-upgrade-kernel/&#34;&gt;https://sysin.org/blog/centos-8-upgrade-kernel/&lt;/a&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>本地Lambda函数几行代码实现MCP Server</title>
      <link>https://www.arvintian.cn/post/faas/%E6%9C%AC%E5%9C%B0lambda%E5%87%BD%E6%95%B0%E5%87%A0%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0mcp-server/</link>
      <pubDate>Sat, 12 Apr 2025 16:56:26 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/faas/%E6%9C%AC%E5%9C%B0lambda%E5%87%BD%E6%95%B0%E5%87%A0%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0mcp-server/</guid>
      
        <description>&lt;p&gt;文章视频教程: &lt;a href=&#34;https://www.bilibili.com/video/BV1wWd8YNEZY/?vd_source=e14a954d1c7739b152548d58bf125603&#34;&gt;https://www.bilibili.com/video/BV1wWd8YNEZY/?vd_source=e14a954d1c7739b152548d58bf125603&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mcplambda&#34;&gt;MCP+Lambda&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://www.arvintian.cn/server/index.php?s=/api/attachment/visitFile&amp;amp;sign=2094508bd221348afe54a3b6cf7f0917&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;MCP服务器充当MCP客户端与Lambda函数之间的桥梁，使生成式AI模型能够访问和运行Lambda函数作为工具。&lt;/p&gt;
&lt;p&gt;社区项目 &lt;a href=&#34;https://github.com/danilop/MCP2Lambda&#34;&gt;https://github.com/danilop/MCP2Lambda&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是目前MCP在安全方面还比较弱，所以社区MCP工具基本都是本地工具，Lambda能不能也本地部署。&lt;/p&gt;
&lt;p&gt;Refunc是基于K8S的一个本地化的Lambda平台，可以实现本地部署Lambda函数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.arvintian.cn/server/index.php?s=/api/attachment/visitFile&amp;amp;sign=123f7495b8968fd7d09463b28a48bf9d&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h2 id=&#34;mcprefunc&#34;&gt;MCP+Refunc&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://www.arvintian.cn/server/index.php?s=/api/attachment/visitFile&amp;amp;sign=5dfca9b5fffee22531d48fc31dd1bc72&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Refunc社区跟进MCP发展，实现了任意函数通过MCP开放调用。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/refunc/mcp-server&#34;&gt;https://github.com/refunc/mcp-server&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;部署-refunc&#34;&gt;部署 Refunc&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;refunc-system&lt;/code&gt; 命名空间下部署所有 Refunc 组件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl apply -f https://raw.githubusercontent.com/refunc/mcp-server/refs/heads/main/deploy/play-all-in-one.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接着，将 Refunc 服务代理到本地。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl port-forward svc/aws-api 8000:http --address 0.0.0.0 -n refunc-system
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kubectl port-forward svc/mcp-server 8001:http --address 0.0.0.0 -n refunc-system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：演示部署中的数据是非持久化的。&lt;/p&gt;
&lt;h2 id=&#34;创建函数&#34;&gt;创建函数&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&#34;https://github.com/refunc/refunc-cli&#34;&gt;refunc-cli&lt;/a&gt; 创建一个函数。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install -U refunc-cli
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir mcp-demo &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd mcp-demo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rfctl init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;main.py&lt;/code&gt; 中编写任意代码，演示将回显一条问候消息。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AWS_DEFAULT_ENDPOINT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://127.0.0.1:8000 rfctl create
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意：您需要一个 Python 3 环境。&lt;/p&gt;
&lt;h2 id=&#34;创建-mcp-端点&#34;&gt;创建 MCP 端点&lt;/h2&gt;
&lt;p&gt;编辑 &lt;code&gt;lambda.yaml&lt;/code&gt; 并粘贴以下代码。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp-demo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;namespace&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;refunc-system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;build&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;source&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;manifest&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;requirements.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;language&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;architecture&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;x86_64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;handler&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;main.lambda_handler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;timeout&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;runtime&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;python3.10&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;concurrency&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ENV_TEST&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;TEST&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#  url:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#    cors:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      allowCredentials: true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      allowHeaders: &amp;#34;*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      allowMethods: &amp;#34;*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      allowOrigins: &amp;#34;*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      exposeHeaders: &amp;#34;*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#      maxAge: 300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;events&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# - name: hourly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#   type: cron&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#   mapping:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     cron: 0 * * * *&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     location: Asia/Shanghai&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     args:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#       var1: value1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     saveLog: false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;#     saveResult: false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;mapping&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;args&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp-demo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;tools&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;echo-hello&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;desc&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Echo a hello msg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;schema&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;properties&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;required&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;saveLog&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;saveResult&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;接下来，运行以下命令更新配置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;AWS_DEFAULT_ENDPOINT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://127.0.0.1:8000 rfctl update-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;演示的 MCP SSE 端点为：&lt;code&gt;http://127.0.0.1:8001/refunc-system/mcp-demo/test/mcp-demo/sse&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Refunc MCP SSE URL 路径格式为：&lt;code&gt;/namespace/&amp;lt;token-secret-name&amp;gt;/&amp;lt;token&amp;gt;/&amp;lt;func-name&amp;gt;/sse&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;refunc-mcp-事件规范&#34;&gt;Refunc MCP 事件规范&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 事件类型必须为 mcp。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;mapping&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;args&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;token&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mcp-demo&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 可以在 play-all-in-one.yaml 中找到的 token 秘钥名称。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;tools&lt;/span&gt;: &lt;span style=&#34;color:#75715e&#34;&gt;# MCP 工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;echo-hello&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# MCP 工具名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;desc&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Echo a hello msg&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# MCP 工具描述&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#f92672&#34;&gt;schema&lt;/span&gt;: &lt;span style=&#34;color:#75715e&#34;&gt;# MCP 工具参数，用有效的 JSON Schema 描述。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;properties&lt;/span&gt;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;required&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;saveLog&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;saveResult&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;事件的tools字段是一个数组，您可以通过一个函数实现多个tool。在调用函数时，Refunc 会添加两个内置参数：&lt;code&gt;_call_type&lt;/code&gt; 和 &lt;code&gt;_call_method&lt;/code&gt;，其中 &lt;code&gt;_call_method&lt;/code&gt; 是tool的名称。_call_type会表示调用来自MCP的什么类型，Tool、Resource或者Prompts。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>安伯尼可RG40xxV掌机设置远程管理游戏</title>
      <link>https://www.arvintian.cn/post/other/retrogame/%E5%AE%89%E4%BC%AF%E5%B0%BC%E5%8F%AFrg40xxv%E6%8E%8C%E6%9C%BA%E8%AE%BE%E7%BD%AE%E8%BF%9C%E7%A8%8B%E7%AE%A1%E7%90%86%E6%B8%B8%E6%88%8F/</link>
      <pubDate>Sat, 11 Jan 2025 14:17:56 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/other/retrogame/%E5%AE%89%E4%BC%AF%E5%B0%BC%E5%8F%AFrg40xxv%E6%8E%8C%E6%9C%BA%E8%AE%BE%E7%BD%AE%E8%BF%9C%E7%A8%8B%E7%AE%A1%E7%90%86%E6%B8%B8%E6%88%8F/</guid>
      
        <description>&lt;h2 id=&#34;开启ssh&#34;&gt;开启SSH&lt;/h2&gt;
&lt;p&gt;使用系统自带的文件管理器，编辑系统设置文件&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mnt/mod/ctrl/configs/system.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;添加开启ssh配置&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;global.ssh=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后重启，连接WIFI，从系统菜单配置获取IP地址。&lt;/p&gt;
&lt;p&gt;进入一个游戏，然后暂停，不然系统自动锁屏休眠，网络会断，配置好FTP以后传游戏时候也这样操作。&lt;/p&gt;
&lt;h2 id=&#34;安装vsftp服务器&#34;&gt;安装VSFTP服务器&lt;/h2&gt;
&lt;p&gt;使用xshell或者其他ssh终端工具登录，密码同用户名(猜出来的)，建议登录上去之后改掉，实测不影响系统使用。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh root@192.168.x.x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;会发现周哥的系统就是原生的Ubuntu。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Welcome to Ubuntu 22.04 LTS (GNU/Linux 4.9.170 aarch64)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;通过apt安装ftp服务器。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 系统默认用的清华的源666
apt update
apt install vsftpd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;配置vsftp&#34;&gt;配置VSFTP&lt;/h2&gt;
&lt;p&gt;直接在终端下vim配&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mv /etc/vsftpd.conf /etc/vsftpd.conf.bak
vim /etc/vsftpd.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vsftp配置如下&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_root=/mnt
allow_writeable_chroot=YES
pasv_enable=YES
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;开启root使用ftp登录&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vim /etc/ftpusers
删除或注释掉root行
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重启vsftp&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;systemctl restart vsftpd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;通过ftp管理游戏文件&#34;&gt;通过FTP管理游戏文件&lt;/h2&gt;
&lt;p&gt;下载FileZilla，FTP连接游戏机IP即可，FTP客户端使用参考其他教程。&lt;/p&gt;
&lt;p&gt;系统卡目录&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/mmc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;扩展卡目录&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/sdcard
&lt;/code&gt;&lt;/pre&gt;</description>
      
    </item>
    
    <item>
      <title>Docker部署MySQL主从复制</title>
      <link>https://www.arvintian.cn/post/devops/docker%E9%83%A8%E7%BD%B2mysql%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/</link>
      <pubDate>Wed, 09 Oct 2024 15:05:47 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/devops/docker%E9%83%A8%E7%BD%B2mysql%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/</guid>
      
        <description>&lt;h2 id=&#34;运维现场&#34;&gt;运维现场&lt;/h2&gt;
&lt;p&gt;已有一个通过Docker部署的MySQL单实例，实例中有多个库，且已有数据，备份容灾目的现扩充从库。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d --name mysql --restart unless-stopped -p 3406:3306 --log-opt max-size=50m \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=xxx \
mysql:5.7
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;主库调整&#34;&gt;主库调整&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The default configuration for MySQL can be found in /etc/mysql/my.cnf, which may !includedir additional directories such as /etc/mysql/conf.d or /etc/mysql/mysql.conf.d.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MySQL的镜像已经把主配置my.cnf映射到/etc/mysql/conf.d目录，所以只需自定义一个my.conf，通过目录挂载到容器里面即可。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[mysqld]
skip-host-cache
skip-name-resolve
server_id=1  //设置服务id
log_bin=mysql-bin //开启二进制日志
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

[mysql]

[mysqldump]
quick
quote-names
max_allowed_packet=16M
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;停止当前容器，修改启动命令，挂载my.cnf，重新启动。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d --name mysql --restart unless-stopped -p 3406:3306 --log-opt max-size=50m \
-v /data/mysql:/var/lib/mysql \
-v /data/mysql.conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xxx \
mysql:5.7
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看master状态。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MySQL [(none)]&amp;gt; show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 452181159 |              | mysql            |                   |
+------------------+-----------+--------------+------------------+-------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;从库搭建&#34;&gt;从库搭建&lt;/h2&gt;
&lt;p&gt;配置slave的my.cnf，在另外一台机器上，启动一个空实例。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[mysqld]
skip-host-cache
skip-name-resolve
server_id=2
log_bin=slave-bin
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=slave-relay-bin
log_slave_updates=1
read_only=1

[mysql]

[mysqldump]
quick
quote-names
max_allowed_packet=16M
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d --name mysql --restart unless-stopped -p 3406:3306 --log-opt max-size=50m \
-v /data/mysql:/var/lib/mysql \
-v /data/mysql.conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=xxx \
mysql:5.7
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;全量备份主库&#34;&gt;全量备份主库&lt;/h2&gt;
&lt;p&gt;首先锁表。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#全备主库时需要另开一个终端，给数据库加上读锁，避免在备份期间有其他人在写入导致数据不一致
#此锁表的终端必须在备份完成以后才能退出
mysql&amp;gt; flush tables with read lock;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;记录binlog状态，锁表之后binlog的Position就不会再变了，记录下File和Position。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MySQL [(none)]&amp;gt; show master status;
+------------------+-----------+--------------+------------------+-------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 461472295 |              | mysql            |                   |
+------------------+-----------+--------------+------------------+-------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;操作备份，备份完成，即可释放表锁。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysqldump -h 172.x.x.10 -P 3406 -uroot -pxxx --all-databases &amp;gt; all-database-$(date &amp;#39;+%F-%H-%M-%S&amp;#39;).sql

#解除主库的锁表状态，直接退出交互式界面即可
mysql&amp;gt; quit
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;把全量数据导入到从库中&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysql -h 172.x.x.11 -P 3406 -uroot -pxxx &amp;lt; all-database-2024-10-09-11-27-41.sql
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;配置从库同步&#34;&gt;配置从库同步&lt;/h2&gt;
&lt;p&gt;登录从库，执行change master，注意master_log_file和master_log_pos，填写在备份主库前记录值。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;change master to master_host=&amp;#39;172.x.x.10&amp;#39;,master_port=3406,master_user=&amp;#39;root&amp;#39;,master_password=&amp;#39;xxx&amp;#39;,master_log_file=&amp;#39;mysql-bin.000002&amp;#39;,master_log_pos=461472295;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查看从库状态。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MySQL [(none)]&amp;gt; show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.x.x.10
                  Master_User: root
                  Master_Port: 3406
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 479860795
               Relay_Log_File: slave-relay-bin.000003
                Relay_Log_Pos: 111190829
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 479860795
              Relay_Log_Space: 432038788
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: cd0f01f3-27c4-11ef-9394-0242ac130002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看到Slave_IO_Running和Slave_SQL_Running，开始为No，需要执行slave start。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysql&amp;gt; slave start
mysql&amp;gt; show slave status \G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;验证同步&#34;&gt;验证同步&lt;/h2&gt;
&lt;p&gt;通过主库创建库表，写入数据，验证从库同步。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>StableDiffusion</title>
      <link>https://www.arvintian.cn/post/other/aigc/stablediffusion/</link>
      <pubDate>Mon, 30 Sep 2024 16:12:41 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/other/aigc/stablediffusion/</guid>
      
        <description>&lt;h2 id=&#34;models&#34;&gt;Models&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;v1 &lt;a href=&#34;https://github.com/CompVis/stable-diffusion&#34;&gt;https://github.com/CompVis/stable-diffusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;v2 &lt;a href=&#34;https://github.com/Stability-AI/stablediffusion&#34;&gt;https://github.com/Stability-AI/stablediffusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;checkpoint&#34;&gt;CheckPoint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;v1 &lt;a href=&#34;https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5&#34;&gt;https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;v2 &lt;a href=&#34;https://huggingface.co/stabilityai/stable-diffusion-2-1&#34;&gt;https://huggingface.co/stabilityai/stable-diffusion-2-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;webui&#34;&gt;WebUI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/AUTOMATIC1111/stable-diffusion-webui&#34;&gt;https://github.com/AUTOMATIC1111/stable-diffusion-webui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# ubuntu 22.04
sudo apt install libgl1 libglib2.0-0 libgoogle-perftools4 libtcmalloc-minimal4
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
# 切换到指定版本
git checkout -b v1-10-1 tags/v1.10.1
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./webui.sh
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# chinese interface
https://github.com/VinsonLaro/stable-diffusion-webui-chinese
&lt;/code&gt;&lt;/pre&gt;</description>
      
    </item>
    
    <item>
      <title>WSL2使用CUDA</title>
      <link>https://www.arvintian.cn/post/other/aigc/wsl2%E4%BD%BF%E7%94%A8cuda/</link>
      <pubDate>Mon, 30 Sep 2024 15:55:39 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/other/aigc/wsl2%E4%BD%BF%E7%94%A8cuda/</guid>
      
        <description>&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;
&lt;p&gt;windows安装新驱动，wsl2内部不需要安装驱动，直接安装cuda-toolkit&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-wsl-ubuntu-12-8-local_12.8.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-8-local_12.8.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-8
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nvidia-smi使用&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ln -s nvidia-smi -&amp;gt; /usr/lib/wsl/lib/nvidia-smi
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;卸载&#34;&gt;卸载&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt --purge remove cuda-toolkit-12-8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg -l | grep cuda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dpkg --purge cuda-repo-wsl-ubuntu-12-8-local cuda-toolkit-12-8-config-common cuda-toolkit-12-config-common cuda-toolkit-config-common cuda-visual-tools-12-8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再次运行检查命令，确认系统中已无任何 CUDA 相关包。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dpkg -l | grep cuda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;docker-toolkit&#34;&gt;docker-toolkit&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-the-nvidia-container-toolkit&#34;&gt;https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-the-nvidia-container-toolkit&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;参考文档&#34;&gt;参考文档&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl&#34;&gt;https://learn.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://docs.nvidia.com/cuda/wsl-user-guide/index.html#wsl-2-support-constraints&#34;&gt;https://docs.nvidia.com/cuda/wsl-user-guide/index.html#wsl-2-support-constraints&lt;/a&gt;&lt;br /&gt;
&lt;a href=&#34;https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=WSL-Ubuntu&amp;amp;target_version=2.0&amp;amp;target_type=deb_local&#34;&gt;https://developer.nvidia.com/cuda-downloads?target_os=Linux&amp;amp;target_arch=x86_64&amp;amp;Distribution=WSL-Ubuntu&amp;amp;target_version=2.0&amp;amp;target_type=deb_local&lt;/a&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>使用nerdctl替代docker-ce</title>
      <link>https://www.arvintian.cn/post/kubernetes/%E4%BD%BF%E7%94%A8nerdctl%E6%9B%BF%E4%BB%A3docker-ce/</link>
      <pubDate>Wed, 18 Sep 2024 11:34:12 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/kubernetes/%E4%BD%BF%E7%94%A8nerdctl%E6%9B%BF%E4%BB%A3docker-ce/</guid>
      
        <description>&lt;p&gt;&lt;a href=&#34;https://github.com/containerd/nerdctl&#34;&gt;nerdctl&lt;/a&gt;是一个兼容Docker CLI的命令行工具, 用于管理containerd容器.&lt;/p&gt;
&lt;h2 id=&#34;nerdctl&#34;&gt;nerdctl&lt;/h2&gt;
&lt;p&gt;使用rootfull模式.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir nerdctl
wget -c https://github.com/containerd/nerdctl/releases/download/v1.7.7/nerdctl-1.7.7-linux-amd64.tar.gz
tar -xzvf nerdctl-1.7.7-linux-amd64.tar.gz -C nerdctl
sudo cp -a nerdctl/nerdctl /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置别名docker命令, 指向nerdctl.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# sudo vim /usr/local/bin/docker


#!/bin/bash


COMMAND=&amp;#34;nerdctl&amp;#34;
if [[ $EUID -ne 0 ]]; then
    sudo $COMMAND &amp;#34;$@&amp;#34;
else
    $COMMAND &amp;#34;$@&amp;#34;
fi
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;containerd&#34;&gt;containerd&lt;/h2&gt;
&lt;p&gt;复用k3s的containerd, 配置nerdctl.toml指向containerd sock.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir /etc/nerdctl


cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/nerdctl/nerdctl.toml
debug          = false
debug_full     = false
address        = &amp;#34;unix:///run/k3s/containerd/containerd.sock&amp;#34;
namespace      = &amp;#34;k8s.io&amp;#34;
cni_path       = &amp;#34;/var/lib/nerdctl/cni/bin&amp;#34;
cni_netconfpath = &amp;#34;/var/lib/nerdctl/cni/net.d&amp;#34;
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker ps/exec/image 相关命令就可以使用了, 单纯管理k8s/k3s配置到这里就可以了.&lt;/p&gt;
&lt;p&gt;如果需要完整的docker体验，docker run/build支持, 需要添加cni pulgin和buildkit支持.&lt;/p&gt;
&lt;h2 id=&#34;cni-plugin&#34;&gt;cni plugin&lt;/h2&gt;
&lt;p&gt;使用docker run 创建启动容器, 需要配置cni plugin, 让nerdctl在创建容器的使用告诉containerd调用哪里的cni配置容器网络.&lt;/p&gt;
&lt;p&gt;上面的nerdctl.toml已经配置了路径, 需要安装cni plugin到对应路径.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cni_path       = &amp;#34;/var/lib/nerdctl/cni/bin&amp;#34;
cni_netconfpath = &amp;#34;/var/lib/nerdctl/cni/net.d&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir cni
wget -c https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
tar -xzvf cni-plugins-linux-amd64-v1.5.1.tgz -C cni
sudo cp cni/* /var/lib/nerdctl/cni/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# docker run --rm -ti alpine sh
# docker network ls


NETWORK ID      NAME      FILE
17f29b073143    bridge    /var/lib/nerdctl/cni/net.d/nerdctl-bridge.conflist
                host
                none
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;会发现不做配置, nerdctl在执行docker run的时候回创建默认的网桥网络.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# ifconfig
nerdctl0: flags=4099&amp;lt;UP,BROADCAST,MULTICAST&amp;gt;  mtu 1500
        inet 10.4.0.1  netmask 255.255.255.0  broadcast 10.4.0.255
        inet6 fe80::a096:c4ff:fe7e:a72f  prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;
        ether a2:96:c4:7e:a7:2f  txqueuelen 1000  (Ethernet)
        RX packets 15  bytes 1000 (1000.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1494 (1.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主机查看网络, 多了一个nerdctl0网桥, 和docker的docker0体验是一样的.&lt;br /&gt;
注意这里在配置nerdctl.toml的时候故意将cni路径配置到了/var/lib/nerdctl, 因为默认会使用/opt/cni/bin和/etc/cni/net.d, 如果主机安装的k8s使用相同路径, 可能产生影响.&lt;/p&gt;
&lt;h2 id=&#34;buildkit&#34;&gt;buildkit&lt;/h2&gt;
&lt;p&gt;安装buildctl和buildkitd.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir buildkit
wget -c https://github.com/moby/buildkit/releases/download/v0.15.2/buildkit-v0.15.2.linux-amd64.tar.gz
tar -xzvf buildkit-v0.15.2.linux-amd64.tar.gz -C buildkit
sudo cp buildkit/bin/buildctl /usr/local/bin/
sudo cp buildkit/bin/buildkitd /usr/local/bin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置buildkitd的worker使用k3s的containerd.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# mkdir /etc/buildkit
# vim /etc/buildkit/buildkitd.toml


[worker.oci]
  enabled = false


[worker.containerd]
  enabled = true
  namespace = &amp;#34;k8s.io&amp;#34;
  address = &amp;#34;/run/k3s/containerd/containerd.sock&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置buildkitd守护启动.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# vim /etc/systemd/system/buildkit.service
# systemctl start buildkit.service
# systemctl enable buildkit.service


[Unit]



After=network.target local-fs.target


[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment=&amp;#34;ENABLE_CRI_SANDBOXES=sandboxed&amp;#34;
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/buildkitd


Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999


[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nerdctl的rootfull模式和buildkitd通信会使用/run/buildkit/buildkitd.sock.&lt;/p&gt;
&lt;h2 id=&#34;multi-platform&#34;&gt;multi-platform&lt;/h2&gt;
&lt;p&gt;添加docker run/build/image的跨平台支持, 首先要再主机上注册binfmt_misc使用qemu, 可以使用这个项目&lt;a href=&#34;https://github.com/tonistiigi/binfmt&#34;&gt;tonistiigi/binfmt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;主机在遇到binfmt是其他平台的指令时候, 会自动调用qemu(容器进程也是主机进程, 所以也可以).&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# docker run --privileged --rm tonistiigi/binfmt:master --install all


# ls -1 /proc/sys/fs/binfmt_misc/qemu*
/proc/sys/fs/binfmt_misc/qemu-aarch64
/proc/sys/fs/binfmt_misc/qemu-arm
/proc/sys/fs/binfmt_misc/qemu-mips64
/proc/sys/fs/binfmt_misc/qemu-mips64el
/proc/sys/fs/binfmt_misc/qemu-ppc64le
/proc/sys/fs/binfmt_misc/qemu-riscv64
/proc/sys/fs/binfmt_misc/qemu-s390x


# docker run --rm --platform=arm64 alpine uname -a


Linux 20910835f3ab 4.18.0-553.16.1.el8_10.x86_64 #1 SMP Thu Aug 8 17:47:08 UTC 2024 aarch64 Linux
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;summary&#34;&gt;summary&lt;/h2&gt;
&lt;p&gt;以上组合nerdctl/containerd/cni-plugin/buildkit, 实现docker-ce的体验. 在k8s/k3s开发调试场景, 共用k8s的containerd, 还是会很方便的.&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>节点重启网络Flannel Pod IP不通排查记录</title>
      <link>https://www.arvintian.cn/post/kubernetes/%E8%8A%82%E7%82%B9%E9%87%8D%E5%90%AF%E7%BD%91%E7%BB%9Cflannel-pod-ip%E4%B8%8D%E9%80%9A%E6%8E%92%E6%9F%A5%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Mon, 19 Aug 2024 18:02:08 +0800</pubDate>
      
      <guid>https://www.arvintian.cn/post/kubernetes/%E8%8A%82%E7%82%B9%E9%87%8D%E5%90%AF%E7%BD%91%E7%BB%9Cflannel-pod-ip%E4%B8%8D%E9%80%9A%E6%8E%92%E6%9F%A5%E8%AE%B0%E5%BD%95/</guid>
      
        <description>&lt;h2 id=&#34;问题现场&#34;&gt;问题现场&lt;/h2&gt;
&lt;p&gt;自己的实验集群，使用的k3s v1.25.7+k3s1, 网络使用的默认flannel vxlan模式。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NAME          STATUS   ROLES                  AGE    VERSION
whoops-home   Ready    &amp;lt;none&amp;gt;                 253d   v1.25.7+k3s1
whoops-k3s    Ready    control-plane,master   268d   v1.25.7+k3s1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;节点whoops-k3s是CentOS7.9，折腾网络，改了ifcfg-eth0配置，systemctl restart network重启网络，一开始没发现，第二天发现nginx到集群的访问504。&lt;/p&gt;
&lt;p&gt;这个小集群是在家里NAS和软路由上跑的，whoops-home上有一个内网穿透了的nginx，集群流量都经过这个nginx转进来走traefik ingress controller。&lt;/p&gt;
&lt;p&gt;链路大概这样：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;域名流量-&amp;gt;nginx(whoops-home)-&amp;gt;traefik(nodeport)-&amp;gt;pod
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nginx报504，那就是Nginx到traefik不通，现在nginx在whoops-home上，traefik在whoops-k3s上，查了下发现从whoops-home上ping不通whoops-k3s上的Pod，但是从whoops-k3s可以ping通whoops-home上的pod。&lt;/p&gt;
&lt;p&gt;whoops-k3s上的flannel vxlan因为重启网络挂了？&lt;/p&gt;
&lt;h2 id=&#34;原因分析&#34;&gt;原因分析&lt;/h2&gt;
&lt;p&gt;先来看看netfilter的FORWARD，没问题&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;iptables -t filter -nvL | grep FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看看路由, 也没问题，whoops-k3s是10.42.0.0/24网段，whoops-home是10.42.1.0/24网段。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;default via 192.168.31.1 dev eth0
10.42.0.0/24 dev cni0 proto kernel scope link src 10.42.0.1
10.42.1.0/24 via 10.42.1.0 dev flannel.1 onlink
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;看看fdb? 不应该啊，whoops-k3s都能ping通whoops-home上的pod，arp要是有问题，咋ping出去的包，一看果然没问题。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo bridge fdb show | grep flannel.1
# 192.168.31.166 是 whoops-home
d6:f8:ec:13:3c:07 dev flannel.1 dst 192.168.31.166 self permanent
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vxlan是走的flannel.1设备，这个设备是flanneld创建的，重启网络影响它了？但是如果配置不对，flanneld是不是应该自己感知调整回去呢？重启下k3s试试。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;systemctl restart k3s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;好了！重启k3s/flanneld，因为重配了flannel.1? 复现一下，特意检查flannel.1，网段配置、路由、arp、设备状态重启前后都没问题，重配重不配flannel.1应该不影响的啊，而且个人认为flanneld不应该这么不健壮，节点重启下network，整个节点的pod网络都挂掉了。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flannel.1: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1450
        inet 10.42.0.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::b45b:f1ff:fe24:82e4  prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;
        ether b6:5b:f1:24:82:e4  txqueuelen 0  (Ethernet)
        RX packets 237089  bytes 37524217 (35.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 174244  bytes 32444345 (30.9 MiB)
        TX errors 29  dropped 5 overruns 0  carrier 29  collisions 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;抓包！&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tcpdump -i flannel.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on flannel.1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:28:45.852513 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 12, seq 48, length 64
22:28:46.872698 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 12, seq 49, length 64
22:28:47.896618 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 12, seq 50, length 64
22:28:49.851093 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 13, seq 1, length 64
22:28:50.872665 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 13, seq 2, length 64
22:28:51.896473 IP 10.42.1.0 &amp;gt; 10.42.0.210: ICMP echo request, id 13, seq 3, length 64
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;从whoops-home上的ping包到flannel.1了，但是没给到Pod网卡，丢哪了？重启网络操作到底干了啥？真的要研究kernel怎么实现的vxlan了么？debug flannel.1设备？&lt;/p&gt;
&lt;h2 id=&#34;networkservice&#34;&gt;network.service&lt;/h2&gt;
&lt;p&gt;直接看/etc/rc.d/init.d/network脚本，看看重启网络做了哪些操作。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;start)
    apply_sysctl
...
stop)
   sysctl -w net.ipv4.ip_forward=0 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
...
restart|force-reload)
    cd &amp;#34;$CWD&amp;#34;
    $0 stop
    $0 start
...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;好嘛，stop时候关了net.ipv4.ip_forward，flannel.1当然不把包往pod的网卡转了，重启k3s/flanneld，flanneld动态又把参数改回来了，所以就通了，复现验证一下，还真是。&lt;br /&gt;
搞不懂network.service stop为啥关这个，但是start时候也应该把之前的参数还回来吧？对不起，没有持久化的sysctl在start的apply_sysctl里还不回来。&lt;/p&gt;
&lt;h2 id=&#34;修复搞定&#34;&gt;修复搞定&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo net.ipv4.ip_forward=1 &amp;gt;&amp;gt; /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;验证一下，重启网络不影响Pod网络联通性了！&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;之前特意研究了下&lt;a href=&#34;https://www.arvintian.cn/post/kubernetes/flannel%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%BC%8F%E4%B9%8Bvxlan/&#34;&gt;flannel的vxlan模式&lt;/a&gt;，这次遇这么个case，又深刻了~&lt;/p&gt;
</description>
      
    </item>
    
  </channel>
</rss>
