<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Vullfin&apos;s Blog</title><description>It is difficult to free fools from the chains they revere_______Voltaire</description><link>https://blog.vull.top</link><language>ja</language><item><title>docker学习周刊</title><link>https://blog.vull.top/ja/post/weekly/docker</link><guid isPermaLink="false">ja:weekly/docker</guid><description>这是一期docker学习周刊，主要为入门学习。</description><pubDate>Tue, 01 Sep 2026 04:03:00 GMT</pubDate><content:encoded>&lt;p&gt;Docker 学习周刊 Vol.1&lt;/p&gt;
&lt;p&gt;本期周刊专注&lt;strong&gt;Docker 入门学习&lt;/strong&gt;，从零梳理容器核心概念、基础实操命令、环境搭建流程，同时记录学习过程中的问题与解决方案，帮助快速掌握 Docker 基础用法，为后续容器化部署、微服务搭建打下基础。&lt;/p&gt;
&lt;h2&gt;关于本周学习主题&lt;a href=&quot;#关于本周学习主题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Docker 是目前主流的容器化部署工具，基于 Go 语言开发、开源免费，凭借轻量化、跨环境一致、部署高效、隔离性强的特点，广泛应用于项目开发、测试、生产部署场景。区别于传统虚拟机，容器共享宿主机内核，无需完整系统，秒级启动、资源占用极低。本周聚焦 Docker 零基础入门，完成环境搭建、核心概念理解、基础镜像与容器实操，彻底解决本地环境配置不一致、项目移植报错、部署繁琐等问题。&lt;/p&gt;
&lt;h2&gt;Docker 核心学习内容&lt;a href=&quot;#docker-核心学习内容&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;一、基础核心概念&lt;a href=&quot;#一基础核心概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;厘清 Docker 三大核心要素，是入门的关键，区别于传统虚拟机，容器的核心优势为&lt;strong&gt;轻量、高效、秒级启动、环境一致&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;镜像（Image）&lt;/strong&gt;：只读的模板文件，包含运行程序所需的代码、依赖、环境配置、运行指令，是创建容器的模板，类似系统安装包。镜像分层存储、可复用、可迭代构建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器（Container）&lt;/strong&gt;：镜像运行后的可读写实例，独立隔离、互不干扰，一个镜像可创建多个容器，支持启停、删除、扩容等操作，是真正运行业务程序的载体。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库（Registry）&lt;/strong&gt;：用于存储、分享、拉取镜像的远程平台，默认使用 Docker Hub 官方仓库，企业可搭建 Harbor 等私有仓库，用于内部镜像管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二、环境搭建实操&lt;a href=&quot;#二环境搭建实操&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;完成 Windows/Mac 端 Docker Desktop 安装，全程傻瓜式配置，核心要点如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开启系统虚拟化功能，解决容器启动失败、Docker 无法运行问题；&lt;/li&gt;
&lt;li&gt;配置国内镜像源（阿里云/网易云），加速镜像拉取，规避官方源超时、访问缓慢问题；&lt;/li&gt;
&lt;li&gt;安装完成后终端验证：执行 &lt;code&gt;docker -v&lt;/code&gt; 查看版本、&lt;code&gt;docker run hello-world&lt;/code&gt; 测试容器运行，确认环境正常。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三、高频常用命令&lt;a href=&quot;#三高频常用命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;整理入门必备核心命令，覆盖镜像、容器两大核心操作，日常学习和开发使用率极高：&lt;/p&gt;
&lt;h4&gt;1. 镜像操作命令&lt;a href=&quot;#1-镜像操作命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker images&lt;/code&gt;：查看本地所有镜像&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker pull [镜像名:版本]&lt;/code&gt;：拉取远程镜像（如 nginx、mysql、redis）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker rmi [镜像ID]&lt;/code&gt;：删除本地无用镜像（需先删除对应容器）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker search [镜像名]&lt;/code&gt;：搜索远程仓库镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. 容器操作命令&lt;a href=&quot;#2-容器操作命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker ps&lt;/code&gt;：查看正在运行的容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker ps -a&lt;/code&gt;：查看所有容器（含已停止、异常退出容器）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run [参数] 镜像名&lt;/code&gt;：创建并启动容器（常用参数：&lt;code&gt;-d&lt;/code&gt; 后台运行、&lt;code&gt;-p 宿主机端口:容器端口&lt;/code&gt; 端口映射、&lt;code&gt;--name&lt;/code&gt; 自定义容器名）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker start/stop/restart [容器ID]&lt;/code&gt;：启动/停止/重启容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker exec -it [容器ID] /bin/bash&lt;/code&gt;：进入运行中容器内部终端，进行文件、配置操作&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker rm [容器ID]&lt;/code&gt;：删除已停止的容器，&lt;code&gt;docker rm -f&lt;/code&gt; 强制删除运行中容器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;完整 Docker 分阶段学习路径（从零到实战）&lt;a href=&quot;#完整-docker-分阶段学习路径从零到实战&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整理系统化、循序渐进的 Docker 学习路线，分为 &lt;strong&gt;入门夯实、进阶实战、工程落地、生产优化&lt;/strong&gt; 四个阶段，适合零基础循序渐进学习，适配个人开发、项目部署、服务运维场景。&lt;/p&gt;
&lt;h3&gt;阶段一：基础夯实（1–3 天）—— 本周已完成&lt;a href=&quot;#阶段一基础夯实13-天-本周已完成&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;核心目标：建立容器思维，熟练掌握环境搭建与基础命令，告别纯理论学习。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解容器与虚拟机的本质区别，掌握容器轻量化、高隔离、可移植的核心优势&lt;/li&gt;
&lt;li&gt;熟练安装 Docker 环境、配置镜像源、排查基础启动报错&lt;/li&gt;
&lt;li&gt;掌握镜像、容器、仓库核心概念与生命周期&lt;/li&gt;
&lt;li&gt;熟练使用日常高频命令，完成 Nginx、MySQL、Redis 基础容器部署&lt;/li&gt;
&lt;li&gt;掌握端口映射、后台运行、容器启停删除等基础实操&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阶段二：进阶核心（3–5 天）—— 下周重点学习&lt;a href=&quot;#阶段二进阶核心35-天-下周重点学习&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;核心目标：摆脱仅使用公共镜像，掌握&lt;strong&gt;自定义镜像构建&lt;/strong&gt;与数据持久化，具备简单项目容器化能力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;精通 &lt;strong&gt;Dockerfile&lt;/strong&gt; 核心语法：FROM、WORKDIR、COPY、RUN、CMD、EXPOSE、ENV 等常用指令&lt;/li&gt;
&lt;li&gt;手写 Dockerfile 打包前端/后端项目，实现自定义镜像构建&lt;/li&gt;
&lt;li&gt;理解镜像分层原理与缓存机制，掌握镜像精简、体积优化技巧&lt;/li&gt;
&lt;li&gt;学习容器数据管理：数据卷挂载、目录映射，解决容器删除数据丢失问题&lt;/li&gt;
&lt;li&gt;掌握容器日志查看、资源查看、进程排查基础运维操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阶段三：多服务编排（5–7 天）&lt;a href=&quot;#阶段三多服务编排57-天&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;核心目标：解决单容器局限，掌握多服务联动部署，适配完整项目架构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习 &lt;strong&gt;Docker Compose&lt;/strong&gt; 核心用法，通过 yaml 配置文件统一管理多容器服务&lt;/li&gt;
&lt;li&gt;实现前端、后端、数据库、缓存服务一键启动、启停、重启&lt;/li&gt;
&lt;li&gt;掌握 Compose 网络互通、服务依赖、环境变量配置&lt;/li&gt;
&lt;li&gt;学习 Docker 网络模式：桥接网络、主机网络、自定义网络，解决容器跨服务通信问题&lt;/li&gt;
&lt;li&gt;完成完整项目容器化部署实战（前后端+数据库整套服务）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;阶段四：工程化与生产优化（长期进阶）&lt;a href=&quot;#阶段四工程化与生产优化长期进阶&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;核心目标：适配企业生产环境，掌握规范、安全、高效的容器部署方案，衔接云原生技术栈。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学习镜像多阶段构建，极致精简镜像体积，提升部署效率&lt;/li&gt;
&lt;li&gt;掌握私有仓库 Harbor 搭建、镜像推送、拉取、权限管理&lt;/li&gt;
&lt;li&gt;容器资源限制（CPU/内存）、安全权限配置、非 root 用户运行&lt;/li&gt;
&lt;li&gt;容器日志收集、监控、自动重启、异常自愈配置&lt;/li&gt;
&lt;li&gt;学习 Docker 与 CI/CD 结合，实现项目自动打包、构建、部署&lt;/li&gt;
&lt;li&gt;衔接 Kubernetes 容器编排，为微服务集群部署打基础&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;本期学习总结&lt;a href=&quot;#本期学习总结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;已完成学习清单&lt;a href=&quot;#已完成学习清单&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; Docker 环境安装与国内镜像源配置&lt;/li&gt;
&lt;li&gt; 镜像、容器、仓库核心概念区分，理解容器与虚拟机差异&lt;/li&gt;
&lt;li&gt; Nginx、MySQL 基础镜像拉取与容器启动实操&lt;/li&gt;
&lt;li&gt; 端口映射、容器后台运行基础配置&lt;/li&gt;
&lt;li&gt; 容器进入、退出、启停、删除全套基础操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;学习踩坑记录&lt;a href=&quot;#学习踩坑记录&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;坑点 1：未配置国内镜像源，拉取镜像超时失败，解决方案：替换阿里云、网易云镜像源；&lt;/li&gt;
&lt;li&gt;坑点 2：容器启动后立即退出，原因是无前台常驻进程，解决方案：添加后台运行参数 &lt;code&gt;-d&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;坑点 3：本地端口占用导致容器启动失败，解决方案：更换映射端口或关闭本地占用程序；&lt;/li&gt;
&lt;li&gt;坑点 4：删除镜像失败，原因是存在关联容器，解决方案：先删除对应容器再删除镜像。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;工具与资料推荐&lt;a href=&quot;#工具与资料推荐&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&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;Docker Desktop&lt;/td&gt;&lt;td&gt;可视化 Docker 环境，适配 Windows/Mac，集成容器运行、CLI、Compose 全套能力&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Docker 官方文档&lt;/td&gt;&lt;td&gt;权威语法、命令、场景教程，覆盖 Docker 全功能使用指南&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://docs.docker.com/&quot;&gt;https://docs.docker.com/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;下期预告&lt;a href=&quot;#下期预告&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下期将重点学习 &lt;strong&gt;Dockerfile 自定义镜像构建&lt;/strong&gt;，手把手实操项目打包、镜像优化、数据卷挂载，从零实现个人项目容器化部署，敬请期待！&lt;/p&gt;
&lt;p&gt;感谢阅读本期周刊！&lt;/p&gt;</content:encoded><category>category:周刊</category><category>tag:周刊</category><category>tag:docker</category></item><item><title>华为数通学习体系笔记</title><link>https://blog.vull.top/ja/post/study/%E7%BD%91%E5%B7%A5/ensp%E7%AC%94%E8%AE%B0/%E5%8D%8E%E4%B8%BA%E6%95%B0%E9%80%9Ahcip%E5%AD%A6%E4%B9%A0%E4%BD%93%E7%B3%BB%E7%AC%94%E8%AE%B0</link><guid isPermaLink="false">ja:study/网工/ensp笔记/华为数通hcip学习体系笔记</guid><description>网工数通学习笔记记录</description><pubDate>Thu, 20 Aug 2026 23:02:08 GMT</pubDate><content:encoded>&lt;p&gt;太久没学习了，来复习一下，参考&lt;a href=&quot;https://www.bilibili.com/video/BV1LokeBhE69/?p=4&amp;amp;share_source=copy_web&amp;amp;vd_source=81e6f3945583550f7d5bf26e1ef884c8&quot;&gt;学习视频&lt;/a&gt;记录的笔记&lt;/p&gt;
&lt;h1&gt;华为数通&lt;a href=&quot;#华为数通&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;网络模型&lt;a href=&quot;#网络模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;OSI 模型&lt;a href=&quot;#osi-模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;应用层（第七层）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对应用程序提供接口、服务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表示层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进行数据格式转换、加密与解密、图片/文字 编码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;会话层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立、维持、断开通信会话&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;传输层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;端到端传输，负责端口、可靠/不可靠传输&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网络层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;路由寻址，决定数据走向&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据链路层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相邻设备传输、差错校验、物理寻址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;物理层 （第一层）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;物理硬件、信号传输，只传输比特流 0/1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;TCP/IP 模型&lt;a href=&quot;#tcpip-模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;应用层（第四层）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;合并 OSI 应用、表示、会话层。面向用户与程序&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;协议：HTTP（80）、HTTPS（443）、FTP（21）、SSH（22）、Telnet（23）、SMTP（25）、POM3（110）、IMAP（143）、DNS（53）、APP 与浏览器等&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;传输层&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;端到端传输，靠端口区分程序&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;协议：TCP（065535）可靠、UDP（065535）高效&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;0~1023 知名固定端口，1024+ 动态自定义端口&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网际层（互联网层）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;路由寻址、靠 IP 地址寻找目标主机&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;协议：IP、ICMP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网络接口层（网络层）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;合并 OSI 数据链路层、物理层，负责硬件传输、MAC 寻址、网线\信号转发&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设备：网卡、交换机、网线&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;TCP UDP 报文格式&lt;a href=&quot;#tcp-udp-报文格式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/cjk9EVvv.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4&gt;以太网帧格式&lt;a href=&quot;#以太网帧格式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/OuBW1vJa.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4&gt;ARP 地址解析协议&lt;a href=&quot;#arp-地址解析协议&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/DiJB1VIa.png&quot; alt=&quot;image.png|445&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png|445&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h5&gt;ARP 原理&lt;a href=&quot;#arp-原理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;HOST1 ARP 缓存&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/ciVSHCil.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;ARP 请求&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/h8HrfBmY.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;HOST2 ARP 缓存 收到后发单播包，保存至缓存表&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/wzwOkzWo.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;ARP 响应 收到后发单播包，保存至缓存表&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/1u0loyex.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;HOST1 ARP 响应&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/qCXroHPi.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;IP 协议&lt;a href=&quot;#ip-协议&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;IPv4 报文格式&lt;a href=&quot;#ipv4-报文格式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/pNmXUwO3.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4&gt;数据包分片&lt;a href=&quot;#数据包分片&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将报文分割成多个片段的过程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网络中转发的 IP 报文长度可以不同，但长度超出数据链路层最大长度时需要进行分割成若干个小片段进行传输&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据链路层有&lt;code&gt;MTU&lt;/code&gt; 最大传输单元，以太网默认&lt;code&gt;MTU=1500字节&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Flag 标志位&lt;a href=&quot;#flag-标志位&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标识 (Identification)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同一原始数据包拆分出所有分片，标识值完全相同，接收方靠它判断哪些分片属于同一大包&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;标志位 (Flags)&lt;/strong&gt;（3 位，只用后 2 位）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MF 位（More Fragment）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1 = 后面还有分片&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;0 = 这是最后一片&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另一位：&lt;code&gt;禁止分片位&lt;/code&gt;。置 1 时不允许分片，包过大直接丢弃，返回 ICMP 差错报文&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;片偏移 (Fragment Offset)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;8 字节&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;表示：当前分片的数据部分，距离原始数据包开头偏移了多少个 8 字节&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于排序重组&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;除最后一个分片，其余分片长度必须是&lt;code&gt;8字节的整数倍&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;计算时需排除 IP 头部固定 20 字节（无选项字段），即为：&lt;code&gt;1480字节&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个分片都有独立 IP 头部（头部不变，数据被拆分）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;路由转发时，分片可在不同路径传输，到达时顺序可能乱，接收方依靠：&lt;code&gt;标识+片偏移&lt;/code&gt; 排序重组&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;片偏移=当前分片之前所有分片的数据总字节数8\text{片偏移} = \frac{\text{当前分片之前所有分片的数据总字节数}}{8}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;片偏移&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;当前分片之前所有分片的数据总字节数&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;生存时间 TTL（Time To Live）&lt;a href=&quot;#生存时间-ttltime-to-live&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/xKZcRoux.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;IPv4 头部一个 8 位字段。取值：0~255&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;限制数据包最大路由转发跳数，用于防环&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;IP 分类&lt;a href=&quot;#ip-分类&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;th&gt;默认子网掩码&lt;/th&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;A&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1 ~ 126&lt;/td&gt;&lt;td&gt;255.0.0.0&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;大型网络&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;128 ~ 191&lt;/td&gt;&lt;td&gt;255.255.0.0&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;中型网络&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;110&lt;/td&gt;&lt;td&gt;192 ~ 223&lt;/td&gt;&lt;td&gt;255.255.255.0&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;小型局域网&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;1110&lt;/td&gt;&lt;td&gt;224 ~ 239&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;组播通信&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;1111&lt;/td&gt;&lt;td&gt;240 ~ 255&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;科研 / 保留&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;可在内网自由使用&lt;/strong&gt;的私有 IP，不占用公网地址：&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A 类私有段：&lt;code&gt;10.0.0.0 ~ 10.255.255.255&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B 类私有段：&lt;code&gt;172.16.0.0 ~ 172.31.255.255&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;C 类私有段：&lt;code&gt;192.168.0.0 ~ 192.168.255.255&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;路由&lt;a href=&quot;#路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/pFnNyFeV.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;路由获取方式&lt;a href=&quot;#路由获取方式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;直连路由&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设备相连自动生成，优先级 0，最高&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静态路由&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手动配置，优先级默认 60&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态路由&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;设备之间互相自动交换路由信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自学习，自更新&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OSPF 路由&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;内部路由优先级 10&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外部路由优先级 150&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;静态路由配置规则：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ip route-static 目标网段 掩码 {下一跳 IP | 出接口 | 下一跳+出接口}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;等价路由&lt;a href=&quot;#等价路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：去往同一个目标网段，多条路由开销度量值 cost 相同完全相等，路由器同时把流量从多条链路转发&lt;br /&gt;
满足以下三点，路由表会同时生成多条路由条目，启用&lt;strong&gt;等价负载分担&lt;/strong&gt;。前提：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;目的 IP 网段相同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;路由协议计算出的 cost 相同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下一跳、出接口不同（存在两条或多条不同物理线路）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;浮动路由&lt;a href=&quot;#浮动路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：同目的网段，配置两条静态路由，主路由优先级高量；备用路由优先级低不进路由表，主链路断了，备用自动顶上&lt;br /&gt;
关键点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;华为 / 华三：&lt;strong&gt;优先级数值越小越优先&lt;/strong&gt;，思科越小越优先&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;默认静态优先级 60&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;浮动备用路由设置：61~255（越大优先级越低）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;OSPF&lt;a href=&quot;#ospf&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;定义&lt;a href=&quot;#定义&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;定义：开放式最短路径优先，无类域间路由协议，属于&lt;code&gt;IGP内部网关协议&lt;/code&gt;、&lt;code&gt;链路状态路由协议&lt;/code&gt;。基于 SPF 算法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;协议号：&lt;code&gt;89&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;组播地址：&lt;code&gt;224.0.0.5&lt;/code&gt;（所有 OSPF 路由）、&lt;code&gt;224.0.0.6&lt;/code&gt;（DR/BDR）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;特点：&lt;code&gt;无类&lt;/code&gt;、支持 &lt;code&gt;VLSM&lt;/code&gt;、支持&lt;code&gt;路由汇总&lt;/code&gt;、&lt;code&gt;收敛快&lt;/code&gt;、&lt;code&gt;防环路&lt;/code&gt;、适合大中型园区 / 运营商内网&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;LSDB&lt;/code&gt;（Link-State DataBase 链路状态数据库）：同一个 OSPF 区域内，所有路由器共用的「全网拓扑地图」，存着本区域全部 LSA 条目。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/4RNQYlgj.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;OSPF 原理&lt;a href=&quot;#ospf-原理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;链路状态 IGP 协议，IP 协议号 89；路由之间不直接交换路由，互相发送 LSA 链路状态通告，描述链路、开销和邻居&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同一个区域内得路由器完全同步一样得 LSDB 链路状态数据库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邻居通告 Hello 包发现和保活，协商通过后交互 LSA，LSDB 达成 Full 邻接&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每台路由器以自己为根运行 SPF 算法，基于 LSDB 独立算出最短路径，生成路由表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;划分 Area 区域，非为骨干 Area0 和非骨干；目的减少 LSA 泛洪范围；ABR 负责区域间路由传递&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;广播网络选举 DR/BDR，减少邻接关系数量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用 Cost 来度量，默认是 10^8/接口带宽`&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不同类型得 LSA 负责区域间、区域内、外部路由，LSA 按规定范围泛洪&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;OSPF 的 8 种状态的功能与建立过程&lt;a href=&quot;#ospf-的-8-种状态的功能与建立过程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;状态顺序：&lt;strong&gt;Down → Attempt → Init → 2‑Way → ExStart → Exchange → Loading → Full&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其中&lt;strong&gt;Attempt 是仅限 NBMA 网络（帧中继）才会出现&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;完整 8 个状态交互如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Down（关闭）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一开始没有发送 Hello 报文，则会处于 Down 状态&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attempt（尝试）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手动配置邻居，单播发送 Hello 报文，等待对端回应&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;init（初始化）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当收到 Hello 报文后，开始运行 OSFP，进入 Init 状态&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主要是为了发现对方了解链路信息，开销和邻居等信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;例如：R1 发送 Hello 报文给 R2，R2 收到 Hello 报文看见报文里&lt;code&gt;对方的Router-ID&lt;/code&gt;，了解到对端的相关信息后；&lt;code&gt;R2回复&lt;/code&gt;hello 报文，邻居列表写上 &lt;code&gt;R1 的 RID&lt;/code&gt;，以及相关信息，&lt;code&gt;R1收到&lt;/code&gt;后报文，看见&lt;code&gt;自己的RID在邻居列表&lt;/code&gt;进入 2-Way；R1 此时&lt;code&gt;还需要&lt;/code&gt;发送 Hello 报文，&lt;code&gt;带上R2的RID&lt;/code&gt;，&lt;code&gt;R2收到&lt;/code&gt;报文看见自己的 RID，R2&lt;code&gt;进入2-Way&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此过程需要互相收到对方的 Hello 报文，双向邻居建立&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Router‑ID 只是身份标识；&lt;strong&gt;邻居列表字段才是双向确认的凭证&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2-Way（双向通信）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;收到 Hello，且 Hello 报文中邻居列表存在自己，&lt;strong&gt;双向连通，邻居关系建立&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2-Way 之后，广播网络会做 DR/BDR 选举，&lt;strong&gt;p2p 网络则跳过&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;既不是 DR 指定路由，也不是 BDR 备用指定路由器的其他路由器叫：DRother&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DRother 之间&lt;strong&gt;只停留在 2‑Way&lt;/strong&gt;，不再继续往下走&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要建邻接的设备进入 ExStart。如：DRother ↔ DR；DRother ↔ BDR&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ExStart（预启动）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进入 ExStart 后开始同步 LSDB 数据库，互发 DBD 报文，选举主从，一般 Router‑ID 大的为主设备；它控制 DBD 报文序列号。&lt;strong&gt;只协商主从，不传 LSA 摘要。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;主从确立后进入 ExChange&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ExChange（交换）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入 ExChange 后开始&lt;code&gt;交互携带LSA摘要&lt;/code&gt;的&lt;code&gt;DBD&lt;/code&gt;报文。互相告知自己的&lt;code&gt;LSDB&lt;/code&gt;有哪些 LSA，&lt;strong&gt;只传递 LSA 摘要，不传完整 LSA&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Loading（加载）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对比 DBD 摘要，当发现自己缺少某些 LSA，开始发送 LSR 报文请求完整 LSA&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对端收到 LSR 请求回复 LSU 报文（内携带完整 LSA）；收到后还会回复 LSAck 确认&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;反复请求，更新，确认&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Full（完全邻接）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;所有 LSA 同步完成，LSDB 数据库一致时，开始运行 SPF 算法计算路由，邻接关系完成进入 Full 状态&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成的完整 OSPF 路由表，注意：每台路由器都有自己的全局路由表，邻居之间&lt;strong&gt;不传递路由条目&lt;/strong&gt;，只传 LSA 拓扑，各算各的路由。其中&lt;strong&gt;LSA 老化时间一小时&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无故障时依赖 Hello（10s）报文保活，10 秒发送一次 hello 确保邻居还活着&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当连续四次 hello 报文无响应，有一个&lt;strong&gt;Dead Time 40 秒&lt;/strong&gt;计时器，也就是邻居的最大允许超时时间：&lt;strong&gt;四次 Hello 报文发送周期&lt;/strong&gt;，那么当计时器耗尽就判定邻居失效，删除该邻居与其学习到所有 LSA 重新开始 SPF 计算，状态重置为 Down&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当网络发生变化，生成更新版本号的 LSA，用 LSU 报文泛洪整个网络，但不同类型 LSA 传递范围有限制，仅仅泛洪 LSA 所达的对应范围，详情可看 LSA 分类&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;收到 LSU 的路由器会对比 LSDB，并更新本地 LSDB，回复 LSAck 确认&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发 SPF 重新计算（并不是全部重算）刷新 OSPF 路由表&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邻居状态还是处于 Full 不会退回 ExStart，只有邻居故障断开才会回退状态&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;OSPF 区域&lt;a href=&quot;#ospf-区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;分区域概念：整网不分区仅有 Area0，会导致全设备一个 LSDB，导致网络过大；也会导致 LSA 数量庞大导致全网反复跑 SPF、频繁震荡网络&lt;/p&gt;
&lt;h4&gt;LSA 分类&lt;a href=&quot;#lsa-分类&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;LSA 名称&lt;/th&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;Type‑1&lt;/td&gt;&lt;td&gt;一类 LSA&lt;/td&gt;&lt;td&gt;Router LSA 路由器 LSA&lt;/td&gt;&lt;td&gt;本区域每一台路由器&lt;/td&gt;&lt;td&gt;&lt;strong&gt;本区域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;描述路由器所有直连链路、开销；区域内路由来源&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑2&lt;/td&gt;&lt;td&gt;二类 LSA&lt;/td&gt;&lt;td&gt;Network LSA 网络 LSA&lt;/td&gt;&lt;td&gt;广播网段 DR&lt;/td&gt;&lt;td&gt;&lt;strong&gt;本区域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;描述广播 / NBMA 多路访问网段，列出本网段所有路由器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑3&lt;/td&gt;&lt;td&gt;三类 LSA&lt;/td&gt;&lt;td&gt;Summary‑Network LSA 网络汇总 LSA&lt;/td&gt;&lt;td&gt;ABR&lt;/td&gt;&lt;td&gt;其他区域&lt;/td&gt;&lt;td&gt;传递不同区域之间路由，域间路由 O IA；支持路由汇总&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑4&lt;/td&gt;&lt;td&gt;四类 LSA&lt;/td&gt;&lt;td&gt;Summary‑ASBR LSA ASBR 汇总 LSA&lt;/td&gt;&lt;td&gt;ABR&lt;/td&gt;&lt;td&gt;其他区域&lt;/td&gt;&lt;td&gt;通告 ASBR 路由器的 Router‑ID 位置，为 5 类外部路由服务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑5&lt;/td&gt;&lt;td&gt;五类 LSA&lt;/td&gt;&lt;td&gt;AS‑External LSA AS 外部 LSA&lt;/td&gt;&lt;td&gt;ASBR&lt;/td&gt;&lt;td&gt;&lt;strong&gt;整个 OSPF AS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;引入外部路由（静态、其他协议）；E1/E2 两种度量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑6&lt;/td&gt;&lt;td&gt;六类 LSA&lt;/td&gt;&lt;td&gt;Group‑Membership LSA 组播成员 LSA&lt;/td&gt;&lt;td&gt;MOSPF 路由器&lt;/td&gt;&lt;td&gt;本区域&lt;/td&gt;&lt;td&gt;MOSPF 组播 OSPF 使用，&lt;strong&gt;普通单播 OSPF 不使用&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑7&lt;/td&gt;&lt;td&gt;七类 LSA&lt;/td&gt;&lt;td&gt;NSSA‑External LSA NSSA 外部 LSA&lt;/td&gt;&lt;td&gt;NSSA 区域内 ASBR&lt;/td&gt;&lt;td&gt;&lt;strong&gt;仅 NSSA 区域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;NSSA 区域引入外部路由；NSSA‑ABR 将 7 类转换为 5 类 LSA；N1/N2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑8&lt;/td&gt;&lt;td&gt;八类 LSA&lt;/td&gt;&lt;td&gt;External‑Attribute LSA 外部属性 LSA&lt;/td&gt;&lt;td&gt;ASBR&lt;/td&gt;&lt;td&gt;整个 AS&lt;/td&gt;&lt;td&gt;携带 BGP 等外部路由属性，现网几乎不用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑9&lt;/td&gt;&lt;td&gt;九号 Opaque LSA&lt;/td&gt;&lt;td&gt;Opaque‑LSA（链路本地）&lt;/td&gt;&lt;td&gt;路由器&lt;/td&gt;&lt;td&gt;&lt;strong&gt;仅本地链路&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;扩展特性，不能跨路由器泛洪&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑10&lt;/td&gt;&lt;td&gt;十号 Opaque LSA&lt;/td&gt;&lt;td&gt;Opaque‑LSA（区域范围）&lt;/td&gt;&lt;td&gt;路由器&lt;/td&gt;&lt;td&gt;&lt;strong&gt;本区域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MPLS‑TE、Segment Routing，在本区域泛洪&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type‑11&lt;/td&gt;&lt;td&gt;十一号 Opaque LSA&lt;/td&gt;&lt;td&gt;Opaque‑LSA（AS 全域）&lt;/td&gt;&lt;td&gt;路由器&lt;/td&gt;&lt;td&gt;&lt;strong&gt;整个 AS 域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;SR 等扩展，全 OSPF 域泛洪&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;骨干区域&lt;a href=&quot;#骨干区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Area 0 定义：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;存在且唯一，骨干区域&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;所有普通区域&lt;code&gt;必须直连Area 0&lt;/code&gt;，不能区域挂区域（Area1 连 Area2、不连 0 是错误组网）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;非骨干&lt;code&gt;隔离&lt;/code&gt;开无法直连 Area 0 需配置 虚链路 &lt;code&gt;Virtual-link&lt;/code&gt; 打通至骨干&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Area 0 作用：各区域路由汇总后统一走骨干转发，充当整个 OSPF 的高速主干道&lt;/p&gt;
&lt;h4&gt;非骨干区域&lt;a href=&quot;#非骨干区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Area 1~N 属于非骨干区域&lt;br /&gt;
特点：本区域拓扑变化，LSA 不会出本区域，别的 LSDB 不会受影响&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IR内部路由器&lt;/code&gt;定义：&lt;code&gt;所有接口&lt;/code&gt;&lt;strong&gt;全部在同一个 Area&lt;/strong&gt;（全 Area0 或 全 Area1），&lt;code&gt;不跨区域&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;ABR区域边界路由器&lt;/code&gt;定义：一端 Area 0、一端普通区域；&lt;code&gt;生成3类汇总LSA&lt;/code&gt;；&lt;code&gt;负责区域间路由&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;ASBR自治域边界路由器&lt;/code&gt;定义：&lt;code&gt;ABR设备引入&lt;/code&gt;静态路由、RIP、BGP 等&lt;code&gt;外部路由&lt;/code&gt;就&lt;code&gt;成为ASBR&lt;/code&gt;；&lt;code&gt;生成 5 类 LSA&lt;/code&gt;（NSSA 生成 7 类，出区域变 5 类）&lt;/p&gt;
&lt;h4&gt;特殊区域&lt;a href=&quot;#特殊区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;普通标准区域：&lt;code&gt;1、2、3、4、5类LSA&lt;/code&gt;全部存在&lt;br /&gt;
特殊区域用于&lt;code&gt;屏蔽 4、5类外部LSA&lt;/code&gt;，ABR 自动下发一条&lt;code&gt;默认路由&lt;/code&gt;代替海量明细路由&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;参照明细表：&lt;/p&gt;
&lt;p&gt;+++ info\&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
参照明细表
&lt;/div&gt;
&lt;div&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特殊区域类型&lt;/th&gt;&lt;th&gt;允许保留的 LSA&lt;/th&gt;&lt;th&gt;禁止进入的 LSA&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;1/2/3/4/5 类全量&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;完整路由能力，无优化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stub 末梢区域&lt;/td&gt;&lt;td&gt;1/2/3 类（明细）+ ABRA 下发的默认 3 类路由&lt;/td&gt;&lt;td&gt;4 类、5 类外部 LSA&lt;/td&gt;&lt;td&gt;屏蔽域外海量外部路由，精简 LSDB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Totally Stub 完全末梢区域&lt;/td&gt;&lt;td&gt;1/2 类 + ABR 下发的默认 3 类路由&lt;/td&gt;&lt;td&gt;3 类（明细）、4 类、5 类&lt;/td&gt;&lt;td&gt;极致精简 LSDB，仅保留区域内拓扑 + 默认出网路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NSSA 非纯末梢区域&lt;/td&gt;&lt;td&gt;1/2/3 类（明细）+ 本地 7 类外部 LSA + ABR 下发的默认 3 类路由&lt;/td&gt;&lt;td&gt;外来 4 类、5 类外部 LSA&lt;/td&gt;&lt;td&gt;屏蔽域外外部路由，同时允许本区域引入本地外网路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Totally NSSA 完全非纯末梢区域&lt;/td&gt;&lt;td&gt;1/2 类 + 本地 7 类外部 LSA + ABR 下发的默认 3 类路由&lt;/td&gt;&lt;td&gt;3 类（明细）、外来 4 类、5 类&lt;/td&gt;&lt;td&gt;极致精简 + 本地外网接入能力，分支网点首选&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;;;;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;
简化表
&lt;/div&gt;
&lt;div&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;区域类型&lt;/th&gt;&lt;th&gt;存在 LSA&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;1、2、3、4、5&lt;/td&gt;&lt;td&gt;有 4、5 类，无 7 类&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stub 末梢&lt;/td&gt;&lt;td&gt;1、2、3（无 4、5）&lt;/td&gt;&lt;td&gt;没有 4、5，ABR 下发默认 3 类&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Totally Stub&lt;/td&gt;&lt;td&gt;1、2 + 默认 3 类&lt;/td&gt;&lt;td&gt;无明细 3、无 4、5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NSSA&lt;/td&gt;&lt;td&gt;1、2、3、7（无外来 4、5）&lt;/td&gt;&lt;td&gt;有 7 类，无外部 5 进区&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Totally NSSA&lt;/td&gt;&lt;td&gt;1、2、7 + 默认 3&lt;/td&gt;&lt;td&gt;无明细 3、无外来 4、5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;;;;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;+++&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h5&gt;Stub 末梢区域&lt;a href=&quot;#stub-末梢区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;剔除：&lt;code&gt;4、5类LSA&lt;/code&gt;，保留&lt;code&gt;1、2、3类&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ABR&lt;code&gt;下发&lt;/code&gt;一条&lt;code&gt;默认3类路由&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不允许存在 ASBR，不能引入任何外部路由&lt;/strong&gt;，所以既无 5 类、也无 7 类&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Totally Stub 完全末梢区域&lt;a href=&quot;#totally-stub-完全末梢区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;剔除：&lt;code&gt;3类&lt;/code&gt;（&lt;code&gt;除了默认&lt;/code&gt;）、&lt;code&gt;4、5类LSA&lt;/code&gt;，只剩&lt;code&gt;1、2类&lt;/code&gt; + 一条&lt;code&gt;默认路由&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;LSDB 小，分支网点首选&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;NSSA 非纯末梢区域&lt;a href=&quot;#nssa-非纯末梢区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;可以&lt;code&gt;存在ASBR&lt;/code&gt;，允许本区域&lt;code&gt;引入外部路由&lt;/code&gt;（生成&lt;code&gt;7类LSA&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;过滤外部4、5类LSA，ABR下发默认路由&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ABR 会将 7 类 LSA&lt;code&gt;转换&lt;/code&gt;成 5 类 LSA 发往骨干区和其他区域，且 7 类只能在本 NSSA &lt;code&gt;区域内泛洪&lt;/code&gt;，&lt;code&gt;不&lt;/code&gt;能直接跑&lt;code&gt;出 NSSA&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Totally NSSA 完全非纯末梢区域&lt;a href=&quot;#totally-nssa-完全非纯末梢区域&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;剔除：&lt;code&gt;3类&lt;/code&gt;（&lt;code&gt;除了默认&lt;/code&gt;）、&lt;code&gt;4、5类LSA&lt;/code&gt;，本地&lt;code&gt;外部7类LSA保留&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最优：小分支要接入外网，邮箱精简路由首选&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;距离矢量 VS 链路状态&lt;a href=&quot;#距离矢量-vs-链路状态&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;距离矢量&lt;a href=&quot;#距离矢量&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将路由表发给邻居，邻居依据表计算路由，属于传言式听邻居说&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代表协议：RIP、IGRP、EIGRP(思科)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RIP 最大 15 跳、16 跳不可达，优点：配置简单、内存占用小，适合小型网络，缺点：容易环路 fa 发送路由表造成带宽浪费，跳数做度量，不看链路带宽，高速低速带宽开销一致，选路不合理&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;链路状态&lt;a href=&quot;#链路状态&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;只发送自己的直连链路信息，全网各自绘制最短路径，属于实测式，自己实时画地图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;代表协议：OSPF、IS-IS&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;几乎无路由环路，只有链路发生变化才会发送 LSA 泛洪（链路状态通告），增量更新省带宽&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;度量使用带宽、时延等，选路精确，适合大型网络&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缺点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;占用资源大，设备要求高&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置复杂，需划分区域：Area、DR/BDR 等&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;交换机工作原理&lt;a href=&quot;#交换机工作原理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;二层&lt;a href=&quot;#二层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;mac 学习 交换机收到一个数据帧，读取&lt;strong&gt;帧头的源 MAC 地址&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果 MAC 地址表没有该 MAC，就把「接收端口 + 源 MAC」写入 MAC 地址表；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果已经存在，更新对应端口与老化时间；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;只看&lt;strong&gt;源 MAC&lt;/strong&gt;学习，目的 MAC 用来决定转发。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;帧转发/单播 拿到帧的&lt;strong&gt;目的 MAC 地址&lt;/strong&gt;，查询 MAC 地址表：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ 表中有该 MAC：直接从&lt;strong&gt;对应端口&lt;/strong&gt;转发出去，&lt;strong&gt;不发给其他端口&lt;/strong&gt;（隔离流量）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;❌ 表中没有该 MAC：执行&lt;strong&gt;泛洪（广播转发）&lt;/strong&gt;，向除接收端口以外的&lt;strong&gt;所有端口&lt;/strong&gt;转发该帧。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;广播帧/组播帧&lt;br /&gt;
目的 MAC 是广播&lt;code&gt;FF‑FF‑FF‑FF‑FF‑FF&lt;/code&gt;，交换机直接&lt;strong&gt;泛洪到所有端口&lt;/strong&gt;，所有端口都收到广播。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;老化删除&lt;br /&gt;
MAC 地址表条目有老化时间（默认 300 秒），长时间收不到该设备的报文，条目自动删除，防止表溢出。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三层&lt;a href=&quot;#三层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;二层只看 MAC；三层交换机增加 IP 路由功能，能根据 IP 做跨 VLAN 转发。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::: success&lt;br /&gt;
学习技巧：源 MAC 学习，目的 MAC 查表；查到单播转发，查不到就泛洪；广播帧全端口发，超时老化删表项。&lt;br /&gt;
:::&lt;/p&gt;
&lt;h3&gt;vlan&lt;a href=&quot;#vlan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;核心就是同广播域即可通信，主要又 acc trunk hy 口类型&lt;br /&gt;
用于防止广播域过大，隔离广播域&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;access：主要连接终端，会剥离标签发给终端&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;trunk：主要连接同类型，携带 vlan 标签发给别的交换机、允许多个 vlan 通过，只有&lt;strong&gt;PVID 本征 VLAN 剥离标签&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hybrid：混合包含 access 和 trunk 特点，可以手动指定哪些 vlan 打标签，哪些剥离。自由度高&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::: info&lt;br /&gt;
pvid 和 vid 的区别&lt;br /&gt;
port vlan id 和 vlan id，字面意思，vid 就是 vlan 本身的编号，隶属于数据帧；pvid 是端口的参数，端口对无标签帧分配的 vlan 编号，属于端口配置&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access&lt;/strong&gt; PVID = 端口 VLAN 的 VID； 收到无标签帧，打上这个 VID；发送出去剥离该 VID 标签。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trunk&lt;/strong&gt; PVID 是端口本征 VLAN； PVID 对应的 VID 发送时剥标签；其他 VID 保留标签。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hybrid&lt;/strong&gt; PVID 依旧用来给无标签帧打标签；&lt;strong&gt;剥不剥标签不靠 PVID，手动命令指定每个 VID 是否 untag&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content:encoded><category>category:study</category><category>category:NE</category><category>category:ensp-notes</category><category>tag:数通</category><category>tag:ensp笔记</category><category>tag:study</category></item><item><title>润建服务台面试经验</title><link>https://blog.vull.top/ja/post/life/work/%E6%B6%A6%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%8F%B0%E9%9D%A2%E8%AF%95%E7%BB%8F%E9%AA%8C</link><guid isPermaLink="false">ja:life/work/润建服务台面试经验</guid><description>润建服务台面试经验</description><pubDate>Wed, 19 Aug 2026 02:03:49 GMT</pubDate><content:encoded>&lt;h2&gt;自我介绍&lt;a href=&quot;#自我介绍&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h2&gt;讲一下你的项目经验&lt;a href=&quot;#讲一下你的项目经验&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;刚睡醒，太紧张了，一时想不起来了。。。寄！&lt;/p&gt;
&lt;h2&gt;你熟悉哪些组网协议&lt;a href=&quot;#你熟悉哪些组网协议&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ospf、bpg、vrrp、堆叠&lt;/p&gt;
&lt;h2&gt;说一下堆叠和 M-LAG 区别&lt;a href=&quot;#说一下堆叠和-m-lag-区别&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;堆叠是多设备虚拟成一台、M-LAG 是跨设备链路聚合&lt;/p&gt;
&lt;h3&gt;追问：还有吗&lt;a href=&quot;#追问还有吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;堆叠多设备合并成一个逻辑整体，所有端口统一管理，控制平面合一
M-LAG 每台 独立控制平台只是协同处理跨设备的聚合链路。&lt;/p&gt;
&lt;h2&gt;说一下 ospf 原理&lt;a href=&quot;#说一下-ospf-原理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;链路状态路由协议
主要过程就是：建立邻居 → 形成邻接关系 → 泛洪 LSA 同步 LSDB → 本地算路由
简单来说过程就是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每台路由器收集自己的直连链路信息生成 LSA 链路状态通告，不直接传路由表，把链路状态泛洪发给同区所有邻居&lt;/li&gt;
&lt;li&gt;所有路由器拿完全部 LSA 后，本次存一份 LSDB 库，同区库内数据一样，跑 SPF 最短路径算法，以自己为根算最短路径，算出路由表，选开销最小的路径&lt;/li&gt;
&lt;li&gt;支持划分区域：骨干 a0、非骨干，非骨干细分有：普通区、stub 末节区、totally-stub 区、nssa 非完全末节区、totally-nssa 完全非完全末节&lt;/li&gt;
&lt;li&gt;支持等价路由、触发更新，链路一变就发 LSA 有收敛快、用于组播交互&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;看你简历写了 docker，讲下容器和虚拟化的区别？&lt;a href=&quot;#看你简历写了-docker讲下容器和虚拟化的区别&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;虚拟化是虚拟整个硬件层，每个都有独立系统内核；容器是共享内核
ps: 我就回答了一句。。。&lt;/p&gt;
&lt;h3&gt;追问： 还有吗？&lt;a href=&quot;#追问-还有吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;虚拟机占用大，隔离性更强，容器占用少。精密度高但隔离弱&lt;/p&gt;
&lt;h3&gt;马后炮补充&lt;a href=&quot;#马后炮补充&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;虚拟化，以 KVM、VMware 这类虚拟机为代表，它是对硬件资源做虚拟化抽象，每一台虚拟机都具备完整独立的操作系统内核。Hypervisor 层负责调度底层硬件，虚拟机之间是硬件级别的强隔离。它的缺点是资源开销比较大，镜像通常 GB 级别，启动需要分钟级；优势就是隔离性很强，不同虚拟机可以跑不一样的操作系统，一台虚拟机故障一般不会影响其他实例。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;而容器，像 Docker，属于操作系统级虚拟化，它&lt;strong&gt;不模拟硬件，没有独立内核，直接共享宿主机的操作系统内核&lt;/strong&gt;。依靠 Linux 的 Namespace 做隔离、Cgroups 做资源限制，本质上是宿主机上一组被隔离的进程。所以容器非常轻量，镜像 MB 级别，秒级启动，部署密度高。但缺点就是隔离等级弱于虚拟机，容器只能使用和宿主机相同内核的系统，一旦宿主机内核出问题，所有容器都会受影响。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;说一下你接触过交换机设备型号&lt;a href=&quot;#说一下你接触过交换机设备型号&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;华为&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;千兆接入 &lt;code&gt;S5735&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;万兆汇聚 &lt;code&gt;S6730&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;框式数据中心核心 &lt;code&gt;CE12700&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;联想&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;千兆服务器接入 &lt;code&gt;G7052&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;万兆 TOR 叶交换机 &lt;code&gt;G8272&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;框式 FC 存储光纤 &lt;code&gt;B6505&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;新华三&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;千兆园区接入 &lt;code&gt;S5560&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;万兆汇聚 TOR &lt;code&gt;S6520X&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;框式企业核心 &lt;code&gt;S12500&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;锐捷&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;千兆 PoE 园区接入 &lt;code&gt;RG‑S5310&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;万兆汇聚 &lt;code&gt;RG‑S6150&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;框式数据中心核心&lt;code&gt;N18010&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;博科&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;光纤中小型 &lt;code&gt;SAN G620&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;光纤大型 &lt;code&gt;SAN G630&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;思科&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;千兆园区接入 &lt;code&gt;C9200&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;万兆 IDC 叶交换机 &lt;code&gt;N9K‑C9300&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;说一下上架服务器整个流程&lt;a href=&quot;#说一下上架服务器整个流程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;走工单流程走完后，到机房先检查服务器外观和配件等情况核验是否损坏确定正常
核对服务器型号与机位匹配，准备导轨工具，断电状态下固定服务器，再连接 PDU 电源和机柜布线，通电后通过管理口初始化配置。&lt;/p&gt;</content:encoded><category>category:life</category><category>category:面经</category><category>tag:面经</category><category>tag:就业</category></item><item><title>GIT学习笔记</title><link>https://blog.vull.top/ja/post/study/%E5%BC%80%E5%8F%91/git%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/git%E5%AD%A6%E4%B9%A0</link><guid isPermaLink="false">ja:study/开发/git学习笔记/git学习</guid><description>git基础学习笔记</description><pubDate>Tue, 18 Aug 2026 08:13:49 GMT</pubDate><content:encoded>&lt;h1&gt;GIT 学习&lt;a href=&quot;#git-学习&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;链接 Github&lt;a href=&quot;#链接-github&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在项目目录输入：&lt;code&gt;git init&lt;/code&gt;，作用：初始化当前目录为本地 git 仓库&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git status&lt;/code&gt;，作用：观察仓库分支状态、未追踪文件、commit 记录&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git add .&lt;/code&gt;，作用：将当前目录所有变更文件加入暂存区&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git commit -m &quot;init commit&quot;&lt;/code&gt;，作用：把暂存区文件提交到本地仓库，生成第一条提交记录&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git remote add origin 远端仓库地址&lt;/code&gt;，作用：关联本地仓库与远程仓库，远程仓库别名设为 origin&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git branch -M main&lt;/code&gt;，作用：将本地默认分支重命名为 main，适配 github/gitee 主流分支名&lt;/li&gt;
&lt;li&gt;在项目终端输入：&lt;code&gt;git push -u origin main&lt;/code&gt;，作用：将本地 main 分支推送至远程 origin 仓库，设置上游追踪关系&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>category:study</category><category>category:git</category><category>tag:git</category><category>tag:study</category><category>tag:学习笔记</category><category>tag:github</category></item><item><title>部署AstrBot+Napcat+QQBot记录</title><link>https://blog.vull.top/ja/post/study/%E7%BD%91%E5%B7%A5/docker/%E9%83%A8%E7%BD%B2%E5%AD%A6%E4%B9%A0/%E9%83%A8%E7%BD%B2astrbot-napcat-qqbot</link><guid isPermaLink="false">ja:study/网工/docker/部署学习/部署astrbot-napcat-qqbot</guid><description>学习如何使用Dockers部署AstrBot+Napcat+QQBot</description><pubDate>Mon, 17 Aug 2026 15:25:42 GMT</pubDate><content:encoded>&lt;h1&gt;部署 AstrBot+Napcat+QQBot&lt;a href=&quot;#部署-astrbotnapcatqqbot&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;预览文档&lt;a href=&quot;#预览文档&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astrbot.app/deploy/astrbot/docker.html&quot;&gt;AstrBot 官方文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本次使用 Docker 部署，命令摘要：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; astrbot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; astrbot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;wget&lt;/span&gt;&lt;span&gt; https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; compose&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; astrbot.yml&lt;/span&gt;&lt;span&gt; up&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;部署过程&lt;a href=&quot;#部署过程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;使用 Docker 部署&lt;a href=&quot;#使用-docker-部署&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;执行完摘要中的命令，显示如下图即为安装成功已经运行容器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/eiN0LeLV.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4&gt;查看目标容器运行日记&lt;a href=&quot;#查看目标容器运行日记&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;span&gt; astrbot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/llE2CJZj.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;从上图中可以明确 AstrBot 已经就绪，且有账号与默认密码&lt;/p&gt;
&lt;h4&gt;防火墙放行端口&lt;a href=&quot;#防火墙放行端口&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;两个默认端口需要放行，AstrBot：6185；NapCat：6099&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/H2uUrj3M.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3&gt;修改密码与用户&lt;a href=&quot;#修改密码与用户&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;p&gt;&lt;code&gt;docker logs -f astrbot&lt;/code&gt;
&lt;code&gt;docker logs -f napcat&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;使用日记中所记载的账号密码登录后重置用户与密码，进入下图界面则代表成功&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/kwKNtt5H.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;napcat 则为查看 logs 翻到前面找到 token 输入即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span&gt;如果扫码登录遇到：当前设备网络不稳定或处于复杂网络环境 xxx，切换代理后账密登录&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;创建共享 docker 网络，绑定运行容器&lt;a href=&quot;#创建共享-docker-网络绑定运行容器&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 创建网络&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; network&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; astrbot_net&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 将napcat、astrbot加入这个网络&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; network&lt;/span&gt;&lt;span&gt; connect&lt;/span&gt;&lt;span&gt; astrbot_net&lt;/span&gt;&lt;span&gt; napcat&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; network&lt;/span&gt;&lt;span&gt; connect&lt;/span&gt;&lt;span&gt; astrbot_net&lt;/span&gt;&lt;span&gt; astrbot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 重启两个容器，网络配置生效&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; napcat&lt;/span&gt;&lt;span&gt; astrbot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;NapCat 连接 AstrBot&lt;a href=&quot;#napcat-连接-astrbot&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进入 NapCat UI 后点击&lt;code&gt;网络配置&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;点击新建，选择&lt;code&gt;Websocket客户端&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;名称随意，URL 填写：&lt;code&gt;ws://astrbot:6199/ws&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;复制 Token&lt;/li&gt;
&lt;li&gt;打开 &lt;code&gt;AstrtBot UI&lt;/code&gt; 点击&lt;code&gt;欢迎&lt;/code&gt;栏&lt;/li&gt;
&lt;li&gt;选择&lt;code&gt;配置平台机器人&lt;/code&gt;，消息平台类型&lt;code&gt;选择OneBot v11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;端口 6199，反向 Websocket Token 填入刚刚从 NapCat 复制的 Token&lt;/li&gt;
&lt;li&gt;返回 &lt;code&gt;napcat网页&lt;/code&gt; 点击 &lt;code&gt;猫猫日记&lt;/code&gt; 查看日记
&lt;figure&gt;&lt;img src=&quot;https://vvimg.vull.top/file/blog/yFh8qLo0.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;image.png&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;END&lt;a href=&quot;#end&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;</content:encoded><category>category:study</category><category>category:NE</category><category>category:docker</category><category>tag:study</category><category>tag:docker</category><category>tag:AstrBot</category><category>tag:Napcat</category><category>tag:QQBot</category></item><item><title>Linux笔记</title><link>https://blog.vull.top/ja/post/study/%E7%BD%91%E5%B7%A5/linux/linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4</link><guid isPermaLink="false">ja:study/网工/linux/linux-常用命令</guid><description>liunx常用命令笔记</description><pubDate>Mon, 17 Aug 2026 14:38:17 GMT</pubDate><content:encoded>&lt;h2&gt;常用命令&lt;a href=&quot;#常用命令&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;语法&lt;a href=&quot;#语法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h6&gt;less&lt;a href=&quot;#less&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;与 more 类似，可以随意浏览文件，支持翻页和搜索
&lt;strong&gt;格式&lt;/strong&gt;： Less【参数】 文件
&lt;strong&gt;参数说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-b &amp;lt;缓冲区大小&amp;gt; 设置缓冲区的大小&lt;/li&gt;
&lt;li&gt;-e 当文件显示结束后，自动离开&lt;/li&gt;
&lt;li&gt;-f 强迫打开特殊文件，例如外围设备代号、目录和二进制文件&lt;/li&gt;
&lt;li&gt;-g 只标志最后搜索的关键词&lt;/li&gt;
&lt;li&gt;-i 忽略搜索时的大小写&lt;/li&gt;
&lt;li&gt;-m 显示类似 more 命令的百分比&lt;/li&gt;
&lt;li&gt;-N 显示每行的行号&lt;/li&gt;
&lt;li&gt;-o &amp;lt;文件名&amp;gt; 将 less 输出的内容在指定文件中保存起来&lt;/li&gt;
&lt;li&gt;-Q 不使用警告音&lt;/li&gt;
&lt;li&gt;-s 显示连续空行为一行&lt;/li&gt;
&lt;li&gt;-S 行过长时间将超出部分舍弃&lt;/li&gt;
&lt;li&gt;-x &amp;lt;数字&amp;gt; 将”tab”键显示为规定的数字空格&lt;/li&gt;
&lt;li&gt;/字符串：向下搜索”字符串”的功能&lt;/li&gt;
&lt;li&gt;?字符串：向上搜索”字符串”的功能&lt;/li&gt;
&lt;li&gt;n：重复前一个搜索（与 / 或 ? 有关）&lt;/li&gt;
&lt;li&gt;N：反向重复前一个搜索（与 / 或 ? 有关）&lt;/li&gt;
&lt;li&gt;b 向上翻一页&lt;/li&gt;
&lt;li&gt;d 向后翻半页&lt;/li&gt;
&lt;li&gt;h 显示帮助界面&lt;/li&gt;
&lt;li&gt;Q 退出 less 命令&lt;/li&gt;
&lt;li&gt;u 向前滚动半页&lt;/li&gt;
&lt;li&gt;y 向前滚动一行&lt;/li&gt;
&lt;li&gt;空格键 滚动一页&lt;/li&gt;
&lt;li&gt;回车键 滚动一行&lt;/li&gt;
&lt;li&gt;【pagedown】： 向下翻动一页&lt;/li&gt;
&lt;li&gt;【pageup】： 向上翻动一页&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;head&lt;a href=&quot;#head&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;用于查看文件开头部分内容
&lt;strong&gt;格式：&lt;/strong&gt; head 【参数 】 【文件】
&lt;strong&gt;参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-q 隐藏文件名&lt;/li&gt;
&lt;li&gt;-v 显示文件名&lt;/li&gt;
&lt;li&gt;-c&amp;lt;数目&amp;gt; 显示的字节数。&lt;/li&gt;
&lt;li&gt;-n&amp;lt;行数&amp;gt; 显示的行数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;tail&lt;a href=&quot;#tail&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;查看文件内容
&lt;strong&gt;格式&lt;/strong&gt;：tail 参数 文件
&lt;strong&gt;参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-f 循环读取&lt;/li&gt;
&lt;li&gt;-q 不显示处理信息&lt;/li&gt;
&lt;li&gt;-v 显示详细的处理信息&lt;/li&gt;
&lt;li&gt;-c&amp;lt;数目&amp;gt; 显示的字节数&lt;/li&gt;
&lt;li&gt;-n&amp;lt;行数&amp;gt; 显示文件的尾部 n 行内容&lt;/li&gt;
&lt;li&gt;—pid=PID 与-f 合用,表示在进程 ID,PID 死掉之后结束&lt;/li&gt;
&lt;li&gt;-q, —quiet, —silent 从不输出给出文件名的首部&lt;/li&gt;
&lt;li&gt;-s, —sleep-interval=S 与-f 合用,表示在每次反复的间隔休眠 S 秒&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;file&lt;a href=&quot;#file&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;用于辨识文件类型
&lt;strong&gt;格式&lt;/strong&gt;： file -bcLvz -f &amp;lt;名称文件&amp;gt; -m &amp;lt;默认数字文件&amp;gt;… 文件或目录
&lt;strong&gt;参数&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-b 　列出辨识结果时，不显示文件名称。&lt;/li&gt;
&lt;li&gt;-c 　详细显示指令执行过程，便于排错或分析程序执行的情形。&lt;/li&gt;
&lt;li&gt;-f&amp;lt;名称文件&amp;gt; 　指定名称文件，其内容有一个或多个文件名称时，让 file 依序辨识这些文件，格式为每列一个文件名称。&lt;/li&gt;
&lt;li&gt;-L 　直接显示符号连接所指向的文件的类别。&lt;/li&gt;
&lt;li&gt;-m&amp;lt;魔法数字文件&amp;gt; 　指定魔法数字文件。&lt;/li&gt;
&lt;li&gt;-v 　显示版本信息。&lt;/li&gt;
&lt;li&gt;-z 　尝试去解读压缩文件的内容。&lt;/li&gt;
&lt;li&gt;文件或目录… : 要确定类型的文件列表，多个文件之间使用空格分开，可以使用 shell 通配符匹配多个文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;In&lt;a href=&quot;#in&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;全名 link files 为某个文件在另外一个位置建立一个同步的链接
&lt;strong&gt;格式&lt;/strong&gt;：in 参数 源文件或目录 目标文件或目录
命令参数
&lt;strong&gt;必要参数&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;—backup[=CONTROL] 备份已存在的目标文件&lt;/li&gt;
&lt;li&gt;-b 类似 &lt;strong&gt;—backup&lt;/strong&gt; ，但不接受参数&lt;/li&gt;
&lt;li&gt;-d 允许超级用户制作目录的硬链接&lt;/li&gt;
&lt;li&gt;-f 强制执行&lt;/li&gt;
&lt;li&gt;-i 交互模式，文件存在则提示用户是否覆盖&lt;/li&gt;
&lt;li&gt;-n 把符号链接视为一般目录&lt;/li&gt;
&lt;li&gt;-s 软链接(符号链接)&lt;/li&gt;
&lt;li&gt;-v 显示详细的处理过程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;选择参数&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-S “-S&amp;lt;字尾备份字符串&amp;gt; “或 “—suffix=&amp;lt;字尾备份字符串&amp;gt;”&lt;/li&gt;
&lt;li&gt;-V “-V&amp;lt;备份方式&amp;gt;“或”—version-control=&amp;lt;备份方式&amp;gt;”&lt;/li&gt;
&lt;li&gt;—help 显示帮助信息&lt;/li&gt;
&lt;li&gt;—version 显示版本信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;tar&lt;a href=&quot;#tar&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;全名 tape archive 用于备份打包文件
&lt;strong&gt;格式&lt;/strong&gt;：tar options -f archive.tar files……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f archive.tar&lt;/code&gt;：指定归档文件的名称。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[files...]&lt;/code&gt;：要打包的文件和目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;options 参数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本操作选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;：创建一个新的归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-x&lt;/code&gt;：解压归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt;：列出归档文件的内容。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt;：向现有归档文件中追加文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt;：仅追加比归档文件中已有文件更新的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;：找到归档文件中与文件系统不同步的差异。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-A&lt;/code&gt;：将一个 &lt;code&gt;.tar&lt;/code&gt; 文件追加到另一个 &lt;code&gt;.tar&lt;/code&gt; 文件中。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;文件选择和排除&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f &amp;lt;file&amp;gt;&lt;/code&gt;：指定归档文件的名称（必须放在选项列表的最后）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-C &amp;lt;directory&amp;gt;&lt;/code&gt;：切换到指定目录进行操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exclude=&amp;lt;pattern&amp;gt;&lt;/code&gt;：排除匹配指定模式的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exclude-from=&amp;lt;file&amp;gt;&lt;/code&gt;：从指定文件读取要排除的模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exclude-caches&lt;/code&gt;：排除目录中的缓存文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exclude-backups&lt;/code&gt;：排除以 &lt;code&gt;~&lt;/code&gt; 结尾的备份文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exclude-vcs&lt;/code&gt;：排除版本控制系统生成的文件（如 &lt;code&gt;.git&lt;/code&gt;、&lt;code&gt;.svn&lt;/code&gt; 等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;压缩和解压选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-z&lt;/code&gt;：使用 &lt;code&gt;gzip&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-j&lt;/code&gt;：使用 &lt;code&gt;bzip2&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-J&lt;/code&gt;：使用 &lt;code&gt;xz&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--lzip&lt;/code&gt;：使用 &lt;code&gt;lzip&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--lzma&lt;/code&gt;：使用 &lt;code&gt;lzma&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--lzop&lt;/code&gt;：使用 &lt;code&gt;lzop&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--zstd&lt;/code&gt;：使用 &lt;code&gt;zstd&lt;/code&gt; 压缩归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt;：自动选择压缩方式（基于归档文件的扩展名，如 &lt;code&gt;.tar.gz&lt;/code&gt;、&lt;code&gt;.tar.bz2&lt;/code&gt; 等）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-I &amp;lt;command&amp;gt;&lt;/code&gt;：使用指定的压缩程序进行压缩或解压。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;输出和交互选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;：显示详细操作过程（verbose）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--progress&lt;/code&gt;：显示进度条（与 &lt;code&gt;-v&lt;/code&gt; 一起使用时）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w&lt;/code&gt; 或 &lt;code&gt;--interactive&lt;/code&gt;：在每次操作前询问用户确认。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--checkpoint&lt;/code&gt;：在处理每个文件后显示一个检查点。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--checkpoint-action=&amp;lt;action&amp;gt;&lt;/code&gt;：在检查点执行指定的动作，如 &lt;code&gt;echo&lt;/code&gt;、&lt;code&gt;dot&lt;/code&gt; 等。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--totals&lt;/code&gt;：在操作结束后显示处理的总字节数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--verbose&lt;/code&gt;：详细显示处理的信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--quiet&lt;/code&gt;：尽可能少的输出信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;文件和权限相关选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;：保留文件的原始权限（解压时）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--same-owner&lt;/code&gt;：尝试将解压的文件设为原始所有者（需超级用户权限）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-same-owner&lt;/code&gt;：不设置文件所有者。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--same-permissions&lt;/code&gt;：保留文件的原始权限（与 &lt;code&gt;-p&lt;/code&gt; 相同）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-same-permissions&lt;/code&gt;：不保留原始权限，使用当前用户的 umask 设置权限。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;：在解压时不恢复文件的修改时间，而使用当前时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;归档管理选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-k&lt;/code&gt; 或 &lt;code&gt;--keep-old-files&lt;/code&gt;：解压时保留已有文件，不覆盖。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--overwrite&lt;/code&gt;：解压时强制覆盖已有文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--remove-files&lt;/code&gt;：归档成功后删除原始文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--delete&lt;/code&gt;：从归档文件中删除指定文件（仅限 &lt;code&gt;gnu tar&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--keep-newer-files&lt;/code&gt;：解压时保留比归档中较新的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--listed-incremental=&amp;lt;file&amp;gt;&lt;/code&gt;：创建增量备份或从增量备份恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;文件系统和设备选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-L &amp;lt;N&amp;gt;&lt;/code&gt;：分割大于 &lt;code&gt;N&lt;/code&gt; 字节的归档文件（对于磁带机）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--tape-length=&amp;lt;number&amp;gt;&lt;/code&gt;：指定磁带长度（对于磁带机）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--multi-volume&lt;/code&gt;：创建或恢复多卷归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-M&lt;/code&gt;：与 &lt;code&gt;--multi-volume&lt;/code&gt; 一起使用，处理多卷归档文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--use-compress-program=&amp;lt;prog&amp;gt;&lt;/code&gt;：使用指定的压缩程序。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;其他实用选项&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--transform=&amp;lt;expression&amp;gt;&lt;/code&gt;：重命名归档中的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--strip-components=&amp;lt;number&amp;gt;&lt;/code&gt;：解压时剥离指定数量的路径组件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ignore-failed-read&lt;/code&gt;：忽略读取错误并继续操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--occurrence=&amp;lt;number&amp;gt;&lt;/code&gt;：在归档中选择第 &lt;code&gt;number&lt;/code&gt; 个出现的文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt;：处理稀疏文件（仅归档实际使用的块）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-recursion&lt;/code&gt;：不递归进入目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt; 或 &lt;code&gt;--dereference&lt;/code&gt;：归档符号链接指向的文件而非链接本身。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;帮助和版本信息&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--help&lt;/code&gt;：显示帮助信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--version&lt;/code&gt;：显示 &lt;code&gt;tar&lt;/code&gt; 的版本信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;mkdir&lt;a href=&quot;#mkdir&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;全名 make directory 用于创建目录
&lt;strong&gt;格式&lt;/strong&gt;： mkdir -p dirName&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参数&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;：创建多级目录结构，父目录不存在回自动创建&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;：设置权限，例：mkdir -m 755 my_directory&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-Z&lt;/code&gt;：为目录设置安全上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;：显示详细信息，包括正在创建的目录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-Z&lt;/code&gt;：为目录设置安全上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--help&lt;/code&gt;：显示帮助信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--version&lt;/code&gt;：显示 &lt;code&gt;tar&lt;/code&gt; 的版本信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;awk&lt;a href=&quot;#awk&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h6&gt;
&lt;p&gt;强大文本处理工具
&lt;strong&gt;格式&lt;/strong&gt;：awk options ‘pattern {acation}’ file
&lt;strong&gt;选项参数说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;：是一些选项，用于控制 &lt;code&gt;awk&lt;/code&gt; 的行为。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pattern&lt;/code&gt;：是用于匹配输入数据的模式。如果省略，则 &lt;code&gt;awk&lt;/code&gt; 将对所有行进行操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&lt;/code&gt;：是在匹配到模式的行上执行的动作。如果省略，则默认动作是打印整行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;options 参数说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-F &amp;lt;分隔符&amp;gt;&lt;/code&gt; 或 &lt;code&gt;--field-separator=&amp;lt;分隔符&amp;gt;&lt;/code&gt;： 指定输入字段分隔符 ，默认是空格或制表符。比如 awk -F: ‘{print $1}’ /etc/passwd ，以冒号为分隔符，打印 /etc/passwd 文件每行的第一个字段。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v &amp;lt;变量名&amp;gt;=&amp;lt;值&amp;gt;&lt;/code&gt;： 为 awk 脚本定义变量。例如 &lt;code&gt;awk -v var=10 &apos;{print $1 + var}&apos; file.txt&lt;/code&gt; ，将变量 &lt;code&gt;var&lt;/code&gt; 设置为 10 ，并把文件中每行的第一个字段加上 10 。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f &amp;lt;脚本文件&amp;gt;&lt;/code&gt;： 指定包含 awk 脚本的文件。像 &lt;code&gt;awk -f script.awk data.txt&lt;/code&gt; ，会执行 &lt;code&gt;script.awk&lt;/code&gt; 中的脚本，处理 &lt;code&gt;data.txt&lt;/code&gt; 文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-V&lt;/code&gt; 或 &lt;code&gt;--version&lt;/code&gt;： 显示 &lt;code&gt;awk&lt;/code&gt; 的版本信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt; 或 &lt;code&gt;--help&lt;/code&gt;： 显示 &lt;code&gt;awk&lt;/code&gt; 的帮助信息，包括选项和用法示例。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:study</category><category>category:NE</category><category>category:linux</category><category>tag:linux</category><category>tag:study</category></item><item><title>计算操作系统总复习</title><link>https://blog.vull.top/ja/post/study/%E8%AE%A1%E7%AE%97%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E6%80%BB%E5%A4%8D%E4%B9%A0</link><guid isPermaLink="false">ja:study/计算操作系统/os总复习</guid><description>计算机操作系统学习笔记</description><pubDate>Wed, 12 Aug 2026 10:26:45 GMT</pubDate><content:encoded>&lt;h2&gt;1、操作系统发展过程&lt;a href=&quot;#1操作系统发展过程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;无操作系统的计算机系统&lt;/strong&gt;
概念：硬件直接运行程序
应用场景：早期简单嵌入式设备，如电子计算器
&lt;strong&gt;单道批处理系统&lt;/strong&gt;
概念：一批作业脱机输入磁带，按序处理
应用场景：早期科学计算中心，管理员按序处理作业
&lt;strong&gt;多道批处理系统&lt;/strong&gt;
概念：内存同时存多专业，共享资源交替
应用场景：大型数据处理中心，银行批处理业务
&lt;strong&gt;分时系统&lt;/strong&gt;
概念：多用户分时共享计算机，轮流使用 CPU
应用场景！：学习计算机实验，远程登录系统
&lt;strong&gt;实时系统&lt;/strong&gt;
概念：及时响应外部事件，按时完成处理
应用场景：飞机飞行控制系统，视频会议系统&lt;/p&gt;
&lt;h2&gt;2、操作系统的基本特征&lt;a href=&quot;#2操作系统的基本特征&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;并发（Concurrent）&lt;/strong&gt;
含义：多事件同时间间隔发生，宏观是同时，微观是交替
作用：提高资源利用率与系统吞吐量
&lt;strong&gt;共享（Sharing）&lt;/strong&gt;
含义：系统资源供多进程共用
作用：提高资源利用率，帮助进程协同
&lt;strong&gt;虚拟（Virtual）&lt;/strong&gt;
含义：物理实体变多个逻辑对应物
作用：提供方便灵活方式，提高资源利用率与灵活性
&lt;strong&gt;异步性（Asynchronism）&lt;/strong&gt;
含义：进程并发执行，走走停停
作用：系统协调管理，确保稳定正确&lt;/p&gt;
&lt;h2&gt;3、操作系统的主要功能&lt;a href=&quot;#3操作系统的主要功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;处理机管理&lt;/strong&gt;：分配。调度处理机、让多个程序高效运行
&lt;strong&gt;存储器管理&lt;/strong&gt;：合理分配内存、保障程序运行空间
&lt;strong&gt;设备管理&lt;/strong&gt;：控制、管理各类设备，方便用户使用
&lt;strong&gt;用户接口&lt;/strong&gt;：提供交互界面，方便用户操作和使用系统&lt;/p&gt;
&lt;h2&gt;4、进程同步的基本概念&lt;a href=&quot;#4进程同步的基本概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;含义&lt;/strong&gt;：多个进程并发时，按规则协作以正确执行
&lt;strong&gt;目的&lt;/strong&gt;：防竞争条件，保证协作顺利
&lt;strong&gt;机制&lt;/strong&gt;：信号量、管程、消息传递等，协调进程对资源访问与协作
&lt;strong&gt;信号量&lt;/strong&gt;：是一种用于实现进程同步和互斥的整形变量，通过&lt;strong&gt;P&lt;/strong&gt;（等待）&lt;strong&gt;V&lt;/strong&gt;（释放）操作来控制进程对资源的访问。
&lt;strong&gt;管程&lt;/strong&gt;：高级同步机制，将共享资源以及操作封装在一个模块中，进程通过调用管程中的过程来访问共享资源，内部自动实现同步与互斥。
&lt;strong&gt;消息传递&lt;/strong&gt;：通过发送与接受消息来进行通信和同步，发送时等待接收方响应，以此实现协调&lt;/p&gt;
&lt;h3&gt;临界区&lt;a href=&quot;#临界区&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;不论是 &lt;mark&gt;硬件临界值&lt;/mark&gt; 还是 &lt;mark&gt;软件临界资源&lt;/mark&gt;，多个进程必须 &lt;strong&gt;互斥&lt;/strong&gt; 地对它进行访问&lt;/li&gt;
&lt;li&gt;在每个进程中访问临界资源的那段代码成为&lt;mark&gt;临界区&lt;/mark&gt;（Critical Section）&lt;/li&gt;
&lt;li&gt;每个进程进入临界区之前应先对 &lt;mark&gt;欲访问的临界资源进行检查&lt;/mark&gt;，看是否正在访问。如果刺客该临界资源未被访问，该进程可进入临界区，并设置它正在访问的标志，在临界区 &lt;mark&gt;之前&lt;/mark&gt; 执行的这段代码成为 &lt;mark&gt;进入区（Entry Section）&lt;/mark&gt;&lt;/li&gt;
&lt;li&gt;在临界区 &lt;mark&gt;之后&lt;/mark&gt; 也要加上一段代码，用于将临界区访问的标志变成未被访问的标志，成为 &lt;mark&gt;退出区（Exit Section）&lt;/mark&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;执行流程如图：
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://i0.hdslb.com/bfs/article/1fdfdae871c7458d473f1b12e5b3cf9d397331738.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;5、进程的基本状态及转换&lt;a href=&quot;#5进程的基本状态及转换&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&quot;https://i0.hdslb.com/bfs/article/049e08ffb5a5d025bb00bb3b86e4cac0397331738.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h2&gt;练习 1.0&lt;a href=&quot;#练习-10&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;处于执行状态中的进程若同时发生了下列两种情况:(a)对某信号量执行 P 操作后,其结果为负。(b)时间片到了中断发生。则该进程将由执行状态变迁为(	 A	 )状态。
A.阻塞 	B.就绪	      C.阻塞或就绪	     D.不定&lt;/p&gt;
&lt;p&gt;在多进程系统中，为了保证共享变量的完整性，各进程应互斥进入临界区，所谓临界区是指（D）
A. 一个缓冲区            B. 一段数据区           C. 同步机制               D. 一段程序&lt;/p&gt;
&lt;h2&gt;练习题 2.0&lt;a href=&quot;#练习题-20&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个数据采集处理系统有两个进程 A，B。进程 A 负责数据采集，并把采集到的数据存入缓冲区 H 中，供进程 B 做数据处理。系统规定：仅当进程 B 取走了 H 中的数据后进程 A 才能在 H 中存入新的数据。为使进程能正确地并发执行，现用 PV 操作进行管理，回答下列问题：
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://i0.hdslb.com/bfs/article/862d810fd8099b55ed0b4504e5162b93397331738.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
（1）应怎样定义信号量？写出信号量的作用及其初值。
==定义一个信号量 &lt;code&gt;S1&lt;/code&gt;，初始值为 &lt;code&gt;1&lt;/code&gt;，用于进程 &lt;code&gt;B&lt;/code&gt; 通知进程 &lt;code&gt;A&lt;/code&gt; 数据已经被取走==
==定义一个信号量 &lt;code&gt;S2&lt;/code&gt;，初始值为 &lt;code&gt;0&lt;/code&gt;，用于通知进程&lt;code&gt;B&lt;/code&gt;取走数据==
（2）在如下程序的方框位置填上合适的 P 操作或 V 操作，使它们能正确地并发执行。
①处填 &lt;code&gt;P(S1)&lt;/code&gt;  ②处填 &lt;code&gt;V(S2)&lt;/code&gt;  ③处填 &lt;code&gt;P(S2)&lt;/code&gt;   ④处填 &lt;code&gt;V(S1)&lt;/code&gt;&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;练习题 3.0&lt;a href=&quot;#练习题-30&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;某自动流水线由生产进程 A、检验进程 B 和包装进程 C 三部分组成。进程 A 每生产一件物品就将其放入检验箱内。进程 B 对待检物品进行检验，若合格，则将其放入包装箱内，否则丢入废物箱。进程 C 将对合格产品进行包装。假如检验箱和包装箱每次都只能存放一件物品，现采用 PV 操作进行管理，为使流水线能正确协调工作，请完善如下程序。&lt;/p&gt;
&lt;p&gt;S1,S2,S3,S4 : 1.semaphore ;
S1 := S2 := 1;  S3 := S4 := 0;
cobegin
process A
begin
L1: 生产一件物品;
2.P(S1) ;
物品存检验箱;
3.V(S3) ;
goto L1
end;
process B
begin
L2:
4.P(S3) ;
从检验箱取物品;
5.V(S1) ;
检验;
if 合格 then
begin
6.P(S2) ;
物品存包装箱;
end
7.P(S4)  ;
else 丢弃;
goto L2
end;
process C
begin
L3
8.P(S4) ;
从包箱取物品;
9.V(S2) ;
包装;
goto L3
end;
coend;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题4.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;补充1：**什么是进程？简述进程与程序的主要区别**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;==**答案**：它是程序在计算机中动态的一次执行过程，含程序，数据、进程控制块（PCB）。是资源分配和调度的基本单位，具有并发性、动态性、独立性、异步性等特征。==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;==**与程序的区别：**==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	==状态：程序静态，进程动态是动态的==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	==资源：程序不占资源，进程运行时分配==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	==对应：一程序可对多进程，一进程某时只对一程序==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;补充2：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;设公共汽车上有一位司机和一位售票员，它们的活动如下：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    司机：       售票员：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    启动车辆     售票&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    正常行车     开车门&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    到站停车     关车门&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;请分析司机与售票员之间的同步关系，如何用PV操作实现。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;**==答案**：定义两个信号量：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;`S1` 初始值为 `0`，用于表示售票员是否关好车门，`0` 表示未关好，`1` 表示已关好；&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;`S2` 初始值为 `1`，用于表示司机是否到站停车，`0` 表示未停车，`1` 表示已停车。==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;==**司机**==&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;begin
定义信号量 S1 = 1; // 允许售票员开始工作
定义信号量 S2 = 0; // 售票员等待停车通知&lt;/p&gt;
&lt;p&gt;plain L1:
P(S1); // 等待售票员关好车门
启动车辆;
正常行车;
到站停车;
V(S2); // 通知售票员车辆已到站停车
goto L1;
end;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;**==售票员==**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;begin
定义信号量 S1 = 1; // 允许售票员开始工作
定义信号量 S2 = 0; // 售票员等待停车通知&lt;/p&gt;
&lt;p&gt;plain L2:
P(S2); // 等待司机到站停车通知
开车门;
售票;
关车门;
V(S1); // 通知司机车门已关好
goto L2;
end;&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题5.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/cdee3999f1e42300aa706c698088504b397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/cad1da40ee658d1d67be4b537416e9c8397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **先来先服务（FCFS）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **短作业优先（SJF）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **选择规则**：选择当前已到达且服务时间最短的作业（进程）执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题6.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/617d95a2a5f56cabdaa836c09b1b5176397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题7.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/86f1fb0cb402ffe6be71e4e47bc05343397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/daaeb116283eb30dafb5497079878fb2397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/ef508b0afdf295434dd5b22c800f5d01397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/6193de712106e99a71b56056619ca978397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题8.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/79c59591ab01c273fc22930b0ea88e4d397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/e37f583a2b36989376d76debaf172464397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题9.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/9d03bd25eeffbfc899bd58567eaa7db5397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/ff078b6a715bf4d2804509e3dcd218b4397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/a2fa552cb10d9630bacc44b25d00399a397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/10a8468cc1e02fc46e16c82b4d8d5d0b397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题11&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/ea05845112c17b6f902625dc2d227843397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;![](https://i0.hdslb.com/bfs/article/4ad2909f38bbd54840bc67524d2ec89f397331738.png)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;要根据响应比来计算优先，&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;公式为：（当前时间 - 到达时间 + 服务时间）/ 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 练习题12&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 6、死锁&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 死锁的定义&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;**定义**：多个进程因为相互竞争资源而陷入一种相互等待的状态，导致这些进程无法执行，也无法释放资源，形成一种僵局&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;**产生的必要条件：**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**互斥条件**：至少有一个资源是不能共享的，即每次只能一个进程使用（==进行排它性使用）==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**占用并等待（请求和保持条件）**：一个进程已占有某些资源，而且正在其他资源，但这些资源已被其他进程占有&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**不可剥夺**：已分配资源不能被剥夺。只能由进程自行释放&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**循环等待**：存在一个进程循环等待其他进程的资源，形成环路&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;处理死锁方法：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**预防死锁**：通过破坏其他一个必要条件来避免&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**避免死锁**：通过动态分配资源，确保系统始终处于安全状态，例：银行家算法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**检测和接解除死锁**：监控系统资源分配情况，检测死锁并采取措施，例：中止进程、回滚操作&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**忽略死锁**：某些情况下，死锁发生概率很小，可以不做处理，交由用户自行解决&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;**安全状态**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	**概念**：指系统能按某种进程顺序（P1、P2.....Pn），来为每个进程Pn分配所需资源，直至满足每个进程对资源的最大需求，使每个进程都能顺利完成。如果系统无法找到这样一个==安全序列==，则称系统处于==不安全状态==。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 公式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 一、进程调度算法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **先来先服务（FCFS）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **短作业优先（SJF）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **选择规则**：选择当前已到达且服务时间最短的作业（进程）执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;3. **高响应比优先（HRRN）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - 等待时间：系统当前开始时间 - 进程到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **响应比**：（等待时间 + 要求服务时间）/ 要求服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **选择规则**：每次选择响应比最高的作业（进程）执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4. **时间片轮转（RR）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **周转时间**：完成时间 - 到达时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均周转时间**：所有进程周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **带权周转时间**：周转时间 / 服务时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均带权周转时间**：所有进程带权周转时间之和 / 进程个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **执行规则**：每个进程被分配一个时间片，轮流执行，时间片用完后，无论是否完成，都切换到下一个进程&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 二、页面置换算法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **最佳置换（OPT）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **预知未来页面的使用情况，从而选择在未来最长时间内不会被使用的页面进行置换。**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页次数**：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页率**：缺页次数 / 页面访问序列长度&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **置换规则**：选择未来最长时间内不会被访问的页面进行置换（实际难以实现，用于理论比较）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **先进先出（FIFO）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **是指先进入内存的页面先被替换出去。**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页次数**：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页率**：缺页次数 / 页面访问序列长度&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **置换规则**：选择最先进入内存的页面进行置换&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;3. **最近最久未使用（LRU）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **淘汰最近最少使用的页面。**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页次数**：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **缺页率**：缺页次数 / 页面访问序列长度&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **置换规则**：选择最近最久未被使用的页面进行置换&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 三、磁盘调度算法&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **先来先服务（FCFS）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **寻道时间**：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **总寻道时间**：所有寻道时间之和&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均寻道长度**：总寻道长度 / 磁盘请求个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **处理规则**：按照磁盘请求的到达顺序依次处理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **最短寻道时间优先（SSTF）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **寻道时间**：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **总寻道时间**：所有寻道时间之和&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均寻道长度**：总寻道长度 / 磁盘请求个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **处理规则**：选择与当前磁头位置距离最近的磁道请求进行处理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;3. **扫描（SCAN）算法（电梯算法）**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **寻道时间**：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **总寻道时间**：所有寻道时间之和&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均寻道长度**：总寻道长度 / 磁盘请求个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **处理规则**：磁头沿着一个方向移动，处理沿途的磁盘请求，直到到达一端，然后改变方向继续处理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4. **循环扫描（CSCAN）算法**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **寻道时间**：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **总寻道时间**：所有寻道时间之和&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **平均寻道长度**：总寻道长度 / 磁盘请求个数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - **处理规则**：磁头沿着一个方向移动，处理沿途的磁盘请求，到达一端后，立即回到起始端，然后再沿相同方向处理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 四、Cache 相关&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **Cache 命中率计算**：Cache 命中次数 / 访问总次数&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **平均访问时间**：命中率 ×Cache 访问时间 +(1 - 命中率)× 主存访问时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### 五、虚拟存储器相关（以页式为例）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. **用户作业最多页数**：虚拟地址空间大小 / 页面大小&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. **主存空间划分的块数**：主存容量 / 页面大小&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;3. **页号**：INT (逻辑地址 / 页面大小)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4. **页内地址**：逻辑地址 MOD 页面大小&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;5. **物理地址**：块号 × 页面大小 + 页内地址&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;6. 页内偏移：逻辑地址 MOD 页面大小&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>category:study</category><category>category:OS</category><category>tag:计算机操作系统</category><category>tag:Operating_system</category><category>tag:study</category></item><item><title>计算操作系统笔记</title><link>https://blog.vull.top/ja/post/study/%E8%AE%A1%E7%AE%97%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F</link><guid isPermaLink="false">ja:study/计算操作系统/计算机操作系统</guid><description>计算机操作系统学习笔记</description><pubDate>Tue, 11 Aug 2026 10:26:45 GMT</pubDate><content:encoded>&lt;h1&gt;1. 操作系统概论&lt;a href=&quot;#1-操作系统概论&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;操作系统就是指控制和管理整个计算机系统的硬件和软件资源，并且合理地组织调度计算机的工作和资源的分配，提供给用户和其他软件比较方便的接口和环境，是计算机系统中最佳的系统软件（&lt;strong&gt;非硬件&lt;/strong&gt;）&lt;/p&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;裸机&lt;/th&gt;&lt;th&gt;OS&lt;/th&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;指硬件：CPU、主板&lt;/td&gt;&lt;td&gt;如：window、Linux&lt;/td&gt;&lt;td&gt;如：QQ&lt;/td&gt;&lt;td&gt;字面意思&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;1.1 特征&lt;a href=&quot;#11-特征&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;并发&lt;/strong&gt;：指两个或者多个事件在同一时间间隔发生，宏观同时，微观交替&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;共享&lt;/strong&gt;：系统中可供内存当中多个并发执行的进程共同使用
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;互斥共享&lt;/strong&gt;：资源在特定的一段时间内只允许一个进程访问该资源
&lt;ul&gt;
&lt;li&gt;例如：微信和 QQ 不能同时访问使用摄像头&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同时共享&lt;/strong&gt;：一个时间段内允许多个进程同时对某些资源进行访问
&lt;ul&gt;
&lt;li&gt;例如：微信和 QQ 可以同时访问相册里面的图片&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟&lt;/strong&gt;：一个物理意义上的实体变为若干个逻辑上的对应物，物理实体是实际存在的，而逻辑上的对应物就是用户感受到的；用于实现虚拟的技术，也称虚拟技术。 虚拟存储器技术就是通过多道程序设计技术，采用让多道程序并发执行的方法来分时使用一个处理器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步&lt;/strong&gt;：在多道程序环境下，允许多个程序并发执行，但由于资源有限，进程的执行不是一贯到底的，而是走走停停，以不可预知的速度向前推荐，这就是进程的异步性。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1.2 功能与接口&lt;a href=&quot;#12-功能与接口&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1.2.1 功能&lt;a href=&quot;#121-功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;操作系统作为管理者包含：&lt;strong&gt;处理机管理、储存器管理，文件管理，设备管理。&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;处理机管理：多道程序环境下，分配和运行都&lt;strong&gt;以进程的为基本单位&lt;/strong&gt;，因而需要处理机管理可&lt;strong&gt;归纳为进程管理&lt;/strong&gt;，包含：&lt;strong&gt;进程控制、进程同步、进程通信、死锁处理、处理机调度等。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;存储器管理：提供环境，方便用户使用及提高内存的利用率，包含：&lt;strong&gt;内存分配与回收、地址映射、内存保护与共享和内存扩充&lt;/strong&gt;等功能。&lt;/li&gt;
&lt;li&gt;文件管理：也称&lt;strong&gt;文件系统&lt;/strong&gt;，包含：&lt;strong&gt;储存空间管理、目录管理、文件读写管理和保护&lt;/strong&gt;等。&lt;/li&gt;
&lt;li&gt;设备管理：主要&lt;strong&gt;完成用户的 I/O 请求&lt;/strong&gt;，访问用户使用各种设备，提高&lt;strong&gt;设备使用率&lt;/strong&gt;，包含：&lt;strong&gt;缓冲管理、设备分配、设备处理、虚拟设备等功能。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.2.2 接口&lt;a href=&quot;#122-接口&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;命令接口
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;联机命令接口：又称交互式命令接口，适用于分时或实时系统的接口&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;脱机命令接口：又称批处理命令接口，适用于批处理系统，它由一组作业控制命令组成。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;程序接口
&lt;ul&gt;
&lt;li&gt;图像接口：&lt;strong&gt;GuI&lt;/strong&gt;（并不是操作系统的一部分，而&lt;strong&gt;调用的接口&lt;/strong&gt;才是）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1.3 操作系统发展过程&lt;a href=&quot;#13-操作系统发展过程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1.3.1 单道批处理系统&lt;a href=&quot;#131-单道批处理系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;特点：单路性、独占性、自动性、封闭性、顺序性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点：系统资源得不到充分利用&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.3.2 多道批处理系统&lt;a href=&quot;#132-多道批处理系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;特点：多路性、共享性、自动性、封闭性、无序性、调度性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;好处：提高 cpu 的利用率，提高内存和 I/O 设备利用率，增加系统吞吐量&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点：平均周转时间长，无交互能力&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.3.3 分时系统&lt;a href=&quot;#133-分时系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;概念：指一台主机上连接了多个配有显示器和键盘的终端，由此组成的系统。该系统允许多个用户同时通过自己的终端，以交互方式使用计算机，共享主机中的资源。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;特点：同时性、交互性、独立性、及时性&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点：不能在特定时间显示及时处理&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1.3.4 实时系统&lt;a href=&quot;#134-实时系统&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;硬实时：某个动作必须绝对在规定时间内必须完成&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软实时：能够偶尔违反时间规定，但不会引起任何永久性的伤害或损害&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;特点：&lt;strong&gt;及时性和可靠性&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1.4 操作系统运行环境&lt;a href=&quot;#14-操作系统运行环境&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1.4.1 用户态与核心态&lt;a href=&quot;#141-用户态与核心态&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;CPU 执行两种不同性质的程序：一是系统&lt;strong&gt;内核程序&lt;/strong&gt;，二是&lt;strong&gt;应用程序&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;操作系统划分&lt;strong&gt;用户态&lt;/strong&gt;和&lt;strong&gt;核心态&lt;/strong&gt;，严格区分两类程序，&lt;strong&gt;用户自编的程序运行在用户态&lt;/strong&gt;，而操&lt;strong&gt;作系统的内核程序运行在核心态&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;用户态：命令解释程序、&lt;/li&gt;
&lt;li&gt;核心态：进程调度程序、时钟中断处理程序、缺页处理程序&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!lol] 有趣的小知识
系统调用是在用户态，被调用的程序在核心态执行
外部中断是在用户态发生，但是处理是在核心态 执行
缺页是在用户态发生，处理在核心态执行
缺页处理程序是在核心态执行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;1.4.2 内核&lt;a href=&quot;#142-内核&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;概念：内核是计算机最底层的软件，是计算机功能的眼神，大多包含四个方面&lt;/p&gt;
&lt;h4&gt;1.4.2.1 时钟&lt;a href=&quot;#1421-时钟&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;时钟管理：计时器，操作系统需要通过时钟管理向用户&lt;strong&gt;提供准确的时间&lt;/strong&gt;，通过&lt;strong&gt;时钟中断&lt;/strong&gt;的管理，可实现&lt;strong&gt;进程的切换&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1.4.2.2 中断&lt;a href=&quot;#1422-中断&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;中断机制：引入的初衷是&lt;strong&gt;提高多道程序环境中 CPU 的利用率&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;（例如外部设备的数据传输请求、硬件故障、定时器时间到达等情况）时，CPU 暂停当前正在执行的程序，转而去执行处理该特殊事件的一段程序（称为中断服务程序）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外中断（中断&lt;/strong&gt;）
&lt;ol&gt;
&lt;li&gt;来源于&lt;strong&gt;CPU 外部&lt;/strong&gt;与当前执行的指令有关&lt;/li&gt;
&lt;li&gt;系统控制的数据结构及处理：如 I/O 操作完成发出中断信号&lt;/li&gt;
&lt;li&gt;系统控制的数据结构及处理：如 用户强制终止一个进程&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内中断（异常&lt;/strong&gt;）
&lt;ol&gt;
&lt;li&gt;来源于&lt;strong&gt;CPU 内部&lt;/strong&gt;与当前执行的指令有关&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源中断&lt;/strong&gt;—&lt;strong&gt;指令中断&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;如：系统调用时使用访管指令（又称陷入指令，Trap 指令）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强迫中断&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;主要有：硬件故障，（如：缺页），或软件中断（如：整数除 0）&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;发生中断意味着需要操作系统的介入
&lt;ol&gt;
&lt;li&gt;用户态切换核心态是通过中断实现。&lt;strong&gt;中断也是的唯一途径&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;核心态切换用户态是通过执行一些特权指令，将&lt;strong&gt;程序状态字（PSW）的标志位&lt;/strong&gt;设置为用户态&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1.4.2.3 原语&lt;a href=&quot;#1423-原语&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;原语：底层的一些可被调用的&lt;strong&gt;公用小程序&lt;/strong&gt;，他们各自完成一个规定的操作，是&lt;strong&gt;不可分&lt;/strong&gt;的。
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最底层&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原子性&lt;/strong&gt;：考虑到系统的&lt;strong&gt;安全性和便于管理&lt;/strong&gt;，所以操作时&lt;strong&gt;一气呵成的&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行时间短&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用相对频繁&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;定义原语的方法就是&lt;strong&gt;关闭中断&lt;/strong&gt;，让其他所有的动作不可分割的完成之后再打开中断&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;1.4.2.4 系统控制的数据结构及处理&lt;a href=&quot;#1424-系统控制的数据结构及处理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;h1&gt;2. 进程的描述与控制&lt;a href=&quot;#2-进程的描述与控制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;2.1 进程的概念&lt;a href=&quot;#21-进程的概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;2.1.1 定义&lt;a href=&quot;#211-定义&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;不同角度。进程可以有不同的定义，比较经典有：
&lt;ol&gt;
&lt;li&gt;进程是&lt;strong&gt;程序的一次执行&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;进程是&lt;strong&gt;一个程序及其数据在处理机上顺序执行时所发生的活动&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;进程时具有&lt;strong&gt;独立功能的程序&lt;/strong&gt;，&lt;strong&gt;在一个数据集合上运行的过程&lt;/strong&gt;，它是系统进行资源分配和调度的一个&lt;strong&gt;独立单位&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.1.2 组成&lt;a href=&quot;#212-组成&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进程是&lt;strong&gt;程序控制块（PCB）、程序段、数据段组成&lt;/strong&gt;的&lt;/li&gt;
&lt;li&gt;操作系统是通过&lt;strong&gt;PCB 来管理&lt;/strong&gt;进程，因此 PCB 中应包含操作系统对其运行管理啊所需各种信息，如：&lt;strong&gt;进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息。&lt;/strong&gt;    （如：进程状态和优先级信息就是属于进程描述信息）
&lt;ol&gt;
&lt;li&gt;程序段：程序代码&lt;strong&gt;存放的位置&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;数据段：程序运行时使用、产生的&lt;strong&gt;运算数据&lt;/strong&gt;。如：&lt;strong&gt;全局变量、局部变量、宏定义的常量&lt;/strong&gt;就存在数据段中。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;进程也可以称为：&lt;strong&gt;进程实体&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.1.3 组织方式&lt;a href=&quot;#213-组织方式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链接方式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;安装进程状态将 PCB 分为多个队列，操作系统持有指向各个队列的指针
&lt;ul&gt;
&lt;li&gt;就绪队列&lt;/li&gt;
&lt;li&gt;运行队列&lt;/li&gt;
&lt;li&gt;阻塞队列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;索引方式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;根据进程的不同状态，建立几张索引表，操作系统持有指向各个索引表的指针
&lt;ul&gt;
&lt;li&gt;就绪队列&lt;/li&gt;
&lt;li&gt;运行队列&lt;/li&gt;
&lt;li&gt;阻塞队列&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1.4 特征&lt;a href=&quot;#214-特征&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;动态性&lt;/strong&gt;：最基本特征，是程序的一次执行过程，是动态发生的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发性&lt;/strong&gt;：内存中多个进程实体，各进程可并发执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立性&lt;/strong&gt;：能独立运行，独立获取资源，独立接受调度的基本单位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异步性&lt;/strong&gt;：各个进程各自独立，不可预知的速度向前推进，操作系统提供进程同步机制来解决异步问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构性&lt;/strong&gt;：每个进程会配置应该 PCB，结构上来看，进程由程序段、数据段和 PCB 组成&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!lol] 有趣
进程的是动态的
程序是静态的，且不具备进程的特征：动态、并发、独立、异步、结构性。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;程序具有再现性（再现性：不管从一而终还是停停走走都将获得相同的结果）&lt;/li&gt;
&lt;li&gt;程序具有封闭性（在封闭的环境运行，独占系统的资源，除了初始状态之外，一旦开始执行不受外界影响，只能自己主动改变才会改变。）&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2.2 状态与转换&lt;a href=&quot;#22-状态与转换&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;2.2.1 定义&lt;a href=&quot;#221-定义&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;定义：一个进程的生命周期内可以划分为一组状态，这个状态刻画了整个进程。进程状态体现一个进程的生命状态&lt;/p&gt;
&lt;h4&gt;2.2.2 五个状态&lt;a href=&quot;#222-五个状态&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创建态&lt;/strong&gt;：进程在创建时需要申请一个&lt;strong&gt;空白的 PCB&lt;/strong&gt;，向其填写&lt;strong&gt;控制和管理进程的信息&lt;/strong&gt;，完成资源分配，如果创建工作无法完成，比如：&lt;strong&gt;资源无法满足，就无法被调度运行，把此时进程所处的状态成为创建态&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行态&lt;/strong&gt;：进程占用 CPU 的资源，并在 CPU 上运行
&lt;ol&gt;
&lt;li&gt;单核时只有一个处于运行态&lt;/li&gt;
&lt;li&gt;双核时是可以有两个处于运行态&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;就绪态&lt;/strong&gt;：进程已具备运行条件，但 CPU 资源繁忙还没分配过来&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阻塞态&lt;/strong&gt;：又称&lt;strong&gt;等待态&lt;/strong&gt;，它处于&lt;strong&gt;等待某件事发生而暂时无法运行&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;当这件事件完成后又会回到就绪态等待 CPU 的服务&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;终止态：又称&lt;strong&gt;撤销态&lt;/strong&gt;，&lt;strong&gt;进程结束&lt;/strong&gt;，或&lt;strong&gt;出现错误&lt;/strong&gt;，或&lt;strong&gt;系统被终止&lt;/strong&gt;，进入终止状态，无法执行
&lt;ol&gt;
&lt;li&gt;撤销这个过程不是一瞬间完成的，操作系统需要把当时创建用到内存资源回收回来&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;状态之间的转换&lt;/strong&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://i0.hdslb.com/bfs/article/51f577185d9339f44eda4980fce97bd3397331738.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;执行（运行态）——》就绪&lt;/strong&gt;
（进入就绪态就已经获得除了处理机以外所需资源）
&lt;ol&gt;
&lt;li&gt;进程占用 CPU 过长，CPU 分配资源有限&lt;/li&gt;
&lt;li&gt;被&lt;strong&gt;抢占式优先级&lt;/strong&gt;抢占 CPU 资源&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;就绪——》运行&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;进程&lt;strong&gt;时间片用完&lt;/strong&gt;，调度到就绪队列，从队列 分配进程给 CPU&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行——》阻塞&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;执行的进程&lt;strong&gt;等待某个事件&lt;/strong&gt;而无法执行，比如资源还没轮到&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;阻塞——》就绪&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;进程等待的事件发生了&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;阻塞—到—运行态  不可逆&lt;/mark&gt;&lt;/li&gt;
&lt;li&gt;&lt;mark&gt;就绪—到—阻塞态  不可逆&lt;/mark&gt;
&lt;ul&gt;
&lt;li&gt;例如：一个进程的读磁盘结束后（处于堵塞）OS 就会对该进程修改状态为就绪，而不是直接执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过系统调用来申请系统资源，或申请等待某个资源的产生（比如资源没释放，等某个运行结果），这就是 I/O 请求&lt;/p&gt;
&lt;h3&gt;2.3 进程的通信&lt;a href=&quot;#23-进程的通信&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;2.3.1 概念&lt;a href=&quot;#231-概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;概念：就是指进程之间的&lt;strong&gt;信息交换&lt;/strong&gt;
pv 操作是最低级的通信，高级通信方式是指以较高的效率传输大量数据的通信方式&lt;/p&gt;
&lt;h4&gt;2.3.2 高级通信主要三类&lt;a href=&quot;#232-高级通信主要三类&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;共享存储：&lt;strong&gt;基于共享数据结构&lt;/strong&gt;的通信方式，例如：生产者与消费者。其次位&lt;strong&gt;基于共享存储区&lt;/strong&gt;的通信方式，是高级通信方式
&lt;ul&gt;
&lt;li&gt;例如：进程 A 和进程 B，他们不能直接访问对方的进程空间&lt;/li&gt;
&lt;li&gt;所以我们需要用到共享空间来让两个进程之间相互访问，但是这个方式是&lt;strong&gt;互斥的&lt;/strong&gt;，进程 A 访问 B 进程空间时，B 则不能访问 A&lt;/li&gt;
&lt;li&gt;例如：共享数据结构里面只能存放长度为 10 的数组，他们每一次的通信就只能传输一个长度 10 的数组，且数据格式有限制的话，会极大降低传输速度&lt;/li&gt;
&lt;li&gt;数据共享是一种略微低级的通信&lt;/li&gt;
&lt;li&gt;共享存储区这种传输则不会限制长度，格式，位置等，极大提高传输速度和传输自由，是一种高级通信&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;消息传递：以&lt;strong&gt;格式化的消息为单位&lt;/strong&gt;，&lt;strong&gt;利用原语传递消息&lt;/strong&gt;，分为&lt;strong&gt;直接通信&lt;/strong&gt;和&lt;strong&gt;间接通信&lt;/strong&gt;，原语分两种：
&lt;ul&gt;
&lt;li&gt;一种为发送原语&lt;/li&gt;
&lt;li&gt;一种为接受原语&lt;/li&gt;
&lt;li&gt;格式化消息例如：发送消息分为了消息头和消息体&lt;/li&gt;
&lt;li&gt;直接通信则是直接将消息挂在缓冲队列尾部，然后进程通过接受原语从头依次取走&lt;/li&gt;
&lt;li&gt;间接通信则相反，是先发送一个中间实体（又称信箱），当需要传送消息时，则直接在信箱里面取走，通过消息头来识别避免出现传输错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;管道通信：是传递信息的一种&lt;strong&gt;特殊方式&lt;/strong&gt;，指用于一个连接一个&lt;strong&gt;读进程&lt;/strong&gt;和一个&lt;strong&gt;写进程&lt;/strong&gt;以实现他们之间的共享文件，&lt;strong&gt;又称”pipe“文件&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;说白了就是：两进程之间建立了一个管道，但是单管道是单双工的，可以来回发，但是只能单向传输&lt;/li&gt;
&lt;li&gt;全双工则又建立了一个管道，一个读一个写，但是他们传递时也是互斥的。例：进程 A 写完成后，进程 B 才可以执行读&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.3 线程&lt;a href=&quot;#23-线程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;2.3.1 引入&lt;a href=&quot;#231-引入&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;为了简化进程之间的通信，以最小开销提高进程的并发程度&lt;/li&gt;
&lt;li&gt;是进程中执行的最小单位，是进程的一个实体，是被系统独立调度和分派的基本单位&lt;/li&gt;
&lt;li&gt;线程不拥有自己的系统资源，只拥有一点在运行中必不可少的资源，但它可与同属一个进程的其他线程共享进程所拥有的全部资源&lt;/li&gt;
&lt;li&gt;一个线程可以创建和撤销另外一个线程，同一个进程中的多个线程之间可以并发执行&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2.3.2 概念&lt;a href=&quot;#232-概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;概念：作为调度和分派的基本单位&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进程表示进程的一个控制点，可以执行一系列的指令&lt;/li&gt;
&lt;li&gt;进程分解为线程，还可以有效利用多处理器和多核计算机&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2.3.3 线程和进程的比较&lt;a href=&quot;#233-线程和进程的比较&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;h5&gt;2.3.3.1 进程与线程的区别&lt;a href=&quot;#2331-进程与线程的区别&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;调度：&lt;strong&gt;线程作为调度和分配的基本单位，进程作为拥有资源的基本单位&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;并发性：进程之间可以并发，同一个进程的多个线程之间也可以&lt;/li&gt;
&lt;li&gt;拥有资源：进程拥有资源的一个独立单位，线程&lt;strong&gt;不拥有系统资源&lt;/strong&gt;，但是&lt;strong&gt;可以访问隶属进程的资源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;系统开销：在创建或撤销进程时，由于系统都要给他分配和回收资源，&lt;strong&gt;导致系统的开销明显大于创建线程的开销&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;2.3.3.2 进程与线程联系&lt;a href=&quot;#2332-进程与线程联系&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;一个线程只属于一个进程，一个进程有多个线程，起码有一个&lt;/li&gt;
&lt;li&gt;资源分配给进程，同一个进程的线程可以&lt;strong&gt;共享该进程的全部资源&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;处理机分配给线程，即真正在&lt;strong&gt;处理机上运行的是线程&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;线程在执行过程中，需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是进程内一个执行单元，也是进程内&lt;strong&gt;可调度实体&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;3. 处理机调度&lt;a href=&quot;#3-处理机调度&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;3.1 处理及调度基本概念&lt;a href=&quot;#31-处理及调度基本概念&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基本准则：不同调度算法具有不同的特性，选择调度算法时需要考虑算法的特性，为了集中比较处理机调度算法的性能，提出很多评价标准。
&lt;ol&gt;
&lt;li&gt;CPU 利用率
&lt;ul&gt;
&lt;li&gt;cpu 时计算机最重要和最昂贵的资源之一，所以要物尽其用保持 cpu 处于”忙“的状态，提高资源利用率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;系统吞吐量
&lt;ul&gt;
&lt;li&gt;表示时间单位内 CPU 完成作业的数量&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;周转时间
&lt;ul&gt;
&lt;li&gt;周转时间就是指作业提交到作业完成所经历的时间，是作业等待，在就绪队列中排队，在处理机上运行以及进行输入/输出操作所需时间的总和&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;作业周转时间：&lt;strong&gt;周转时间= 作业完成时间-作业提交时间&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;平均周转时间：&lt;strong&gt;平均周转时间=n 个作业的的周转时间/n 个&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;平均带权周转：&lt;strong&gt;多个作业带权周转时间的平均值，等于 n 个带权周转时间相加/n 个&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;等待时间
&lt;ul&gt;
&lt;li&gt;指进程处于等待处理机状态的时间之和，等待时间越长，用户满意率越低&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;响应时间
&lt;ul&gt;
&lt;li&gt;指用户提交请求到系统首次产生响应所花费的时间，在交互系统中，周转世纪那不可能是最好的评价准则，一般采用响应时间作为衡量调度算法的主要准则之一&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;三个层次
&lt;ol&gt;
&lt;li&gt;作业调度（高级调度）
&lt;ul&gt;
&lt;li&gt;主要任务是按一定原则从外存中处于后备状态的作业挑选一个或多个作业，给他们分配内存、输入输出设备等必要资源，并建立相应进程，使它们获得竞争处理机的权利&lt;/li&gt;
&lt;li&gt;这是调入的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;中级调度
&lt;ul&gt;
&lt;li&gt;内存调度，作用是提高内存的利用率和系统吞吐量&lt;/li&gt;
&lt;li&gt;这是调回的过程，比高级调度频率高&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;进程调度（低级调度）
&lt;ul&gt;
&lt;li&gt;按照某种方法和策略从就绪队列选取一个进程，将处理机分配给它&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;进程调度方式
指某个进程正在处理机上执行，若有某个重要的进程或紧迫的进程需要处理，即有更高优先级的进程进入就绪，此时则需要考虑如何分配处理机
&lt;ol&gt;
&lt;li&gt;非抢占（非剥夺）调度
&lt;ul&gt;
&lt;li&gt;一个进程正在处理机上运行，就算有更加紧迫或又优先级很高的进程进入就绪，也不会立刻让出处理机，而是等待当前进程完成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;抢占式（剥夺）调度
&lt;ul&gt;
&lt;li&gt;一个进程正在处理机上运行，有高优先级或紧迫的进程进入就绪，立刻让出处理机，抢占当前资源，即使正在执行的进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3.2 先来先服务算法&lt;a href=&quot;#32-先来先服务算法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;First come first server 即为：FCFS&lt;/li&gt;
&lt;li&gt;按照作业/进程到达的先后顺序进行调度。
&lt;ul&gt;
&lt;li&gt;缺点：对长作业有利，短作业反之&lt;/li&gt;
&lt;li&gt;优点：实现简单&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;适用于作业调度和进程调度&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3.3 短作业优先&lt;a href=&quot;#33-短作业优先&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Short job first 即为：SJF&lt;/li&gt;
&lt;li&gt;按照作业的长短来计算优先级，作业越短优先级越高&lt;/li&gt;
&lt;li&gt;适用于作业调度和进程调度
&lt;ul&gt;
&lt;li&gt;优点：最短平均等待时间以及平均周转时间&lt;/li&gt;
&lt;li&gt;缺点：必须要先知道作业运行时间，对长作业不利，会出现饥饿现象，没有考虑作业的紧迫程度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3.4 优先级调度&lt;a href=&quot;#34-优先级调度&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h1&gt;4. 死锁&lt;a href=&quot;#4-死锁&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;5. 进程同步&lt;a href=&quot;#5-进程同步&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;6. 内存管理&lt;a href=&quot;#6-内存管理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;7. 文件管理&lt;a href=&quot;#7-文件管理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;8. 磁盘组织与管理&lt;a href=&quot;#8-磁盘组织与管理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;9. IO 设备管理&lt;a href=&quot;#9-io-设备管理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;</content:encoded><category>category:study</category><category>category:OS</category><category>tag:计算机操作系统</category><category>tag:Operating_system</category><category>tag:study</category></item><item><title>计算操作系统复习资料</title><link>https://blog.vull.top/ja/post/study/%E8%AE%A1%E7%AE%97%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E5%A4%8D%E4%B9%A0%E8%B5%84%E6%96%99</link><guid isPermaLink="false">ja:study/计算操作系统/复习资料</guid><description>计算机操作系统学习笔记</description><pubDate>Mon, 10 Aug 2026 10:26:45 GMT</pubDate><content:encoded>&lt;h3&gt;一、进程调度算法&lt;a href=&quot;#一进程调度算法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先来先服务（FCFS）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;周转时间&lt;/strong&gt;：完成时间 - 到达时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均周转时间&lt;/strong&gt;：所有进程周转时间之和 / 进程个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带权周转时间&lt;/strong&gt;：周转时间 / 服务时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均带权周转时间&lt;/strong&gt;：所有进程带权周转时间之和 / 进程个数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短作业优先（SJF）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;选择规则&lt;/strong&gt;：选择当前已到达且服务时间最短的作业（进程）执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;周转时间&lt;/strong&gt;：完成时间 - 到达时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均周转时间&lt;/strong&gt;：所有进程周转时间之和 / 进程个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带权周转时间&lt;/strong&gt;：周转时间 / 服务时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均带权周转时间&lt;/strong&gt;：所有进程带权周转时间之和 / 进程个数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高响应比优先（HRRN）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;等待时间：系统当前开始时间 - 进程到达时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应比&lt;/strong&gt;：（等待时间 + 要求服务时间）/ 要求服务时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择规则&lt;/strong&gt;：每次选择响应比最高的作业（进程）执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;周转时间&lt;/strong&gt;：完成时间 - 到达时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均周转时间&lt;/strong&gt;：所有进程周转时间之和 / 进程个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带权周转时间&lt;/strong&gt;：周转时间 / 服务时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均带权周转时间&lt;/strong&gt;：所有进程带权周转时间之和 / 进程个数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间片轮转（RR）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;周转时间&lt;/strong&gt;：完成时间 - 到达时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均周转时间&lt;/strong&gt;：所有进程周转时间之和 / 进程个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;带权周转时间&lt;/strong&gt;：周转时间 / 服务时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均带权周转时间&lt;/strong&gt;：所有进程带权周转时间之和 / 进程个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;执行规则&lt;/strong&gt;：每个进程被分配一个时间片，轮流执行，时间片用完后，无论是否完成，都切换到下一个进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;二、页面置换算法&lt;a href=&quot;#二页面置换算法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最佳置换（OPT）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;预知未来页面的使用情况，从而选择在未来最长时间内不会被使用的页面进行置换。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页次数&lt;/strong&gt;：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页率&lt;/strong&gt;：缺页次数 / 页面访问序列长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置换规则&lt;/strong&gt;：选择未来最长时间内不会被访问的页面进行置换（实际难以实现，用于理论比较）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先进先出（FIFO）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;是指先进入内存的页面先被替换出去。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页次数&lt;/strong&gt;：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页率&lt;/strong&gt;：缺页次数 / 页面访问序列长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置换规则&lt;/strong&gt;：选择最先进入内存的页面进行置换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最近最久未使用（LRU）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;淘汰最近最少使用的页面。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页次数&lt;/strong&gt;：统计在内存中不存在所需页面而需要从外存调入的次数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺页率&lt;/strong&gt;：缺页次数 / 页面访问序列长度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置换规则&lt;/strong&gt;：选择最近最久未被使用的页面进行置换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三、磁盘调度算法&lt;a href=&quot;#三磁盘调度算法&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先来先服务（FCFS）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寻道时间&lt;/strong&gt;：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总寻道时间&lt;/strong&gt;：所有寻道时间之和&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均寻道长度&lt;/strong&gt;：总寻道长度 / 磁盘请求个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理规则&lt;/strong&gt;：按照磁盘请求的到达顺序依次处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最短寻道时间优先（SSTF）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寻道时间&lt;/strong&gt;：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总寻道时间&lt;/strong&gt;：所有寻道时间之和&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均寻道长度&lt;/strong&gt;：总寻道长度 / 磁盘请求个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理规则&lt;/strong&gt;：选择与当前磁头位置距离最近的磁道请求进行处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扫描（SCAN）算法（电梯算法）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寻道时间&lt;/strong&gt;：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总寻道时间&lt;/strong&gt;：所有寻道时间之和&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均寻道长度&lt;/strong&gt;：总寻道长度 / 磁盘请求个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理规则&lt;/strong&gt;：磁头沿着一个方向移动，处理沿途的磁盘请求，直到到达一端，然后改变方向继续处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环扫描（CSCAN）算法&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;寻道时间&lt;/strong&gt;：磁头移动到指定磁道所需的时间，根据磁头移动的磁道数计算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总寻道时间&lt;/strong&gt;：所有寻道时间之和&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均寻道长度&lt;/strong&gt;：总寻道长度 / 磁盘请求个数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理规则&lt;/strong&gt;：磁头沿着一个方向移动，处理沿途的磁盘请求，到达一端后，立即回到起始端，然后再沿相同方向处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;四、Cache 相关&lt;a href=&quot;#四cache-相关&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cache 命中率计算&lt;/strong&gt;：Cache 命中次数 / 访问总次数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平均访问时间&lt;/strong&gt;：命中率 ×Cache 访问时间 +(1 - 命中率)× 主存访问时间&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;五、虚拟存储器相关（以页式为例）&lt;a href=&quot;#五虚拟存储器相关以页式为例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;用户作业最多页数&lt;/strong&gt;：虚拟地址空间大小 / 页面大小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主存空间划分的块数&lt;/strong&gt;：主存容量 / 页面大小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页号&lt;/strong&gt;：INT (逻辑地址 / 页面大小)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页内地址&lt;/strong&gt;：逻辑地址 MOD 页面大小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理地址&lt;/strong&gt;：块号 × 页面大小 + 页内地址&lt;/li&gt;
&lt;li&gt;页内偏移：逻辑地址 MOD 页面大小&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>category:study</category><category>category:OS</category><category>tag:计算机操作系统</category><category>tag:Operating_system</category><category>tag:study</category></item><item><title>从 Astro 5 到 Astro 6：astro-koharu 的一次完整迁移实录</title><link>https://blog.vull.top/ja/post/astro-6-migration</link><guid isPermaLink="false">ja:astro-6-migration</guid><description>记录 astro-koharu 从 Astro 5.16.6 升级到 6.4.8 的完整过程，并解决历史文章、旧备份与下游仓库的一键迁移问题。</description><pubDate>Sun, 19 Jul 2026 19:50:03 GMT</pubDate><content:encoded>&lt;p&gt;这次升级看起来只是把 &lt;code&gt;astro&lt;/code&gt; 从 5.16.6 改成 6.x，实际却穿过了内容身份、Markdown 编译、Vite
预渲染、RSS 和第三方 integration 五条链路。更麻烦的是，astro-koharu 不是只有一个模板仓库：每位用户都有自己的
文章、永久链接、历史备份和生成资产。模板能构建，不等于用户升级后不会丢 URL，也不等于恢复一份旧备份后仍能构建。&lt;/p&gt;
&lt;p&gt;因此，真正困难的不是让 &lt;code&gt;pnpm build&lt;/code&gt; 变绿，而是同时证明两件事：升级前后的 URL、多语言 fallback、搜索索引和文章
HTML 没有悄悄改变；一份长期使用的下游仓库也能通过同一套工具安全迁移，而不需要用户逐篇修改 frontmatter。&lt;/p&gt;
&lt;p&gt;本文记录的是 astro-koharu 的真实迁移结果。最终版本为 Astro 6.4.8，没有启用 Content Collections legacy
兼容开关，也没有把实验特性留在生产配置中。迁移最终还补上了一条可 dry-run、自动备份且幂等的内容迁移命令，并用
376 篇真实历史文章的完整备份恢复验证了这条路径。&lt;/p&gt;
&lt;h2&gt;先定义成功，而不是先改版本号&lt;a href=&quot;#先定义成功而不是先改版本号&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astro.build/en/guides/upgrade-to/v6/&quot;&gt;Astro 6 升级指南&lt;/a&gt;要求 Node.js 22.12+，并伴随 Zod 4、
Shiki 4 及 Vite 7 构建管线的变化。迁移时 npm 的 &lt;code&gt;astro@latest&lt;/code&gt; 已经进入 7.x，因此不能无版本约束地运行升级命令。
本次把 Astro 精确锁定在 &lt;code&gt;6.4.8&lt;/code&gt;，同时把 Node 边界和 pnpm 版本落到 &lt;code&gt;package.json&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;packageManager&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;pnpm@10.28.2&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;engines&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;node&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&amp;gt;=22.12.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;dependencies&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;astro&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;6.4.8&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;精确版本不只是为了重现本次构建。Koharu 的新版更新流程也会读取 &lt;code&gt;packageManager&lt;/code&gt;，并用声明的
pnpm 精确版本安装依赖，避免更新到新 lockfile 后又意外回落到调用者机器上的旧 pnpm。&lt;/p&gt;
&lt;p&gt;迁移前先保存了一组可比较的基线：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;Astro 5.16.6 基线&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;347 个文件，0 error / warning / hint&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 静态页面&lt;/td&gt;&lt;td&gt;130&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; 路由产物&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 报告的构建耗时&lt;/td&gt;&lt;td&gt;约 21.62 秒&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;成功标准不只是页面数相等，还包括四类不变式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认语言 URL 不带前缀，英文和日文继续使用 &lt;code&gt;/en/&lt;/code&gt;、&lt;code&gt;/ja/&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;frontmatter 的 &lt;code&gt;link&lt;/code&gt; 仍然可以覆盖公开 slug，未翻译页面的 canonical 仍指向默认语言；&lt;/li&gt;
&lt;li&gt;GFM、Shiki、KaTeX、Mermaid、Pagefind、RSS、sitemap 和 robots 继续生成。&lt;/li&gt;
&lt;li&gt;历史文章迁移前后保留相同公开 URL，旧备份恢复后不会混入新版模板自带的示例内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fonts API、CSP、Live Content Collections、Rust compiler 和 queued rendering 都不在兼容迁移范围内。把新功能与
major upgrade 混在一起，会让故障定位和回滚都变得困难。&lt;/p&gt;
&lt;h2&gt;依赖升级不是全部追最新&lt;a href=&quot;#依赖升级不是全部追最新&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;核心依赖最终落在以下版本：&lt;/p&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;code&gt;astro&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.16.6&lt;/td&gt;&lt;td&gt;6.4.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/react&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4.4.2&lt;/td&gt;&lt;td&gt;5.0.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/sitemap&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.7.0&lt;/td&gt;&lt;td&gt;3.7.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4.0.14&lt;/td&gt;&lt;td&gt;4.0.19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shiki&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.22.0&lt;/td&gt;&lt;td&gt;4.3.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-mermaid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.2.0&lt;/td&gt;&lt;td&gt;2.1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-pagefind&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.8.5&lt;/td&gt;&lt;td&gt;1.8.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro-loading-indicator&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0.7.1&lt;/td&gt;&lt;td&gt;0.9.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这里最反直觉的是 &lt;code&gt;astro-pagefind&lt;/code&gt;。2.x 的确支持 Astro 6，但它同时把原来的搜索组件改成了 Web Component API。
直接升级会迫使现有搜索样式、键盘导航和本地化一起重写。1.8.6 已补上 Astro 6 peer 支持，又保留旧 UI，所以它才是
这次兼容迁移的合理目标。&lt;/p&gt;
&lt;p&gt;迁移的原则由此变得很明确：优先选择支持新框架且不扩大产品行为变化的最小版本，而不是把所有包机械地升到最新 major。&lt;/p&gt;
&lt;h2&gt;最核心的变化：Content Layer 身份模型&lt;a href=&quot;#最核心的变化content-layer-身份模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Astro 5 的旧内容配置位于 &lt;code&gt;src/content/config.ts&lt;/code&gt;，业务代码还在读取 &lt;code&gt;post.slug&lt;/code&gt; 并调用 &lt;code&gt;post.render()&lt;/code&gt;。
&lt;a href=&quot;https://docs.astro.build/en/guides/content-collections/&quot;&gt;Astro Content Collections 文档&lt;/a&gt;给出的新模型则要求显式 loader，
内容配置移到 &lt;code&gt;src/content.config.ts&lt;/code&gt;，Zod 从 &lt;code&gt;astro/zod&lt;/code&gt; 导入：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { defineCollection } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;astro:content&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { glob } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;astro/loaders&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { z } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;astro/zod&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; blogCollection&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; defineCollection&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  loader: &lt;/span&gt;&lt;span&gt;glob&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    pattern: &lt;/span&gt;&lt;span&gt;&apos;**/[^_]*.{md,mdx}&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base: &lt;/span&gt;&lt;span&gt;&apos;./src/content/blog&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  schema: z.&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    title: z.&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Other frontmatter fields...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;真正需要保护的是“内部 ID”和“公开 slug”之间的边界：&lt;/p&gt;
&lt;pre&gt;flowchart LR
  F[Markdown 相对路径] --&amp;gt; I[Content entry ID]
  I --&amp;gt; L[语言识别]
  I --&amp;gt; S[派生公开 slug]
  O[frontmatter link] --&amp;gt; S
  S --&amp;gt; U[公开文章 URL]&lt;/pre&gt;
&lt;p&gt;例如 &lt;code&gt;en/tools/getting-started.md&lt;/code&gt; 的内容 ID 是 &lt;code&gt;en/tools/getting-started&lt;/code&gt;，但公开 URL 还要先移除 locale，
再考虑 &lt;code&gt;link&lt;/code&gt; override 和字符转写。项目里其他 DTO 也有名为 &lt;code&gt;slug&lt;/code&gt; 的字段，却表达公开路径；如果全仓替换
&lt;code&gt;slug&lt;/code&gt; 为 &lt;code&gt;id&lt;/code&gt;，搜索、相似文章和系列导航都会被破坏。&lt;/p&gt;
&lt;p&gt;所以迁移只替换 &lt;code&gt;CollectionEntry&amp;lt;&apos;blog&apos;&amp;gt;&lt;/code&gt; 的身份读取：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; getPostLocale&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; BlogPost&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; getSlugLocaleInfo&lt;/span&gt;&lt;span&gt;(post.id).locale;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; getPostSlug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; BlogPost&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; string&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; post.data.link &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; transliterateSlug&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;getSlugLocaleInfo&lt;/span&gt;&lt;span&gt;(post.id).localeFreeSlug);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;路由也不再把整个 entry 当成旧式可渲染对象，而是传递内部 ID，再使用新的顶层 &lt;code&gt;render()&lt;/code&gt;：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { render } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;astro:content&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; posts.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  params: { slug: &lt;/span&gt;&lt;span&gt;getPostSlug&lt;/span&gt;&lt;span&gt;(post) },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  props: { postId: post.id },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; getPostById&lt;/span&gt;&lt;span&gt;(postId, locale);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;post) &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`Post not found: ${&lt;/span&gt;&lt;span&gt;postId&lt;/span&gt;&lt;span&gt;}`&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;Content&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; render&lt;/span&gt;&lt;span&gt;(post);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Astro 6 的 &lt;code&gt;body&lt;/code&gt; 类型允许为 &lt;code&gt;undefined&lt;/code&gt;，因此摘要和纯文本提取还需要显式兜底：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;extractTextFromMarkdown&lt;/span&gt;&lt;span&gt;(post.body &lt;/span&gt;&lt;span&gt;??&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;, maxLength);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这不是为了掩盖缺失内容，而是因为集合还可能包含没有 Markdown body 的 entry；调用纯文本工具时应把该状态转换成空输入。&lt;/p&gt;
&lt;h3&gt;为什么旧文章里的 &lt;code&gt;slug&lt;/code&gt; 不能原样留下&lt;a href=&quot;#为什么旧文章里的-slug-不能原样留下&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;glob()&lt;/code&gt; loader 会用文件路径建立稳定的 entry ID，而旧内容里的顶层 &lt;code&gt;slug&lt;/code&gt; 又承载过自定义永久链接语义。继续让同一个字段
横跨两套身份模型，最危险的结果不是立刻报错，而是文章仍能生成、公开 URL 却变了。&lt;/p&gt;
&lt;p&gt;因此，新 schema 只把 &lt;code&gt;link&lt;/code&gt; 视为显式的公开 URL override。旧 &lt;code&gt;slug&lt;/code&gt; 不能简单删除，因为它可能是用户长期对外分享的地址；
也不能继续当成普通 frontmatter 原样保留。正确迁移必须先确定它过去代表的公开 URL，再把这层语义转移到 &lt;code&gt;link&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;历史文章不能靠用户手工迁移&lt;a href=&quot;#历史文章不能靠用户手工迁移&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模板仓库里的示例文章很整齐，真实用户仓库却可能跨过多个版本：有些文章只有 &lt;code&gt;link&lt;/code&gt;，有些还保留 &lt;code&gt;slug&lt;/code&gt;，有些从未显式写过
永久链接，多语言对应文章也未必在同一时间创建。让用户做一次全局替换，既无法处理这些分支，也无法发现两篇文章即将撞到
同一个 URL。&lt;/p&gt;
&lt;p&gt;为此，Koharu CLI 增加了专门的迁移入口：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 只扫描并展示计划，不写文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 确认计划后，自动备份并执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对从旧版 astro-koharu 升级的用户，实际入口仍然是更新前已经存在的旧 CLI。完整顺序是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 先由旧 CLI 完成备份、拉取、合并和依赖安装&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 等上面的进程完全退出，再使用更新后的 CLI&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; migrate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个边界很重要：正在运行的 &lt;code&gt;update&lt;/code&gt; 进程加载的仍是升级前的代码，不能假设它已经拥有更新后才出现的
&lt;code&gt;migrate&lt;/code&gt; 子命令。等旧进程退出后重新调用 CLI，才能确保执行的是新版迁移逻辑。&lt;/p&gt;
&lt;p&gt;迁移策略不是“所有文章都加一个新字段”，而是按已有数据选择最小改动：&lt;/p&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;URL 结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;只有 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;不修改&lt;/td&gt;&lt;td&gt;完全保持现状&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;同时有 &lt;code&gt;link&lt;/code&gt; 和 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;保留 &lt;code&gt;link&lt;/code&gt;，移除冗余 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;继续以原 &lt;code&gt;link&lt;/code&gt; 为准&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;只有 &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;原位把字段名改为 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;精确保留旧 permalink&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;两者都没有&lt;/td&gt;&lt;td&gt;默认语言使用路径；非默认语言优先跟随默认语言链接，缺少默认语言对应文章时才复用其他译文的唯一 &lt;code&gt;link&lt;/code&gt;，否则使用路径&lt;/td&gt;&lt;td&gt;默认语言 URL 保持不变，译文尽量保持配对&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;同语言链接重复，或缺少默认语言对应文章且其他译文给出多个候选 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;报错并阻止整批写入&lt;/td&gt;&lt;td&gt;不猜测、不产生半套 URL&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这里有几个容易忽略的安全细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扫描覆盖所有 &lt;code&gt;.md&lt;/code&gt; 与 &lt;code&gt;.mdx&lt;/code&gt;，不是只处理模板当前使用的目录层级；&lt;/li&gt;
&lt;li&gt;修改是针对顶层字段的局部编辑，不重新序列化整份 YAML，避免无意义地重排用户 frontmatter；&lt;/li&gt;
&lt;li&gt;任何解析错误、空链接或同语言 URL 冲突都会在写入前让整批迁移停止；&lt;/li&gt;
&lt;li&gt;博客内容只接受普通文件，遇到符号链接会直接阻止，避免跟随到内容目录外部；&lt;/li&gt;
&lt;li&gt;正式写入前会再次确认全部源文件、站点配置和文件集合与扫描时完全相同，避免用户并行编辑导致计划过期；&lt;/li&gt;
&lt;li&gt;单文件通过同目录临时文件和原子 rename 写入，保留原权限；后续写入失败时，已安装的变更会按逆序回滚；&lt;/li&gt;
&lt;li&gt;执行前自动创建基础备份；再次运行 dry-run 应得到 0 项变更，幂等性本身也是验收条件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了防止用户跳过这一步，&lt;code&gt;pnpm dev&lt;/code&gt; 和 &lt;code&gt;pnpm build&lt;/code&gt; 现在都会先运行 &lt;code&gt;pnpm koharu migrate --check&lt;/code&gt;。
这个模式只读扫描，不会自动改文章；发现待迁移项或无法安全处理的 frontmatter 时会以非零状态退出，
在 Astro 启动或构建前给出 dry-run 和正式迁移指引。&lt;/p&gt;
&lt;p&gt;多语言配对尤其不能只看文件名。假设默认语言文章已经把 &lt;code&gt;note/old-name&lt;/code&gt; 定制为 &lt;code&gt;my-stable-url&lt;/code&gt;，而英文对应文章没有
&lt;code&gt;link&lt;/code&gt;。如果英文文章机械地使用自身路径，它会与默认语言失去同一公开 slug。因此，非默认语言文章会优先跟随默认语言文章的
稳定链接；只有缺少默认语言对应文章时，才会复用其他译文的唯一候选，候选互相矛盾时宁可让用户决定。反过来，默认语言文章
没有显式链接时，路径本身就是已有的公开 URL，不能被译文的自定义链接覆盖，其他缺少链接的译文也应继续跟随这条路径。&lt;/p&gt;
&lt;p&gt;旧的 &lt;code&gt;pnpm save-slugs&lt;/code&gt; 仍保留为兼容入口，但新用户只需要记住 &lt;code&gt;pnpm koharu migrate&lt;/code&gt;。这样迁移规则、备份流程和 CLI
反馈位于同一个入口，后续再增加数据版本也不必继续堆一次性脚本。&lt;/p&gt;
&lt;h2&gt;恢复旧备份不能只是 &lt;code&gt;cp -r&lt;/code&gt;&lt;a href=&quot;#恢复旧备份不能只是-cp--r&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;内容字段迁完之后，还有一个更隐蔽的问题：旧恢复逻辑是把备份目录复制进新版本目录。如果新模板增加了一篇示例文章，而用户的
旧备份里没有它，普通目录合并会把这篇文章留下。对文件系统来说这是“合并成功”，对用户来说却是恢复后凭空多出了一篇文章。&lt;/p&gt;
&lt;p&gt;这说明备份恢复需要区分“用户快照”和“可向前合并的配置”，不能对所有目录使用同一种复制语义：&lt;/p&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;code&gt;src/content/blog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;先清理目标，再恢复快照&lt;/td&gt;&lt;td&gt;文章集合必须与备份时完全一致&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;public/img&lt;/code&gt;&lt;/td&gt;&lt;td&gt;先清理目标，再恢复快照&lt;/td&gt;&lt;td&gt;避免已删除的用户图片残留&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;src/pages/*.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只替换根目录下的独立 Markdown 页面&lt;/td&gt;&lt;td&gt;删除旧自定义页面，同时保留新版 &lt;code&gt;.astro&lt;/code&gt; 路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;config/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;合并恢复&lt;/td&gt;&lt;td&gt;还原用户配置，但保留新版新增的主题配置文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;summaries、similarities、LQIP&lt;/td&gt;&lt;td&gt;完整备份恢复；基础备份不包含&lt;/td&gt;&lt;td&gt;这些资产必须与文章快照配套&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;新备份 manifest 增加 &lt;code&gt;schemaVersion: 2&lt;/code&gt;，但缺少该字段的历史归档仍按 v1 读取。对“独立 Markdown 页面为空”的情况，
备份也会保留空目录标记，让恢复器能区分“用户当时确实没有独立页面”和“这类数据根本不在旧归档中”。前者应该清掉现有
Markdown 页面，后者则不应贸然删除任何东西。&lt;/p&gt;
&lt;p&gt;恢复前不只检查扩展名和 &lt;code&gt;manifest.json&lt;/code&gt;。CLI 会校验备份路径、manifest schema、声明的恢复项与归档实际内容，
拒绝符号链接、未声明条目和文件/目录类型不匹配。校验和解压使用同一份只读私有快照，避免原归档在两步之间被替换。
解压后也不会立即覆盖用户目录：恢复器会先在项目内准备候选快照、运行内容迁移，全部通过后再事务性切换；中途提交失败则回滚已切换的目标。&lt;/p&gt;
&lt;p&gt;只要恢复项包含博客内容，恢复器就会紧接着执行同一套内容迁移。升级流程若发现无法自动处理的冲突，会中止 clean update 并
进入原有回滚路径，而不是带着半迁移内容继续构建。基础备份恢复后，CLI 还会明确提示运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; koharu&lt;/span&gt;&lt;span&gt; generate&lt;/span&gt;&lt;span&gt; all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是因为基础备份只保护源数据与配置，不包含 AI 摘要、相似文章和 LQIP 等派生资产；完整备份才会携带与该内容快照配套的
生成结果。&lt;/p&gt;
&lt;h2&gt;四个只在真实构建里暴露的问题&lt;a href=&quot;#四个只在真实构建里暴露的问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;1. Markdown 插件配置开始弃用&lt;a href=&quot;#1-markdown-插件配置开始弃用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;原配置把 &lt;code&gt;gfm&lt;/code&gt;、&lt;code&gt;remarkPlugins&lt;/code&gt; 和 &lt;code&gt;rehypePlugins&lt;/code&gt; 直接挂在 &lt;code&gt;markdown&lt;/code&gt; 下。Astro 6.4 会对此发出弃用提示。
项目的 Markdown 管线包含 Shoka 语法、链接嵌入、Mermaid、KaTeX 和代码块 transformer，不能简单删除，于是改为显式
创建 unified processor：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; { unified } &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &apos;@astrojs/markdown-remark&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;markdown&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  processor&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;unified&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    gfm: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    remarkPlugins,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    rehypePlugins,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  syntaxHighlight&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;shiki&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    excludeLangs&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&apos;mermaid&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样既消除了弃用路径，又保留 Astro 对 Shiki 4 的处理。&lt;/p&gt;
&lt;h3&gt;2. &lt;code&gt;react-tweet&lt;/code&gt; 在预渲染环境里无法加载 CSS&lt;a href=&quot;#2-react-tweet-在预渲染环境里无法加载-css&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;升级后的首次生产构建报错：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Unknown file extension &quot;.css&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Hint: add the package to vite.resolve.noExternal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;旧配置中的 &lt;code&gt;vite.ssr.noExternal&lt;/code&gt; 没有覆盖 Astro 6 的预渲染 environment。按照错误提示改成顶层
&lt;code&gt;vite.resolve.noExternal&lt;/code&gt; 后，&lt;code&gt;react-tweet&lt;/code&gt; 的 CSS 才重新进入 Vite 转换链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;vite&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  resolve&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    noExternal&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&apos;react-tweet&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. RSS 的旧 patch 版本不兼容 Zod 4&lt;a href=&quot;#3-rss-的旧-patch-版本不兼容-zod-4&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;@astrojs/rss&lt;/code&gt; 4.0.14 在 Astro 6 下抛出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;z.function(...).returns is not a function&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;问题不是 RSS 数据，而是该版本仍调用 Zod 4 已移除的 API。升级到 4.0.19 后，默认、英文和日文三份 feed 都恢复生成。&lt;/p&gt;
&lt;h3&gt;4. i18n 配置描述了一个实际不存在的重定向&lt;a href=&quot;#4-i18n-配置描述了一个实际不存在的重定向&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;项目原来同时配置 &lt;code&gt;prefixDefaultLocale: false&lt;/code&gt; 和 &lt;code&gt;redirectToDefaultLocale: true&lt;/code&gt;。Astro 6 不再接受这个组合；更重要的是，
Astro 5 基线里 &lt;code&gt;/zh/&lt;/code&gt; 和 &lt;code&gt;/zh/post/*&lt;/code&gt; 本来就是 404，并没有真实重定向行为可以保留。&lt;/p&gt;
&lt;p&gt;最终删除无效选项，同时更新代码注释。规范 feed URL 仍是 &lt;code&gt;/rss.xml&lt;/code&gt;、&lt;code&gt;/en/rss.xml&lt;/code&gt; 和 &lt;code&gt;/ja/rss.xml&lt;/code&gt;；即使 preview
目前还能访问 &lt;code&gt;/rss.xml/&lt;/code&gt;，也不再把尾斜杠版本当作兼容契约。&lt;/p&gt;
&lt;h2&gt;怎样证明公开行为没有漂移&lt;a href=&quot;#怎样证明公开行为没有漂移&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;先验证模板公开行为&lt;a href=&quot;#先验证模板公开行为&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最终普通构建的结果如下。路由产物集合比较发生在加入本文之前，避免新文章本身干扰迁移前后对比。&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;Astro 5&lt;/th&gt;&lt;th&gt;Astro 6&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;130&lt;/td&gt;&lt;td&gt;130&lt;/td&gt;&lt;td&gt;一致&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;一致&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; 路由产物&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;无新增、无丢失&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 构建耗时&lt;/td&gt;&lt;td&gt;21.62s&lt;/td&gt;&lt;td&gt;21.76s&lt;/td&gt;&lt;td&gt;接近基线&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;除了 &lt;code&gt;pnpm lint&lt;/code&gt;、&lt;code&gt;pnpm check&lt;/code&gt;、&lt;code&gt;pnpm build&lt;/code&gt; 和 &lt;code&gt;git diff --check&lt;/code&gt;，还做了这些输出级验证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt;、&lt;code&gt;/en/&lt;/code&gt;、&lt;code&gt;/ja/&lt;/code&gt;，以及默认语言和本地化文章均返回 200；&lt;code&gt;/zh/&lt;/code&gt; 保持 404；&lt;/li&gt;
&lt;li&gt;未翻译文章的英文 fallback 页面仍显示默认语言正文，canonical 指回默认语言 URL；&lt;/li&gt;
&lt;li&gt;代表性文章产物同时包含 Pagefind body、Shiki、KaTeX 和 Mermaid 标记；&lt;/li&gt;
&lt;li&gt;Pagefind 对 &lt;code&gt;Astro&lt;/code&gt; 的实际查询返回 8 条结果，首条仍是 &lt;code&gt;/post/getting-started/&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;三份 RSS 都返回 &lt;code&gt;text/xml&lt;/code&gt;，sitemap 和 robots 正常生成；&lt;/li&gt;
&lt;li&gt;pnpm 10.28.2 使用 frozen lockfile 的干净依赖层安装成功，Astro 补丁确认生效，宿主机生产构建成功；验证环境的
Docker daemon 不可用，因此没有把完整镜像构建写成已验证项。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;浏览器自动化环境当时没有可用的浏览器实例，因此没有把 ClientRouter 点击、搜索键盘操作写成“已自动化通过”。这里宁可明确
验证边界，也不要把 HTML 和 HTTP 检查冒充完整的浏览器交互测试。&lt;/p&gt;
&lt;p&gt;构建仍会出现 &lt;code&gt;infographic&lt;/code&gt; 语言回退、一个外部知乎链接 403 和大 chunk 提示；它们在 Astro 5 基线中已经存在，
不属于本次升级回归。&lt;/p&gt;
&lt;p&gt;当前分支加入本文及迁移配套内容后，最终 Astro 6 构建生成 151 个静态页面，Pagefind 索引 155 个页面；这个数字用于确认
最终交付状态能完整构建，不应拿来与加入新内容前的 130 / 134 基线直接比较。相似度资产覆盖全部 12 个默认语言条目，每项
保留 5 个引用，且没有指向不存在文章的悬空引用。&lt;/p&gt;
&lt;h3&gt;再验证迁移脚本，而不只验证 happy path&lt;a href=&quot;#再验证迁移脚本而不只验证-happy-path&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;模板当前有 21 篇 Markdown / MDX 内容。首次正式迁移处理了其中 2 篇没有 &lt;code&gt;link&lt;/code&gt; 的旧示例文章；随后再次执行
&lt;code&gt;pnpm koharu migrate --dry-run&lt;/code&gt;，结果是扫描 21 篇、待迁移 0 篇、错误 0 个。&lt;/p&gt;
&lt;p&gt;自动化测试则刻意覆盖更危险的分支：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&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;code&gt;link&lt;/code&gt; / &lt;code&gt;slug&lt;/code&gt; / 空字段及多语言对应文章&lt;/td&gt;&lt;td&gt;URL 保留，译文复用稳定链接，第二次运行无变更&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重复链接、危险 frontmatter、符号链接和并发改动&lt;/td&gt;&lt;td&gt;整批不写入，已开始的原子写入可回滚&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;缺失或不一致的 manifest、恶意归档条目和恢复提交失败&lt;/td&gt;&lt;td&gt;预览前拒绝非法归档，事务提交失败时恢复旧目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;把旧归档恢复到已有新模板内容的目录&lt;/td&gt;&lt;td&gt;旧快照精确替换、恢复后自动迁移，同时保留新版 Astro 路由与配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;跨版本更新、新版 &lt;code&gt;--check&lt;/code&gt; 与 pnpm 版本锁定&lt;/td&gt;&lt;td&gt;命令行参数不串命令，依赖安装只使用明确的 pnpm 版本&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这些分支由 Node 内置 test runner 执行，统一放在 &lt;code&gt;pnpm test:migrate&lt;/code&gt; 中；当前共 42 个测试。
它们验证的是数据不变式、归档边界和进程退出契约，而不是 CLI 文案，因此即使以后替换终端 UI，迁移的核心行为仍然有保护。&lt;/p&gt;
&lt;h3&gt;最后用真实下游仓库做完整恢复&lt;a href=&quot;#最后用真实下游仓库做完整恢复&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;只拿几篇 fixture 证明脚本可用仍然不够。实际验证选了一份从 astro-koharu v4.2.1 长期演进而来的个人仓库，在不修改源仓库的
前提下读取它的完整备份，并恢复到一个临时 Astro 6 副本：&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&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;历史 Markdown / MDX&lt;/td&gt;&lt;td&gt;376 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;已有稳定 &lt;code&gt;link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;375 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;需要自动补齐&lt;/td&gt;&lt;td&gt;1 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;同语言 URL 冲突&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;恢复后的内容数量&lt;/td&gt;&lt;td&gt;376 篇&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;astro check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0 error / warning / hint&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Astro 6 静态页面&lt;/td&gt;&lt;td&gt;797&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pagefind 索引页面&lt;/td&gt;&lt;td&gt;801&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这个测试同时验证了两个容易漏掉的点。第一，临时副本中由新版模板自带、但不在旧快照里的示例文章没有残留，证明博客目录执行的
确实是快照替换，而不是目录合并。第二，恢复后只有 1 篇文章被自动补齐 &lt;code&gt;link&lt;/code&gt;，另外 375 篇的 metadata 和正文不需要重写。
迁移前后的源仓库 Git 状态保持干净，验证产物和临时归档也在结束后删除。&lt;/p&gt;
&lt;p&gt;历史内容构建仍出现少量 KaTeX Unicode、未知 Shiki 语言别名和外部链接抓取失败提示。这些 warning 来自旧文章本身，既没有
造成 Astro 6 类型诊断，也没有阻止 797 个页面完成生产构建，因此应该记录和后续治理，但不能误判成数据迁移失败。&lt;/p&gt;
&lt;h2&gt;哪些 Astro 6 能力值得顺手开启&lt;a href=&quot;#哪些-astro-6-能力值得顺手开启&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;答案比预想中保守：只接受 Astro 6 默认带来的新 dev/build pipeline。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fonts API&lt;/strong&gt;：稳定且值得单独研究，但项目已有约 20 MB 中日文字体分片、按 locale 加载和阅读器字体设置，不是零成本替换；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP&lt;/strong&gt;：当前与 ClientRouter、Shiki 以及多种 inline/第三方资源冲突，本轮不启用；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Content Collections / route caching&lt;/strong&gt;：面向按需渲染，与 static + nginx 架构不匹配；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sonda&lt;/strong&gt;：继续保留 &lt;code&gt;ANALYZE=true pnpm build&lt;/code&gt; 的按需模式，不增加日常构建成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust compiler 和 queued rendering 看似只需要一行配置，所以额外做了同机单次构建实验。它不是严格性能测试，但足以决定
是否值得把实验配置留在主干：&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;real time&lt;/th&gt;&lt;th&gt;Astro time&lt;/th&gt;&lt;th&gt;最大 RSS&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;25.29s&lt;/td&gt;&lt;td&gt;22.89s&lt;/td&gt;&lt;td&gt;2.30 GB&lt;/td&gt;&lt;td&gt;基线&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;queued rendering&lt;/td&gt;&lt;td&gt;26.60s&lt;/td&gt;&lt;td&gt;24.48s&lt;/td&gt;&lt;td&gt;2.36 GB&lt;/td&gt;&lt;td&gt;约慢 5.2%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rust compiler 0.3.1&lt;/td&gt;&lt;td&gt;26.24s&lt;/td&gt;&lt;td&gt;23.66s&lt;/td&gt;&lt;td&gt;2.47 GB&lt;/td&gt;&lt;td&gt;约慢 3.8%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;两项实验在这套内容和机器上都没有收益，相关配置与 &lt;code&gt;@astrojs/compiler-rs&lt;/code&gt; 依赖随后全部移除。&lt;/p&gt;
&lt;h2&gt;一份可复用的迁移顺序&lt;a href=&quot;#一份可复用的迁移顺序&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你的 Astro 项目也有复杂内容层，可以按下面的顺序降低排障噪声：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;固定迁移前 Node、check、build、路由和代表性 HTML 基线；&lt;/li&gt;
&lt;li&gt;显式锁定目标 major，不使用会跨 major 的 &lt;code&gt;latest&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;先升级 Astro 和官方 integrations，记录第一批真实错误；&lt;/li&gt;
&lt;li&gt;单独迁移 &lt;code&gt;content.config.ts&lt;/code&gt;、loader、&lt;code&gt;entry.id&lt;/code&gt; 和 &lt;code&gt;render(entry)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;区分内部内容 ID、公开 slug 与 frontmatter override，避免机械替换；&lt;/li&gt;
&lt;li&gt;先对下游历史文章 dry-run，发现冲突时整批停止，不让用户手工批量改 frontmatter；&lt;/li&gt;
&lt;li&gt;把正式迁移放在自动备份之后，并用第二次 dry-run 证明它是幂等的；&lt;/li&gt;
&lt;li&gt;明确旧备份中哪些目录是快照替换、哪些配置需要向前合并，恢复内容后自动执行同一迁移；&lt;/li&gt;
&lt;li&gt;逐个验证 Markdown、搜索、RSS、sitemap 和第三方 integrations；&lt;/li&gt;
&lt;li&gt;比较路由集合，再检查 fallback canonical 和生成 HTML；&lt;/li&gt;
&lt;li&gt;用至少一份真实下游备份做临时恢复、check 和生产构建；&lt;/li&gt;
&lt;li&gt;最后才评估实验能力，并保证实验依赖不进入生产 lockfile。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;astro-koharu 用户从旧版升级时，先运行 &lt;code&gt;pnpm koharu update&lt;/code&gt; 并等进程完全退出，再用
&lt;code&gt;pnpm koharu migrate --dry-run&lt;/code&gt; 查看计划，最后运行 &lt;code&gt;pnpm koharu migrate&lt;/code&gt; 自动备份并执行。已有 &lt;code&gt;link&lt;/code&gt; 会保留，
旧 &lt;code&gt;slug&lt;/code&gt; 会转换为 &lt;code&gt;link&lt;/code&gt;，旧备份通过 Koharu CLI 恢复后也会自动执行同一迁移。如果忘记手动迁移，
&lt;code&gt;pnpm dev&lt;/code&gt; 和 &lt;code&gt;pnpm build&lt;/code&gt; 的只读检查会阻止旧内容进入 Astro 6 管线，但不会替用户改写文章。&lt;/p&gt;
&lt;h2&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这次迁移最后没有留下兼容 flag，也没有改变静态部署架构。最大的收获不是版本号从 5 变成 6，而是把内容身份和数据升级的
边界写清楚：&lt;code&gt;entry.id&lt;/code&gt; 负责内部查找，公开 slug 负责 URL，&lt;code&gt;link&lt;/code&gt; 只覆盖后者；备份中的文章和图片是用户快照，配置则需要在
恢复用户值的同时接住新版本能力。这个模型一旦明确，多语言 fallback、搜索、RSS 和旧备份恢复就有了共同依据。&lt;/p&gt;
&lt;p&gt;major upgrade 最可靠的完成标准也不是“模板构建成功”，而是能回答三个问题：哪些行为必须保持、历史数据如何安全过桥、
哪些结论有可重复的证据。版本升级只是代码改动；当一份真实的 376 篇文章备份也能无损恢复并完成生产构建，这次迁移才真正
覆盖到了用户。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>category:前端</category><category>tag:Astro</category><category>tag:迁移</category><category>tag:Content Collections</category><category>tag:Vite</category><category>tag:Shiki</category><category>tag:前端工程</category></item><item><title>gpu服务器IDC运维</title><link>https://blog.vull.top/ja/post/life/work/gpu%E6%9C%8D%E5%8A%A1%E5%99%A8idc%E8%BF%90%E7%BB%B4</link><guid isPermaLink="false">ja:life/work/gpu服务器idc运维</guid><description>gpu服务器IDC运维面试经验</description><pubDate>Tue, 14 Jul 2026 11:34:31 GMT</pubDate><content:encoded>&lt;h2&gt;了解 Zabbix 监控”，那用 Zabbix 监控 GPU 服务器的显存使用率，需要怎么做？具体步骤说清楚&lt;a href=&quot;#了解-zabbix-监控那用-zabbix-监控-gpu-服务器的显存使用率需要怎么做具体步骤说清楚&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“用 Zabbix 监控 GPU 显存使用率的步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;被监控机安装 Zabbix Agent，并确保&lt;code&gt;nvidia-smi&lt;/code&gt;命令可执行；&lt;/li&gt;
&lt;li&gt;在 Agent 端编写脚本（如&lt;code&gt;gpu_memory.sh&lt;/code&gt;），通过&lt;code&gt;nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits&lt;/code&gt;提取显存使用值；&lt;/li&gt;
&lt;li&gt;在 zabbix_agentd.conf 中添加&lt;code&gt;UserParameter=gpu.memory.used,/path/to/gpu_memory.sh&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;重启 Zabbix Agent 使配置生效；&lt;/li&gt;
&lt;li&gt;Zabbix Server 端创建监控项（键值为 gpu.memory.used，类型为 Zabbix 客户端）；&lt;/li&gt;
&lt;li&gt;设置触发器（如当使用率 &amp;gt; 90% 时告警）；7. 创建图形关联该监控项，实现可视化展示。”&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h2&gt;“参与过 IDC 机房设备上架”，那你说一下服务器上架前需要做哪些检查？上架时的操作规范是什么？&lt;a href=&quot;#参与过-idc-机房设备上架那你说一下服务器上架前需要做哪些检查上架时的操作规范是什么&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“服务器上架前检查：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;外观检查（机身无磕碰、接口无损坏、螺丝无松动）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;资产核对（SN 号、配置参数与工单一致）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;功能预检测（BMC 管理口 ping 通、硬盘 / 内存通过预启动检测工具验证、电源模块测试）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;机柜适配性检查（服务器尺寸与机柜 U 位匹配、PDU 功率满足设备功耗需求、导轨型号兼容）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上架操作规范&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;双人协作（一人托举服务器保持水平，一人引导入导轨，禁止单手拎拽）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;固定规范（用指定规格螺丝对角锁紧服务器与导轨，扭矩符合要求）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;布线要求（强弱电分离走槽，线缆标签朝向一致，不遮挡服务器散热孔，冗余线缆捆扎整齐）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;电源规范（双电源分别接入不同 PDU 回路，确保冗余）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;上架后验证（上电检查指示灯状态，通过 BMC 确认硬件识别正常，登记资产到 CMDB 系统）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;用 Ansible 批量升级 NVIDIA 驱动的 playbook，核心模块和任务是什么？至少 3 个关键任务&lt;a href=&quot;#用-ansible-批量升级-nvidia-驱动的-playbook核心模块和任务是什么至少-3-个关键任务&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;核心模块&lt;a href=&quot;#核心模块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apt&lt;/code&gt; / &lt;code&gt;dnf&lt;/code&gt;（包管理）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemd&lt;/code&gt;（服务管理）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;shell&lt;/code&gt;（执行驱动校验）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;关键任务（3 个）&lt;a href=&quot;#关键任务3-个&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;停止图形 / 显卡相关服务，卸载旧驱动&lt;/li&gt;
&lt;li&gt;安装指定版本 NVIDIA 驱动及 DKMS 依赖&lt;/li&gt;
&lt;li&gt;加载 nvidia 内核模块，验证 &lt;code&gt;nvidia-smi&lt;/code&gt; 正常&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;标准答案&lt;/strong&gt;：“Ansible playbook 批量升级 NVIDIA 驱动的核心模块包括
&lt;code&gt;yum&lt;/code&gt;/&lt;code&gt;apt&lt;/code&gt;（依赖安装）、
&lt;code&gt;copy&lt;/code&gt;（传输驱动包）、
&lt;code&gt;command&lt;/code&gt;（执行驱动安装命令）、
&lt;code&gt;systemd&lt;/code&gt;（管理服务）。&lt;/p&gt;
&lt;p&gt;关键任务：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;禁用 nouveau 驱动（用&lt;code&gt;lineinfile&lt;/code&gt;模块修改黑名单配置，&lt;code&gt;command&lt;/code&gt;模块执行&lt;code&gt;dracut -f&lt;/code&gt;更新 initramfs）；&lt;/li&gt;
&lt;li&gt;卸载旧驱动（&lt;code&gt;command&lt;/code&gt;模块执行&lt;code&gt;nvidia-uninstall --silent&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;安装依赖（&lt;code&gt;yum&lt;/code&gt;模块安装&lt;code&gt;gcc&lt;/code&gt;、&lt;code&gt;kernel-devel&lt;/code&gt;、&lt;code&gt;dkms&lt;/code&gt;）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;安装新驱动（&lt;code&gt;command&lt;/code&gt;模块执行&lt;code&gt;sh NVIDIA-Linux-x86_64-xxx.xx.run --silent&lt;/code&gt;）；&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;验证驱动（&lt;code&gt;command&lt;/code&gt;模块执行&lt;code&gt;nvidia-smi&lt;/code&gt;，检查输出的驱动版本是否正确）。”&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;岗位要求里提到需要 “处理简单的突发故障”，如果 IDC 机房某机柜突然断电，你的第一反应和处理步骤是什么？&lt;a href=&quot;#岗位要求里提到需要-处理简单的突发故障如果-idc-机房某机柜突然断电你的第一反应和处理步骤是什么&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;第一反应&lt;a href=&quot;#第一反应&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;立即确认是&lt;strong&gt;单柜空开跳闸&lt;/strong&gt;还是&lt;strong&gt;上游配电柜 / 市电故障&lt;/strong&gt;，禁止盲目合闸。&lt;/p&gt;
&lt;h3&gt;处理步骤&lt;a href=&quot;#处理步骤&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;先检查机柜&lt;strong&gt;有无焦糊味、短路、打火&lt;/strong&gt;，排除硬件故障&lt;/li&gt;
&lt;li&gt;查看 PDU、列头柜空开状态，确认非设备短路后再试合闸&lt;/li&gt;
&lt;li&gt;上电后逐台启动服务器，避免瞬间大电流再次跳闸&lt;/li&gt;
&lt;li&gt;检查业务、BMC、网络连通性，同步上报故障与恢复情况&lt;/li&gt;
&lt;li&gt;收尾：记录断电原因、处理时长、受影响设备和业务，同步书面上报给主管，协助分析跳闸根本原因（如是否因设备过载、线缆老化等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;你简历里写 “了解常见网络协议（TCP/IP, HTTP, DNS 等）”，那你说一下 TCP 三次握手的具体过程，以及为什么需要三次而不是两次？&lt;a href=&quot;#你简历里写-了解常见网络协议tcpip-http-dns-等那你说一下-tcp-三次握手的具体过程以及为什么需要三次而不是两次&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;一、TCP 三次握手过程&lt;a href=&quot;#一tcp-三次握手过程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一次（SYN）&lt;/strong&gt;：客户端向服务器发送连接请求，报文标志位&lt;strong&gt;SYN=1&lt;/strong&gt;，并生成一个初始序列号&lt;strong&gt;ISN&lt;/strong&gt;，客户端进入&lt;strong&gt;SYN_SENT&lt;/strong&gt;状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二次（SYN+ACK）&lt;/strong&gt;：服务器收到请求后，确认收到（&lt;strong&gt;ACK=1&lt;/strong&gt;，确认号 = ISN+1），同时也发送连接请求（&lt;strong&gt;SYN=1&lt;/strong&gt;），生成自己的&lt;strong&gt;ISN&lt;/strong&gt;，服务器进入&lt;strong&gt;SYN_RCVD&lt;/strong&gt;状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三次（ACK）&lt;/strong&gt;：客户端收到服务器的确认与请求，发送确认报文（&lt;strong&gt;ACK=1&lt;/strong&gt;，确认号 = 服务器 ISN+1），客户端进入&lt;strong&gt;ESTABLISHED&lt;/strong&gt;；服务器收到确认后也进入&lt;strong&gt;ESTABLISHED&lt;/strong&gt;，连接建立。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;二、为什么需要三次而不是两次？&lt;a href=&quot;#二为什么需要三次而不是两次&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;核心是&lt;strong&gt;防止失效的连接请求报文段被服务器接收，导致建立错误连接&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;若只用两次：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若客户端的连接请求因网络延迟滞留（未丢失），延迟到达服务器时，服务器会误建立连接，而客户端已废弃该请求，造成资源浪费与连接异常。&lt;/li&gt;
&lt;li&gt;三次握手通过双向确认，既能建立双方可靠的发送与接收能力，又能避免这种历史无效请求导致的误连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;假设你负责维护的某台服务器突然出现 CPU 占用率持续 100% 的情况，且暂时无法重启，你会分步骤怎么做来排查和缓解这个问题？&lt;a href=&quot;#假设你负责维护的某台服务器突然出现-cpu-占用率持续-100-的情况且暂时无法重启你会分步骤怎么做来排查和缓解这个问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用 &lt;code&gt;top&lt;/code&gt; 定位占用最高的进程与 PID&lt;/li&gt;
&lt;li&gt;查看进程详情 &lt;code&gt;ps -fp PID&lt;/code&gt;，判断是否为异常 / 恶意进程&lt;/li&gt;
&lt;li&gt;查看线程 / IO / 网络情况，确认是计算密集还是死循环&lt;/li&gt;
&lt;li&gt;必要时 &lt;code&gt;kill&lt;/code&gt; 或 &lt;code&gt;kill -STOP&lt;/code&gt; 暂停异常进程缓解 CPU&lt;/li&gt;
&lt;li&gt;查看日志 / 应用状态，定位业务逻辑死循环或漏洞&lt;/li&gt;
&lt;li&gt;观察负载回落，确认业务影响范围并上报&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;假设现在需要你排查一台服务器的网络故障：ping 网关不通，但本机网卡灯亮着，网线也插紧了。你会按什么步骤排查？从硬件到软件，说清楚每一步的操作和判断依据&lt;a href=&quot;#假设现在需要你排查一台服务器的网络故障ping-网关不通但本机网卡灯亮着网线也插紧了你会按什么步骤排查从硬件到软件说清楚每一步的操作和判断依据&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;检查网卡状态：&lt;code&gt;ip addr&lt;/code&gt;
看网卡是否 UP、IP 是否正确配置&lt;/li&gt;
&lt;li&gt;检查路由：&lt;code&gt;ip route&lt;/code&gt;
确认默认网关存在且正确&lt;/li&gt;
&lt;li&gt;检查 ARP：&lt;code&gt;arp -n&lt;/code&gt; 或 &lt;code&gt;ip neigh&lt;/code&gt;
看能否解析网关 MAC，不能则二层不通&lt;/li&gt;
&lt;li&gt;检查端口配置：确认交换机端口未 shutdown、未错配 VLAN、速率双工不协商异常&lt;/li&gt;
&lt;li&gt;检查防火墙：&lt;code&gt;iptables -L&lt;/code&gt; / &lt;code&gt;firewall-cmd --list-all&lt;/code&gt;
看是否禁 ICMP 或拦截出站，因为 ping 依赖 icmp&lt;/li&gt;
&lt;li&gt;测试链路：用其它设备接同网线 / 同端口，判断是服务器问题还是线路 / 交换机问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;你在联通实习的时候，负责过网络设备巡检，那巡检服务器的时候，你怎么判断服务器硬件有没有故障？别废话，直接说步骤&lt;a href=&quot;#你在联通实习的时候负责过网络设备巡检那巡检服务器的时候你怎么判断服务器硬件有没有故障别废话直接说步骤&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标准答案是：服务器硬件巡检要按 “先远程监控、后本地检查” 的流程来：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先通过 IPMI/BMC 系统查看硬件监控数据：包括 CPU / 内存 / 硬盘的健康状态、电源模块冗余状态、风扇转速与温度阈值、硬盘 SMART 信息（坏道 / 掉线）；&lt;/li&gt;
&lt;li&gt;查看系统日志（如 dmesg）中是否有硬件报错（比如 PCI 设备异常、硬盘 IO 错误）；&lt;/li&gt;
&lt;li&gt;本地巡检时检查机箱物理状态：电源指示灯是否正常、有无异响 / 异味、散热口温度是否过高、线缆连接是否松动。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;你简历里写了 “处理过高中校园网故障”，当时 2 小时内恢复了全网，那你排查网络故障的第一步是做什么？别再扯没用的&lt;a href=&quot;#你简历里写了-处理过高中校园网故障当时-2-小时内恢复了全网那你排查网络故障的第一步是做什么别再扯没用的&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标准答案是：整网中断故障排查第一步是 “确认故障影响范围 + 验证网络出口连通性”：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先通过终端设备（比如随便找个学生电脑）ping 网关、ping 外网 DNS，判断是内网故障还是出口故障；&lt;/li&gt;
&lt;li&gt;再检查机房核心设备的物理状态（电源灯、运行灯是否正常），排除硬件宕机的情况；&lt;/li&gt;
&lt;li&gt;最后才是登录核心交换机查看端口状态、VLAN 配置、链路聚合是否异常。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;你简历里写了 “熟悉 Linux Shell 脚本”，那你写过批量检查服务器硬盘状态的 Shell 脚本吗？脚本里核心命令用什么？别告诉我你没写过&lt;a href=&quot;#你简历里写了-熟悉-linux-shell-脚本那你写过批量检查服务器硬盘状态的-shell-脚本吗脚本里核心命令用什么别告诉我你没写过&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标准答案是：批量检查服务器硬盘状态的 Shell 脚本，核心命令分两类：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;查看硬盘物理健康状态：用&lt;code&gt;smartctl -a /dev/sdX&lt;/code&gt;（获取 SMART 信息）；&lt;/li&gt;
&lt;li&gt;查看 RAID 阵列状态（如果有）：用对应阵列卡工具，比如 LSI 的&lt;code&gt;megacli64 -LDInfo -Lall -aALL&lt;/code&gt;，或者 HPE 的&lt;code&gt;hpssacli controller all show config&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;再问你：招聘要求里要做 GPU 服务器部署，你知道安装 NVIDIA 驱动前，需要先禁用 Linux 系统里的哪个默认驱动吗？说全称，别缩写&lt;a href=&quot;#再问你招聘要求里要做-gpu-服务器部署你知道安装-nvidia-驱动前需要先禁用-linux-系统里的哪个默认驱动吗说全称别缩写&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;需要禁用 &lt;strong&gt;nouveau&lt;/strong&gt; 驱动。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;步骤是：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编辑&lt;code&gt;/etc/modprobe.d/blacklist.conf&lt;/code&gt;，添加&lt;code&gt;blacklist nouveau&lt;/code&gt;和&lt;code&gt;options nouveau modeset=0&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;重建 initramfs 镜像（比如&lt;code&gt;dracut -f&lt;/code&gt;或&lt;code&gt;update-initramfs -u&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;重启系统后，用&lt;code&gt;lsmod | grep nouveau&lt;/code&gt;确认驱动已禁用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;再问你：IDC 驻场时服务器上架，你知道机柜里服务器的安装顺序有什么要求吗？别跟我说随便装&lt;a href=&quot;#再问你idc-驻场时服务器上架你知道机柜里服务器的安装顺序有什么要求吗别跟我说随便装&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标准答案是：服务器上架核心原则是 “安全第一、散热优先”：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;按重量分层：下部放重型设备，上部放轻型设备，且单柜承重不超过机柜额定负载；&lt;/li&gt;
&lt;li&gt;按散热布局：设备间距预留至少 1U 空间，前方对应冷通道、后方对应热通道，避免阻挡气流；&lt;/li&gt;
&lt;li&gt;按线缆规划：先固定机柜 PDU 电源，再安装设备，确保电源线、网线从机柜两侧理线架走，避免缠绕。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;再问你：用 Prometheus 监控 GPU 服务器时，需要部署什么 exporter？它采集的核心指标有哪些？别想蒙混过关&lt;a href=&quot;#再问你用-prometheus-监控-gpu-服务器时需要部署什么-exporter它采集的核心指标有哪些别想蒙混过关&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;首先，监控的是&lt;strong&gt;NVIDIA GPU&lt;/strong&gt;，用的是 NVIDIA 官方的&lt;code&gt;dcgm-exporter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dcgm-exporter 采集的 GPU 核心指标包括&lt;/strong&gt;：GPU 利用率、显存使用率、显存带宽、GPU 温度、功耗、ECC 错误计数等&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;再问你：用 Ansible 批量给 100 台 GPU 服务器安装 NVIDIA 驱动，需要写哪些核心模块？步骤是什么？别再东拉西扯&lt;a href=&quot;#再问你用-ansible-批量给-100-台-gpu-服务器安装-nvidia-驱动需要写哪些核心模块步骤是什么别再东拉西扯&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;正确的核心模块和步骤是&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用&lt;code&gt;yum&lt;/code&gt;或&lt;code&gt;apt&lt;/code&gt;模块安装依赖（如 gcc、kernel-devel）；&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;copy&lt;/code&gt;模块上传 NVIDIA 驱动.run 文件到目标服务器；&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;command&lt;/code&gt;或&lt;code&gt;shell&lt;/code&gt;模块执行驱动安装命令（需添加&lt;code&gt;--silent&lt;/code&gt;等参数实现无交互安装）；&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;modprobe&lt;/code&gt;模块加载&lt;code&gt;nvidia&lt;/code&gt;内核模块；&lt;/li&gt;
&lt;li&gt;用&lt;code&gt;shell&lt;/code&gt;模块执行&lt;code&gt;nvidia-smi&lt;/code&gt;命令验证驱动是否安装成功；&lt;/li&gt;
&lt;li&gt;若需重启，用&lt;code&gt;reboot&lt;/code&gt;模块&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;最后问你：IDC 机房里，服务器突然出现频繁掉电，你第一步要排查什么？说不出来就直接走人&lt;a href=&quot;#最后问你idc-机房里服务器突然出现频繁掉电你第一步要排查什么说不出来就直接走人&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;标准答案是：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一时间冲到 UPS 机柜，查看 上层供电 UPS 是否报警、指示灯状态（市电是否中断、电池是否在放电）；检查上层 UPS 可以瞬间判断是单台还是系统性风险&lt;/li&gt;
&lt;li&gt;检查总 PDU 输入空开是否跳闸，排除供电链路故障；&lt;/li&gt;
&lt;li&gt;若 UPS 正常，再排查单台服务器的 PDU 端口和电源模块；&lt;/li&gt;
&lt;li&gt;全程同步通知业务团队，优先通过备用机切换保业务，而非傻等着查原因。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;你简历写 “参与过 Linux 服务器系统安装”，那安装 CentOS 7 时，如何通过 kickstart 文件实现自动化分区？要求根分区 50G，swap 分区 8G，剩余空间给 /data 分区。写关键配置段，别漏参数&lt;a href=&quot;#你简历写-参与过-linux-服务器系统安装那安装-centos-7-时如何通过-kickstart-文件实现自动化分区要求根分区-50gswap-分区-8g剩余空间给-data-分区写关键配置段别漏参数&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 清除旧分区，初始化磁盘 &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;clearpart --all --initlabel &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 分区配置 &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;part /boot --fstype=xfs --size=1024 &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;part swap --size=8192 &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;part / --fstype=xfs --size=51200 &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;part /data --fstype=xfs --grow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;下一个问题，在 GPU 服务器上进行 CUDA 安装，安装完成后如何验证 CUDA 是否成功安装并能正常使用？要说出具体命令和验证要点。别答错，再给你一次机会，这都答不好就真没机会了&lt;a href=&quot;#下一个问题在-gpu-服务器上进行-cuda-安装安装完成后如何验证-cuda-是否成功安装并能正常使用要说出具体命令和验证要点别答错再给你一次机会这都答不好就真没机会了&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 1. 查看 CUDA 版本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nvcc -V&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. 查看 GPU 状态和驱动版本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nvidia-smi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. 运行官方样例测试&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd /usr/local/cuda/samples/1_Utilities/deviceQuery&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;make&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./deviceQuery&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 4. 带宽测试（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd ../bandwidthTest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;make&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./bandwidthTest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&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;code&gt;nvcc -V&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示 CUDA 版本号，无报错&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示 GPU 型号、驱动版本、温度、功耗，无 &lt;code&gt;ERR!&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;deviceQuery&lt;/code&gt;&lt;/td&gt;&lt;td&gt;最后一行显示 &lt;code&gt;Result = PASS&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;bandwidthTest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示 &lt;code&gt;Result = PASS&lt;/code&gt;，带宽数值符合预期&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;关键细节&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nvidia-smi&lt;/code&gt; 正常但 &lt;code&gt;nvcc -V&lt;/code&gt; 报错 → CUDA Toolkit 未正确安装或环境变量未配（&lt;code&gt;PATH&lt;/code&gt; 需包含 &lt;code&gt;/usr/local/cuda/bin&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deviceQuery&lt;/code&gt; 失败 → 驱动与 CUDA 版本不匹配，或 GPU 未识别&lt;/li&gt;
&lt;li&gt;多 GPU 环境：检查 &lt;code&gt;nvidia-smi&lt;/code&gt; 是否列出全部卡&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;下一个问题，在 GPU 服务器的运维中，当发现 GPU 利用率长时间过高，且显存也几乎占满，你从软件层面会如何排查原因？要说出至少三个排查方向和具体操作。这次一定要回答好，别再掉链子&lt;a href=&quot;#下一个问题在-gpu-服务器的运维中当发现-gpu-利用率长时间过高且显存也几乎占满你从软件层面会如何排查原因要说出至少三个排查方向和具体操作这次一定要回答好别再掉链子&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;&lt;strong&gt;排查方向一：定位占用进程&lt;/strong&gt;&lt;a href=&quot;#排查方向一定位占用进程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 查看具体进程占用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nvidia-smi pmon -s um -o T&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 或详细模式&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nvidia-smi -q -d PIDS | grep -A 5 &quot;Process ID&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 获取 PID 后查进程详情&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ps -ef | grep &amp;lt;PID&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lsof -p &amp;lt;PID&amp;gt; | head -20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;strong&gt;排查方向二：分析显存泄漏&lt;/strong&gt;&lt;a href=&quot;#排查方向二分析显存泄漏&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 实时监控显存变化（每秒刷新）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;watch -n 1 nvidia-smi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Python 程序用 torch 查显存分配&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;python -c &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import torch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print(f&apos;Allocated: {torch.cuda.memory_allocated()/1024**3:.2f} GB&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print(f&apos;Reserved:  {torch.cuda.memory_reserved()/1024**3:.2f} GB&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;print(f&apos;Max:       {torch.cuda.max_memory_allocated()/1024**3:.2f} GB&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 启用显存分析（针对 PyTorch）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:51200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;strong&gt;排查方向三：检查任务调度与并发&lt;/strong&gt;&lt;a href=&quot;#排查方向三检查任务调度与并发&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 查看是否有多个任务挤占单卡&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 检查容器/K8s 资源限制&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker stats --no-stream | grep &amp;lt;container_id&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;kubectl top pod &amp;lt;pod_name&amp;gt; --containers&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 查看任务是否超发&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cat /proc/&amp;lt;PID&amp;gt;/cgroup | grep gpu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;再问一个实际操作题：你们团队在维护 GPU 服务器时，突然收到告警，某台机器的 GPU 温度飙升至 95℃，且显存占用异常，同时 ssh 连接频繁断开。请分步骤说明排查思路和解决措施&lt;a href=&quot;#再问一个实际操作题你们团队在维护-gpu-服务器时突然收到告警某台机器的-gpu-温度飙升至-95且显存占用异常同时-ssh-连接频繁断开请分步骤说明排查思路和解决措施&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保连接&lt;/strong&gt;：IPMI/iLO 带外登录，绕过 SSH，确认非网络问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;看现场&lt;/strong&gt;：&lt;code&gt;nvidia-smi -q -d TEMPERATURE&lt;/code&gt; 确认真实温度，查风扇转速是否归零&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;杀进程&lt;/strong&gt;：&lt;code&gt;nvidia-smi pmon&lt;/code&gt; 定位高显存占用 PID，&lt;code&gt;kill -9&lt;/code&gt; 强制终止，降温优先&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查根因&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;风扇故障 → 报硬件更换&lt;/li&gt;
&lt;li&gt;散热片堵塞 → 清灰&lt;/li&gt;
&lt;li&gt;程序死循环 → 查代码日志&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防复现&lt;/strong&gt;：临时降频 &lt;code&gt;nvidia-smi -pl 200&lt;/code&gt;（限制功耗），迁移业务到备用机&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：&lt;strong&gt;带外保命，杀进程降温，查风扇/散热/代码，降频迁移保业务。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;假设现在你负责的 GPU 服务器集群突然出现批量进程无响应，监控面板显示 GPU 显存占用为 0 但节点状态为 “忙碌”，同时机房反馈部分机柜电源指示灯闪烁。结合之前的操作经验，从硬件到软件，分步骤说明你的排查逻辑，以及每一步的核心命令或操作依据&lt;a href=&quot;#假设现在你负责的-gpu-服务器集群突然出现批量进程无响应监控面板显示-gpu-显存占用为-0-但节点状态为-忙碌同时机房反馈部分机柜电源指示灯闪烁结合之前的操作经验从硬件到软件分步骤说明你的排查逻辑以及每一步的核心命令或操作依据&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;硬件&lt;/strong&gt;：IPMI 查电源日志 &lt;code&gt;ipmitool sel list&lt;/code&gt;，机房确认 PDU 波动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总线&lt;/strong&gt;：&lt;code&gt;lspci | grep nvidia&lt;/code&gt; 验 GPU 是否掉卡，&lt;code&gt;dmesg&lt;/code&gt; 看 PCIe 报错&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;驱动&lt;/strong&gt;：&lt;code&gt;nvidia-smi&lt;/code&gt; 空白则 &lt;code&gt;modprobe nvidia&lt;/code&gt; 重载，或重装驱动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进程&lt;/strong&gt;：&lt;code&gt;ps aux | awk &apos;$8~/D/&apos;&lt;/code&gt; 抓 D 态僵死进程，&lt;code&gt;kill -9&lt;/code&gt; 清理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;最后问你：IDC 机房巡检时，发现某机柜温湿度超标，你的处理流程是什么？这次再答不出来，直接淘汰&lt;a href=&quot;#最后问你idc-机房巡检时发现某机柜温湿度超标你的处理流程是什么这次再答不出来直接淘汰&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;确认范围&lt;/strong&gt;：确认是是不是传感器异常，然后再排查单柜超标还是整列超标，看相邻机柜传感器数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定位热源&lt;/strong&gt;：该机柜哪台设备温度最高，&lt;code&gt;ipmitool sensor list&lt;/code&gt; 查服务器进风/出风温度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应急降温&lt;/strong&gt;：临时调高冷通道空调出风量，打开机柜盲板疏通气流，高热设备关机或迁移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查根因&lt;/strong&gt;：空调故障？冷热通道封闭失效？设备超配密度过高？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同步记录&lt;/strong&gt;：报工单给设施团队，并说明紧急程度。持续监控直到恢复正常阈值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：&lt;strong&gt;定范围、找热源、应急降温、查根因、报工单盯恢复。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;现在请你回答：在 GPU 服务器运维中，若通过命令行发现某块 GPU 持续高负载（超过 90%）但无实际任务运行，可能的原因有哪些？应如何排查处理？&lt;a href=&quot;#现在请你回答在-gpu-服务器运维中若通过命令行发现某块-gpu-持续高负载超过-90但无实际任务运行可能的原因有哪些应如何排查处理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;可能原因&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;僵尸进程：任务已退出但驱动未释放 GPU 上下文&lt;/li&gt;
&lt;li&gt;驱动异常：内核模块卡住，GPU 处于忙等状态&lt;/li&gt;
&lt;li&gt;硬件故障：GPU 内部错误导致 SM 持续占用&lt;/li&gt;
&lt;li&gt;挖矿木马：隐藏进程占用算力&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;排查步骤&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查进程&lt;/strong&gt;：&lt;code&gt;nvidia-smi pmon -s um&lt;/code&gt; 和 &lt;code&gt;fuser -v /dev/nvidia*&lt;/code&gt; 确认无 PID 占用，但 &lt;code&gt;nvidia-smi&lt;/code&gt; 显示高负载 → 僵尸/驱动问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查显存&lt;/strong&gt;：&lt;code&gt;nvidia-smi&lt;/code&gt; 显存占用为 0 但利用率 90% → 典型驱动卡死&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查日志&lt;/strong&gt;：&lt;code&gt;dmesg | grep -i nvidia&lt;/code&gt; 看 Xid 错误，&lt;code&gt;/var/log/nvidia-installer.log&lt;/code&gt; 查驱动报错 c&lt;code&gt;ps aux | grep -E &quot;miner|xmr|pool&quot;&lt;/code&gt;，netstat -tulnp 看异常外连&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重置 GPU&lt;/strong&gt;：&lt;code&gt;nvidia-smi -r -i &amp;lt;GPU_ID&amp;gt;&lt;/code&gt; 热重置，或 &lt;code&gt;rmmod nvidia; modprobe nvidia&lt;/code&gt; 重装驱动&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬件隔离&lt;/strong&gt;：重置无效则 &lt;code&gt;nvidia-smi drain -p &amp;lt;PCI_BUS&amp;gt;&lt;/code&gt; 标记不可用，迁移业务后换卡&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;一句话&lt;/strong&gt;：&lt;strong&gt;无进程高负载 = 僵尸/驱动/硬件/木马，先查 PID 和显存，再扫日志和隐藏进程，重置无效换硬件。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;你简历里写 “掌握 RHCSA 级核心技能”，那 RHCSA 里配置 iptables 规则时，怎么限制特定 IP 的 SSH 访问？别给我背命令，要讲实际操作中怎么验证规则生效了！&lt;a href=&quot;#你简历里写-掌握-rhcsa-级核心技能那-rhcsa-里配置-iptables-规则时怎么限制特定-ip-的-ssh-访问别给我背命令要讲实际操作中怎么验证规则生效了&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;配置思路&lt;/strong&gt;：默认拒绝，仅允许白名单 IP。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证规则生效的方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;本地验证&lt;/strong&gt;：&lt;code&gt;iptables -L -n -v&lt;/code&gt;看规则是否加载，计数器是否有流量（pkts/bytes 非 0 说明命中）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对端测试&lt;/strong&gt;：从允许 IP SSH 连接应成功，从拒绝 IP 连接应超时或拒绝（&lt;code&gt;Connection refused&lt;/code&gt;/&lt;code&gt;timeout&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抓包确认&lt;/strong&gt;：&lt;code&gt;tcpdump -i eth0 port 22&lt;/code&gt;看被拒绝 IP 的请求是否到达本机但被丢弃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志追踪&lt;/strong&gt;：开&lt;code&gt;iptables -A INPUT -j LOG&lt;/code&gt;看&lt;code&gt;/var/log/messages&lt;/code&gt;记录 DROP 行为&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保存验证&lt;/strong&gt;：&lt;code&gt;service iptables save&lt;/code&gt;后重启服务，确认规则持久化未丢失&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>category:life</category><category>category:面经</category><category>tag:面经</category></item><item><title>博客排版特殊功能</title><link>https://blog.vull.top/ja/post/study/blog/%E5%8D%9A%E5%AE%A2%E6%8E%92%E7%89%88%E7%89%B9%E6%AE%8A%E5%8A%9F%E8%83%BD</link><guid isPermaLink="false">ja:study/blog/博客排版特殊功能</guid><description>博客文章特殊编写功能记录</description><pubDate>Wed, 03 Jun 2026 16:24:40 GMT</pubDate><content:encoded>&lt;p&gt;详细参考&lt;a href=&quot;https://shoka.lostyu.me/computer-science/note/theme-shoka-doc/special/&quot;&gt;Shoka&lt;/a&gt;
现如今无法正常访问需要在 F12 Console 输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;document.body.classList.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;loaded&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;document.body.style.overflow &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;auto&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;document.&lt;/span&gt;&lt;span&gt;getElementById&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;loading&apos;&lt;/span&gt;&lt;span&gt;)?.&lt;/span&gt;&lt;span&gt;remove&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;link 连接快&lt;a href=&quot;#link-连接快&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;

&lt;h1&gt;文字特效&lt;a href=&quot;#文字特效&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;++ 下划线 ++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 波浪线 ++{.wavy}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 着重点 ++{.dot}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 紫色下划线 ++{.primary}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 绿色波浪线 ++{.wavy .success}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 黄色着重点 ++{.dot .warning}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;~~ 删除线～～&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;~~ 红色删除线～～{.danger}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;== 荧光高亮 ==&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;赤橙黄绿青蓝紫&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;红色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;粉色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;橙色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;黄色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;绿色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;靛青&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;蓝色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;紫色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;灰色&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;快捷键 &lt;span&gt;Ctrl&lt;/span&gt; + &lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;H~2~0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;29^th^&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;隐藏文字&lt;a href=&quot;#隐藏文字&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;!! 黑幕黑幕黑幕黑幕黑幕黑幕！！： 鼠标滑过显示内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;!! 模糊模糊模糊模糊模糊模糊！！{.bulr} ： 选中文字显示内容&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;label 标签快&lt;a href=&quot;#label-标签快&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;default&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;info&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;:heavy_check_mark:success&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;warning&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;:broken_heart:danger&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;提醒块&lt;a href=&quot;#提醒块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::default&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;默认默认&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::primary&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;基本基本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;提示提示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::success&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;成功成功&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::warning&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;警告警告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;危险危险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger no-icon&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;危险危险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;tab 标签块&lt;a href=&quot;#tab-标签块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;;;;id1 卡片 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 1 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;** 加粗 **&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;success&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% links %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- site: 優萌初華&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner: 霜月琉璃&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://shoka.lostyu.me&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc: 琉璃的医学 &amp;amp; 编程笔记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image: https://cdn.jsdelivr.net/gh/amehime/shoka@latest/images/avatar.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &quot;#e9546b&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endlinks %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;id1 卡片 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 2 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;危险危险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- 第一行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- 第二行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;id2 ②号标签卡片 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 1 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;id2 ②号标签卡片 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 2 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;collapse 折叠块&lt;a href=&quot;#collapse-折叠块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;+++ 默认默认 这里是一段文字&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;++ 下划线 ++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++primary 紫色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;参考信息&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- 第一行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- 第二行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++info  蓝色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;id3 卡片 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 1 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;id3 卡片 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这里是卡片 2 的内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;;;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++success 绿色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% links %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- site: 優萌初華&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url: https://shoka.lostyu.me&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &quot;#e9546b&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{% endlinks %}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++warning 黄色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;!! 警告警告警告警告警告！！{.bulr}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;label&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++danger 红色&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;danger&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;taskList 待办事项&lt;a href=&quot;#tasklist-待办事项&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [ ] 这是一个小叉叉&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [x] 这是一个红色勾勾&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{.danger}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [ ] 未完成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [x] 完成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{.primary}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [ ] 未完成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- [x] 默认颜色&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>category:study</category><category>category:blog</category><category>tag:blog</category><category>tag:md</category></item><item><title>数通学习体系笔记</title><link>https://blog.vull.top/ja/post/study/%E7%BD%91%E5%B7%A5/ensp%E7%AC%94%E8%AE%B0/%E6%95%B0%E9%80%9A%E5%AD%A6%E4%B9%A0%E4%BD%93%E7%B3%BB%E7%AC%94%E8%AE%B0</link><guid isPermaLink="false">ja:study/网工/ensp笔记/数通学习体系笔记</guid><description>网工数通学习笔记记录</description><pubDate>Sat, 30 May 2026 15:05:41 GMT</pubDate><content:encoded>&lt;p&gt;[学习视频](【【2026 最新版】华为认证 HCIA/HCIP/HCIE 全套课程共 200 集（附资料）零基础到进阶必备课程！华为大佬亲自授课，零基础也能轻松学会~网络工程师教程！】 &lt;a href=&quot;https://www.bilibili.com/video/BV1LokeBhE69/?p=4&amp;amp;share_source=copy_web&amp;amp;vd_source=81e6f3945583550f7d5bf26e1ef884c8&quot;&gt;https://www.bilibili.com/video/BV1LokeBhE69/?p=4&amp;amp;share_source=copy_web&amp;amp;vd_source=81e6f3945583550f7d5bf26e1ef884c8&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;华为数通&lt;a href=&quot;#华为数通&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;</content:encoded><category>category:study</category><category>category:NE</category><category>category:ensp-notes</category><category>tag:笔记</category><category>tag:数通</category><category>tag:学习</category><category>tag:study</category></item><item><title>美团网工面试经验</title><link>https://blog.vull.top/ja/post/life/work/%E7%BE%8E%E5%9B%A2%E7%BD%91%E5%B7%A5%E9%9D%A2%E8%AF%95%E7%BB%8F%E9%AA%8C</link><guid isPermaLink="false">ja:life/work/美团网工面试经验</guid><description>美团网络工程师面试经验</description><pubDate>Tue, 14 Apr 2026 11:34:31 GMT</pubDate><content:encoded>&lt;h2&gt;协议类问题&lt;a href=&quot;#协议类问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;老化时间&lt;a href=&quot;#老化时间&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;MAC&lt;/code&gt;表老化时间
&lt;ul&gt;
&lt;li&gt;300s 五分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ARP&lt;/code&gt;表老化时间
&lt;ul&gt;
&lt;li&gt;120s&lt;/li&gt;
&lt;li&gt;作用：定期清理无用 IP 与 MAC 地址映射避免表过大也更新网络拓扑变化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RIP&lt;/code&gt;表老化时间
&lt;ul&gt;
&lt;li&gt;180s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TCP&lt;/code&gt;老化时间
&lt;ul&gt;
&lt;li&gt;3600s 一小时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UDP&lt;/code&gt;老化时间
&lt;ul&gt;
&lt;li&gt;300s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;STP 协议&lt;a href=&quot;#stp-协议&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;说一下&lt;code&gt;STP&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;二层网络生成树协议&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;作用：堵塞冗余链路消除以太网环路，同时实现&lt;code&gt;热备份&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;说一下 STP 工作流程&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;第一步 选举唯一&lt;code&gt;根桥&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;所有交换机发送&lt;code&gt;BPDU&lt;/code&gt;比较&lt;code&gt;BID&lt;/code&gt;，&lt;code&gt;数值最小&lt;/code&gt;则为根桥
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BID&lt;/code&gt;构成：前&lt;code&gt;2&lt;/code&gt;字节&lt;code&gt;优先级&lt;/code&gt;，后&lt;code&gt;6&lt;/code&gt;字节为交换机&lt;code&gt;MAC&lt;/code&gt;地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;初始默认优先级：&lt;code&gt;32768&lt;/code&gt; （&lt;code&gt;越小越优先&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;自动选举优先级因为优先级一样，比较&lt;code&gt;mac大小&lt;/code&gt;，最小的自动选举成功&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第二步 选举&lt;code&gt;根端口&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;计算每个端口到根桥开销，选&lt;code&gt;最小开销&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;带宽越小&lt;/code&gt;开销越小&lt;/li&gt;
&lt;li&gt;100mbps 开销 19； 1Gbps 开销 4；10Gbps 开销 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;若有开销&lt;code&gt;相同&lt;/code&gt;的端口，比较交换机 BPDU，最小优先&lt;/li&gt;
&lt;li&gt;若上述&lt;code&gt;全部相同&lt;/code&gt;，选本端交换机&lt;code&gt;端口最小&lt;/code&gt;的，比如端口 1
&lt;ul&gt;
&lt;li&gt;极致&lt;code&gt;罕见&lt;/code&gt;情况下的&lt;code&gt;兜底策略&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三步 选举 &lt;code&gt;指定端口&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;根桥的所有端口都是指定端口&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;非根桥only one&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;除了根端口的全部端口再次进行根端口选举机制，最小的为指定端口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第四步 端口状态变化
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;非指定端口进入堵塞&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;根端口和指定端口进入&lt;code&gt;监听和学习&lt;/code&gt;，进入&lt;code&gt;转发状态&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;监听&lt;/code&gt;：发送接收 BPDU，确认无环路冲突
&lt;ul&gt;
&lt;li&gt;有环路冲突，进入堵塞，开始&lt;code&gt;重新选举&lt;/code&gt;新端口&lt;/li&gt;
&lt;li&gt;无环路冲突，进入学习&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;学习&lt;/code&gt;：构建 MAC 表，记录路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;ARP&lt;a href=&quot;#arp&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ARP&lt;/code&gt;协议是干什么的？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;作用：将 IP 转换成 MAC 地址&lt;/li&gt;
&lt;li&gt;过程：在局域网&lt;code&gt;广播ARP&lt;/code&gt;请求查询&lt;code&gt;目标IP&lt;/code&gt;对应的 MAC，该&lt;code&gt;局域网内的设备&lt;/code&gt;都会收到广播报文，只有目标 IP 收到后才会以&lt;code&gt;单播&lt;/code&gt;形式直接发送回&lt;code&gt;最初请求设备&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Vlan&lt;a href=&quot;#vlan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;VLan&lt;/code&gt;划分基于设备还是基于端口？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;基于交换机端口&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vlan 之间通过什么&lt;code&gt;通信&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于三层交换的&lt;code&gt;vlanif&lt;/code&gt;接口进行&lt;code&gt;三层转发&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vlan 接口有几种配置模式？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Access&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;用于连接&lt;code&gt;不同的终端设备&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;只接受和发送该 vlan 的&lt;code&gt;无标签数据帧&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trunk&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;用于连接相同的网络设备&lt;/li&gt;
&lt;li&gt;可以承载&lt;code&gt;多个&lt;/code&gt;vlan 数据帧，通过&lt;code&gt;帧头&lt;/code&gt;添加的 vlan 标签来区分&lt;code&gt;不同&lt;/code&gt;vlan 流量&lt;/li&gt;
&lt;li&gt;发送时会&lt;code&gt;剥离&lt;/code&gt;本数据帧的 vlan 标签
&lt;ul&gt;
&lt;li&gt;本帧&lt;code&gt;默认&lt;/code&gt;标签为：&lt;code&gt;vlan1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;收到&lt;code&gt;无标签帧&lt;/code&gt;会打上自己的标签
&lt;ul&gt;
&lt;li&gt;但是仅在交换机&lt;code&gt;内部传输&lt;/code&gt;，发送出去还时会剥离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hybrid&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Access 和 Trunk 的&lt;code&gt;结合&lt;/code&gt;，可灵活配置&lt;/li&gt;
&lt;li&gt;可以允许 vlan 是否给数据帧打标签&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;交换机堆叠技术&lt;a href=&quot;#交换机堆叠技术&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;交换机&lt;code&gt;堆叠&lt;/code&gt;可以解决什么问题？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;扩展端口数量&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;直接添加成员的端口为可用端口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;简化管理&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;只有&lt;/code&gt;一个管理 ip。所有配置修改生效都会自动同步到成员交换机&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;提升可靠性&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;拥有主备冗余机制
&lt;ul&gt;
&lt;li&gt;默认会选举一台为主交换机负责控制
&lt;ul&gt;
&lt;li&gt;先比较&lt;code&gt;优先级&lt;/code&gt;，相同再比较&lt;code&gt;MAC&lt;/code&gt;大小，还相同在比较&lt;code&gt;堆叠ID&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;堆叠ID默认为1，后加入的会冲突而改成2，后续类似&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MAC 相同基本不会发生&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;通知指定&lt;code&gt;一台或多台&lt;/code&gt;备交换机&lt;/li&gt;
&lt;li&gt;主交换机发送&lt;code&gt;故障&lt;/code&gt;会毫秒级&lt;code&gt;切换&lt;/code&gt;备用交换机，基本&lt;code&gt;无感&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;消除内部宽带瓶颈&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;成员交换机通过&lt;code&gt;专用&lt;/code&gt;堆叠链路连接，可以将链路内部带宽叠加&lt;/li&gt;
&lt;li&gt;堆叠的带宽仅用于成员&lt;code&gt;内部&lt;/code&gt;数据交换，不占用对外带宽&lt;/li&gt;
&lt;li&gt;&lt;code&gt;堆叠带宽=单条链接带宽 x 链路数量&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;不同成员之间的堆叠带宽需分别计算&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;路由&lt;a href=&quot;#路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;什么是&lt;code&gt;浮动路由&lt;/code&gt;？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;就是主路由的一个&lt;code&gt;备胎&lt;/code&gt;路由&lt;/li&gt;
&lt;li&gt;主路由故障，备用路由启用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;无法自动产生&lt;/code&gt;，人工&lt;code&gt;配置&lt;/code&gt;路由优先级
&lt;ul&gt;
&lt;li&gt;华为默认优先级 60 思科默认 1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;越小越优先&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;无线&lt;a href=&quot;#无线&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无线配置模式默认有哪些？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;胖AP模式&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;交换机&lt;code&gt;连胖AP&lt;/code&gt;，AP&lt;code&gt;独立&lt;/code&gt;完成 SSID 广播、用户认证和数据转发，所有操作都在 AP 完成&lt;/li&gt;
&lt;li&gt;交换机只负责&lt;code&gt;供电&lt;/code&gt;和&lt;code&gt;数据传输&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;适用家庭小型网络&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;瘦AP+AC模式&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;瘦 AP 通过&lt;code&gt;DHCP&lt;/code&gt;找 AC，从 AC&lt;code&gt;下载配置&lt;/code&gt;并广播 AC 统一下发的 SSID&lt;/li&gt;
&lt;li&gt;用户链接 AP 时，&lt;code&gt;认证请求&lt;/code&gt;会交给 AC 处理&lt;/li&gt;
&lt;li&gt;可配置直接&lt;code&gt;走AP&lt;/code&gt;还是&lt;code&gt;走AC隧道&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;适用于学校、大公司方便统一管理多 wifi 点&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;敏捷式AP组网&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;中心 AP 连交换机，负责与 AC 通信，管理一个或多个&lt;code&gt;RU&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;RU 通过&lt;code&gt;网线连接&lt;/code&gt;中心 AP，接收配置并广播下发&lt;/li&gt;
&lt;li&gt;用户数据由 RU&lt;code&gt;传到&lt;/code&gt;中心 AP，AP 再统一&lt;code&gt;转发&lt;/code&gt;给交换机&lt;/li&gt;
&lt;li&gt;适用于酒店、宿舍、每个房间放置 RU，布线方便方便管理。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;什么是旁挂和直通模式？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;旁挂
&lt;ol&gt;
&lt;li&gt;AC&lt;code&gt;直连&lt;/code&gt;核心交换机&lt;/li&gt;
&lt;li&gt;AP 的数据直接到 AC，AP&lt;code&gt;注册&lt;/code&gt;再 AC 上&lt;/li&gt;
&lt;li&gt;数据转发：AP 收到用户信息后直接通过 &lt;code&gt;CAPWAP隧道&lt;/code&gt;发给 AC&lt;/li&gt;
&lt;li&gt;AC 处理完后直接从&lt;code&gt;核心交换机&lt;/code&gt;转发到上层网络&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;直通
&lt;ol&gt;
&lt;li&gt;AC&lt;code&gt;不直接&lt;/code&gt;连在核心交换机的数据转发链路&lt;/li&gt;
&lt;li&gt;旁挂再核心交换机或汇聚交换机的&lt;code&gt;某个端口&lt;/code&gt;上&lt;/li&gt;
&lt;li&gt;AP 数据先到核心交换机，核心交换机再交给旁挂的 AC，AC 处理完后直接交给核心交换机转发出去&lt;/li&gt;
&lt;li&gt;AC 只负责&lt;code&gt;控制和管理&lt;/code&gt;，&lt;code&gt;不负责转发路径&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;那旁挂模式下，如果 AC 故障会影响无线上网么？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无冗余备份，&lt;code&gt;会&lt;/code&gt;直接影响上网&lt;/li&gt;
&lt;li&gt;有冗余备份
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;双链路热备份&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由于&lt;code&gt;预连接&lt;/code&gt;和&lt;code&gt;数据同步&lt;/code&gt;，AP 启动后会同时向主 AC 和备 AC 发起连接，建立两条&lt;code&gt;独立&lt;/code&gt;CAPWAP 隧道&lt;/li&gt;
&lt;li&gt;主 AC 掉线后，备 AC 会&lt;code&gt;毫秒级切换&lt;/code&gt;，体验无感&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;双链路冷备份&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由于冷备中主 AC 和备 AC 数据是&lt;code&gt;不同步&lt;/code&gt;的，所以主 AC 故障后需要&lt;code&gt;等待&lt;/code&gt;下列流程
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;AP发现AC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;建立隧道&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;完成注册&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;获取配置和用户信息&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;切换&lt;/code&gt;过程会出现短暂几分钟&lt;code&gt;断网&lt;/code&gt;，已&lt;code&gt;连接也会断开&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AC 在旁挂模式和直通模式下，对 AC 设备的要求有什么不同？以及有什么区别？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;直通模式下&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;因为 AC 需要直接处理和转发所有用户数据，所以&lt;code&gt;性能要求要高&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;不易扩展，也不易替换&lt;/code&gt;，如果&lt;code&gt;缺乏冗余备份&lt;/code&gt;替换升级就会断网&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;旁挂模式下&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;AC 主负责&lt;code&gt;控制&lt;/code&gt;，&lt;code&gt;数据转发&lt;/code&gt;由核心交换机完成，所以&lt;code&gt;性能要求低&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;易扩展，可替换&lt;/code&gt;，替换后普通的 PSK 认证和本地转发&lt;code&gt;不受影响&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果开启&lt;code&gt;重认证&lt;/code&gt;或&lt;code&gt;密钥重协商&lt;/code&gt;且&lt;code&gt;依赖AC&lt;/code&gt;；或者开启了需要&lt;code&gt;AC持续交互&lt;/code&gt;的&lt;code&gt;动态带宽调度&lt;/code&gt;，老用户也会断网。&lt;/li&gt;
&lt;li&gt;开启了 802.1 认证且没配&lt;code&gt;逃生功能&lt;/code&gt;，替换设备期间用户认证入网&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;动态路由&lt;a href=&quot;#动态路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;动态路由协议有哪些？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OSPF&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IS-IS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BGP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RIP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EIGRP&lt;/code&gt; （思科&lt;code&gt;私有协议&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;IGRP （思科私有协议，已淘汰）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;那 OSPF 网络类型有哪些？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;广播型Broadcast&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;支持组播&lt;/li&gt;
&lt;li&gt;支持自动发现邻居&lt;/li&gt;
&lt;li&gt;选举 DR/BDR&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;非广播多路访问NBMA&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;不支持组播&lt;/li&gt;
&lt;li&gt;需要手动配邻居&lt;/li&gt;
&lt;li&gt;选举 DR/BDR&lt;/li&gt;
&lt;li&gt;支持帧中继&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;点对点p2p&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;仅两个节点，自动发现邻居&lt;/li&gt;
&lt;li&gt;不选举 DR/BDR&lt;/li&gt;
&lt;li&gt;就像一个 PPP 链路，有一条专线&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;点对多点p2mp&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;一个节点但连接多个节点&lt;/li&gt;
&lt;li&gt;需手动配置邻居&lt;/li&gt;
&lt;li&gt;不选举 DR/BDR&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;虚链路VL&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;逻辑点到点链路&lt;/li&gt;
&lt;li&gt;手动配置邻居&lt;/li&gt;
&lt;li&gt;不选举 DR/BDR&lt;/li&gt;
&lt;li&gt;用于连接非相邻区域 0&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPF 选路依据是什么？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;依据&lt;code&gt;链路状态数据库&lt;/code&gt;计算最短路径树&lt;/li&gt;
&lt;li&gt;比较&lt;code&gt;开销值&lt;/code&gt;，由&lt;code&gt;带宽决定&lt;/code&gt;，带宽&lt;code&gt;越大开销越小&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;路由器触发&lt;code&gt;SPF&lt;/code&gt;算法，以自己为根计算对每个目标网络从根到该网络所有路径&lt;code&gt;总开销&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;建立邻居同步链路数据库就会触发路由器运行 SPF 算法，触发运行一次&lt;/li&gt;
&lt;li&gt;网络拓扑发生变化，路由器同步数据链路库也会再次触发一次 SPF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最终选总&lt;code&gt;开销最小&lt;/code&gt;的路径为&lt;code&gt;最优路由&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果有若干条路径&lt;code&gt;开销相同&lt;/code&gt;，OSPF 会开启&lt;code&gt;负载均衡&lt;/code&gt;，同时使用这些路径&lt;code&gt;转发数据&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPF 的 cost 值影响 ospf 选路时，是根据入接口的 cost 值去影响 OSPF 选路还是出接口的 cost 值去影响 ospf 选路？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;入接口&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么是入接口？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;因为计算时是由&lt;code&gt;本地路由器视角&lt;/code&gt;出发计算的&lt;/li&gt;
&lt;li&gt;路由器只知道&lt;code&gt;自己接口的开销&lt;/code&gt;，当收到邻居发来 LSA 时会把&lt;code&gt;进入&lt;/code&gt;本地路由器的&lt;code&gt;接口&lt;/code&gt;开销加到总开销里。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;那 OSPF 怎么防环路呢？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;区域划分&lt;/code&gt;，规定非骨干区域只能和骨干区域 0 直接通信，避免区域间路由环路&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SPF算法&lt;/code&gt;，每个路由器以自己为根计算最短路径，生成无环流路由表&lt;/li&gt;
&lt;li&gt;路由信息&lt;code&gt;传递规则&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;区域内的LSA只在本区域泛洪&lt;/code&gt;，不会跨区域，避免区域间信息混乱形成环路&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ABR向非骨干区域传递路由时&lt;/code&gt;，会&lt;code&gt;过滤&lt;/code&gt;掉&lt;code&gt;其他骨干区域&lt;/code&gt;的&lt;code&gt;路由信息&lt;/code&gt;，确保非骨干区域&lt;code&gt;只能&lt;/code&gt;通过骨干区域 0&lt;code&gt;获取&lt;/code&gt;其他骨干区域路由&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPF 中 Stub 区域和 NSSA 区域区别是什么？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Stub区域&lt;/code&gt;主要&lt;code&gt;过滤外部LSA&lt;/code&gt;，只&lt;code&gt;允许一条&lt;/code&gt;默认路由进入
&lt;ol&gt;
&lt;li&gt;区域内&lt;code&gt;所有&lt;/code&gt;路由器都必须&lt;code&gt;配置为Stub&lt;/code&gt;，&lt;code&gt;不允许由ASBR&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;NSSA 是 Stub 的&lt;code&gt;扩展&lt;/code&gt;，除了&lt;code&gt;过滤&lt;/code&gt;外部 LSA，还&lt;code&gt;允许&lt;/code&gt;引入本区域的&lt;code&gt;外部路由&lt;/code&gt;，通过&lt;code&gt;Type7 LSA&lt;/code&gt;传播，再在&lt;code&gt;ABR&lt;/code&gt;上转换为&lt;code&gt;Type5 LSA&lt;/code&gt;并传播到其他其余
&lt;ol&gt;
&lt;li&gt;区域内路由器需要&lt;code&gt;配置NSSA&lt;/code&gt;，&lt;code&gt;允许&lt;/code&gt;存在&lt;code&gt;ASBR&lt;/code&gt;，用于&lt;code&gt;引入外部路由&lt;/code&gt;到 OSPF 域&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPF 有几种 LSA，干什么用？&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Type 1&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由&lt;code&gt;所有路由器生成&lt;/code&gt;，仅在&lt;code&gt;本区域&lt;/code&gt;传播&lt;/li&gt;
&lt;li&gt;描述&lt;code&gt;路由器直连链路&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 2&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由&lt;code&gt;DR生成&lt;/code&gt;，仅在&lt;code&gt;本区域&lt;/code&gt;传播&lt;/li&gt;
&lt;li&gt;描述&lt;code&gt;MA网络&lt;/code&gt;中的&lt;code&gt;多播能力&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 3&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由&lt;code&gt;ABR生成&lt;/code&gt;，在&lt;code&gt;整个OSPF&lt;/code&gt;传播&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;区域间路由传递&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 4&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由&lt;code&gt;ABR生成&lt;/code&gt;，在&lt;code&gt;除ASBR&lt;/code&gt;所在区域的&lt;code&gt;整个外部OSPF&lt;/code&gt;传播&lt;/li&gt;
&lt;li&gt;用于发现&lt;code&gt;定位ASBR&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 5&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;ASBR生成&lt;/code&gt;，在&lt;code&gt;整个OSPF&lt;/code&gt;中传播&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;描述外部路由&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 6&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;组播 OSPF 中生成，实际很少使用&lt;/li&gt;
&lt;li&gt;用于描述组播成员关系&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Type 7&lt;/code&gt;
&lt;ol&gt;
&lt;li&gt;由&lt;code&gt;NSSA区域生成&lt;/code&gt;，用于在&lt;code&gt;NSSA区域传播&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用于&lt;code&gt;NSSA区域内传播外部路由&lt;/code&gt;，再由&lt;code&gt;ABR的Type5 LSA&lt;/code&gt;传播到&lt;code&gt;其他区域&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>category:life</category><category>category:面经</category><category>tag:面经</category><category>tag:就业</category></item><item><title>eNSP笔记大全</title><link>https://blog.vull.top/ja/post/study/%E7%BD%91%E5%B7%A5/ensp%E7%AC%94%E8%AE%B0/ensp%E7%AC%94%E8%AE%B0%E5%A4%A7%E5%85%A8</link><guid isPermaLink="false">ja:study/网工/ensp笔记/ensp笔记大全</guid><description>ensp学习笔记</description><pubDate>Tue, 07 Apr 2026 00:15:16 GMT</pubDate><content:encoded>&lt;h2&gt;静态路由配置&lt;a href=&quot;#静态路由配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当不同网段进行跨网段通信时，可以用静态路由配置，但另一端也需同样配置。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ip route-static 192.168.1.0 24 192.168.2.1
ip route-static [目的网络地址] [子网掩码] [下一跳地址/出接口] [优先级] [preference] [tag] [description]
display ip routing-table //查看所有路由器
display ip routing-table protocol static //仅查看静态路由&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;在点对点 p2p 中，最优必选方式就是直接指定出接口
&lt;ul&gt;
&lt;li&gt;在这种链路中，二层特性为：链路两端只有两个设备，无需二层寻址需求（无需 max 地址、arp）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;而在广播型链路（如以太网）直接指定出接口，可能会有缺陷，需要配合下一跳使用
&lt;ul&gt;
&lt;li&gt;二层特性为：链路中有多个设备，多对端，需要二层寻址（ARP 解析 MAC）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;也可以通过配置浮动静态路由的优先级来实现备份&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;主路由（下一跳 10.0.0.2，默认优先级 60）
[Huawei] ip route-static 192.168.4.0 255.255.255.0 10.0.0.2
备份  路由（优先级80，主路由失效时生效）
[Huawei] ip route-static 192.168.4.0 255.255.255.0 10.0.0.3 preference 80&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;TCP UDP CDN&lt;a href=&quot;#tcp-udp-cdn&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TCP 特点：可靠性高、完整性要求高、延迟不敏感
UDP 特点：速度高、不可靠、延迟敏感
CDN 特点：就近分发、加速访问、降本稳服、高可用&lt;/p&gt;
&lt;h2&gt;vlan&lt;a href=&quot;#vlan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;二层 vlan&lt;a href=&quot;#二层-vlan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;vlan 虚拟局域网特点：逻辑分区、隔离安全、灵活组网。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;vlan 1   //创建 vlan
vlan batch 10 to 20 //创建连续 vlan
vlan batch 10 30 50  //创建不连续 vlan
dis vlan  //查看 vlan 信息
port default vlan 10 // 将某接口划分到 vlan 10 下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;连接终端设备采用 Access 模式&lt;/li&gt;
&lt;li&gt;连接交换机路由器等相同类型网络设备采用 Trunk 模式&lt;/li&gt;
&lt;li&gt;需要灵活控制 vlan 进出采用 Hybrid port 混合端口模式&lt;/li&gt;
&lt;li&gt;运营商骨干、跨局域网透传 vlan 需要给 vlan 套一层外层标签避免 vlan id 冲突采用 dot1q-tunnel 模式&lt;/li&gt;
&lt;li&gt;vlan 隔离隔的是故障，连通是连的正常通信&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;三层 vlan&lt;a href=&quot;#三层-vlan&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;三层交换机拥有网络层，具备路由转发功能，既可以隔离也可以通信&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;int vlanif 10
ip add x.x.x.x 掩码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;单臂路由&lt;a href=&quot;#单臂路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;创建子接口来进行路由转发&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;int g0/0/0.10   //子接口 1
int g0/0/0.20  //子接口 2
dot1q termination vid 10   //封装 802.1Q 协议，绑定 vlan10
Ip add 192.168.10.1 24    //配置子接口 1 的 IP，即为 vlan10 的网关
arp broadcast enable   //开启 arp 广播，没有开启 arp 广播则无法通信
int g0/0/0.20
dot1q termination vid 20
ip add xxxx xx   // vlan20 的网关
arp broadcast enable&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ARP 作用就是解析某一个 IP 对应的 MAC 信息&lt;/p&gt;
&lt;h2&gt;ACL 控制&lt;a href=&quot;#acl-控制&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ACL 其实就是创建一个访问控制规则，接着来调用这个规则来使用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;acl  name xxxx
INTEGER&amp;lt;2000-2999&amp;gt;  Basic access-list(add to current using rules)
INTEGER&amp;lt;3000-3999&amp;gt;  Advanced access-list(add to current using rules)
INTEGER&amp;lt;4000-4999&amp;gt;  Specify a L2 acl group
INTEGER&amp;lt;5000-5999&amp;gt;  User defined access-list
advance             Advanced ACL
basic               Basic ACL
link                Link ACL
user                User ACL&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;Basic ACL 基础 ACL 2000-2999&lt;a href=&quot;#basic-acl-基础-acl-2000-2999&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;rule xx 编号 deny / permit source 1.1.1.1 0.0.0.0   //在这里 0.0.0.0 作为反掩码用于精准匹配单个 IP
rule xx permit source any  // 允许其他 ip 流量通过（必加，否则默认拒绝所有）
（rule + 编号 + permit/deny + 源 IP）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;高级 ACL 3000-3999&lt;a href=&quot;#高级-acl-3000-3999&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;acl 3000
rule 10 deny tcp source 1.1.1.1 0.0.0.255 destination 2.2.2.2 0.0.0.0 destination-port eq 21  //添加规则编号 10 拒绝内网 1.1.1.1/24 访问外网 2.2.2.2 的 FTP21 端口服务
rule 20 permit ip source 3.3.3.3 0.0.0.255 destination any  //允许该 ip 段访问所有外网服务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;在这条规则中，TCP 指定拦截的协议（还可以选择 TCP、UDP、ICMP、IP）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;destination-port eq 21&lt;/strong&gt; 匹配目标端口 21，这里 eq 为等于、gt 为大于、lt 为小于&lt;/li&gt;
&lt;li&gt;0.0.0.255 反掩码用于匹配目标网段处于 24 段&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;二层 ACL 4000-4999&lt;a href=&quot;#二层-acl-4000-4999&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;二层 ACL 用于过滤 MAC 和 Vlan&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;acl 4000
rule 10 deny source-mac 00e0-fc12-3456
rule 20 permit souce-mac any  // 允许其他 mac 通过（必加，否则默认拒绝所有）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;ACL 绑定接口应用&lt;a href=&quot;#acl-绑定接口应用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;ACL 创建后需要绑定到接口的方向当中，其中入方向为 in 出方向为 out。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;遵循高级 ACL 靠近目标，基础 ACL 靠近源&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;int g0/0/1
traffic-filter inbound acl 3000
display acl 3000  //检查 acl 配置是否正常
display traffic-filter int g0/0/1  //检查 ACL 应用状态
save      //以防重启丢失保存&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;inbound 过滤接口进入设备的流量，如外网口过滤内网出网流量&lt;/li&gt;
&lt;li&gt;outbound 过滤从设备出接口的流量&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;ACL 注意事项&lt;a href=&quot;#acl-注意事项&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;规则顺序：ACL 规则自上而下匹配，一旦匹配就会停止执行，所以精准 ACL 规则需要在前，宽泛 ALC 规则在后&lt;/li&gt;
&lt;li&gt;默认规则：所有 ACL 最后都需要有一条隐含拒绝所有规则，必须手动添加 permit any 允许除 acl deny 之外的合法流量&lt;/li&gt;
&lt;li&gt;方向选择：比如在内网禁止访问外网的 FTP，ACL 应用在路由器内网出方向或外网入方向，优先选择外网入方向，这样减少无用流量转发。&lt;/li&gt;
&lt;li&gt;高级 ACL 别配错：高级 ACL 若应用在源设备侧，可能会导致其他流量被错误拦截，建议靠近目标设备应用。&lt;/li&gt;
&lt;li&gt;ACL—》加规则---》绑接口&lt;/li&gt;
&lt;li&gt;基础 ACL 控源 ip，高级 ACL 控 IP +协议 + 端口，二层 ACL 控 MAC/Vlan&lt;/li&gt;
&lt;li&gt;规则顺和方向是生效关键，默认拒绝所有需手动允许的合法流量&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;反掩码匹配规则&lt;a href=&quot;#反掩码匹配规则&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&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;0&lt;/td&gt;&lt;td&gt;必须精准匹配（固定位）&lt;/td&gt;&lt;td&gt;网络位（固定位）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;可以任意（忽略位）&lt;/td&gt;&lt;td&gt;主机位（可变位）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;主要用于告诉设备那些需要精准匹配那些可以忽略。&lt;/p&gt;
&lt;h5&gt;精准匹配&lt;a href=&quot;#精准匹配&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;例如：需要精准匹配 192.168.1.100&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;子网验配匹配单个 IP：255.255.255.255 所有位都固定
反掩码则为：255.255.255.255 - 255.255.255.255 = 0.0.0.0
ACL 写法则为：source 192.168.1.100 0.0.0.0
这里含义为 ip 这四个段一个都不能有差异，需完全匹配&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5&gt;网段匹配&lt;a href=&quot;#网段匹配&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;例如：需要匹配 192.168.1.0/24 网段 192.168.1.100~192.168.1.254&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;子网掩码：255.255.255.0 前三段都固定
反掩码则为：255.255.255.255 - 255.255.255.0 = 0.0.0.255
ACL 则：source 192.168.1.0 0.0.0.255&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5&gt;进阶某段固定匹配&lt;a href=&quot;#进阶某段固定匹配&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;例如：需要匹配 192.168.0.0/16 网段：192.168.x.x&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;子网掩码：255.255.0.0
反掩码则为：255.255.255.255 - 255.255.0.0 = 0.0.255.255
ACL 则：source 192.168.0.0 0.0.255.255&lt;/p&gt;
&lt;/blockquote&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;划分网络位 / 主机位&lt;/td&gt;&lt;td&gt;告诉 ACL 哪些 IP 位要匹配&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1 的含义&lt;/td&gt;&lt;td&gt;网络位（固定）&lt;/td&gt;&lt;td&gt;忽略位（随便）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0 的含义&lt;/td&gt;&lt;td&gt;主机位（可变）&lt;/td&gt;&lt;td&gt;匹配位（必须一样）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;计算方式&lt;/td&gt;&lt;td&gt;网络位设 1，主机位设 0&lt;/td&gt;&lt;td&gt;匹配位设  0，忽略位设 1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;NAT&lt;a href=&quot;#nat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;NAT 就是网络地址转换，将内网私有 IP 转换成公网公有 IP，让多台内网设备共用一个公网 IP 上网，还能隐藏内网 IP、节省公网 IP 资源。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 类：10.0.0.0 ~ 10.255.255.255（子网掩码 255.0.0.0）&lt;/li&gt;
&lt;li&gt;B 类：172.16.0.0 ~ 172.31.255.255（子网掩码 255.240.0.0）&lt;/li&gt;
&lt;li&gt;C 类：192.168.0.0 ~ 192.168.255.255（子网掩码 255.255.0.0）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些 IP 不能直接访问公网，必须通过 NAT 转换为公网 IP 才行&lt;/p&gt;
&lt;h3&gt;缺省路由&lt;a href=&quot;#缺省路由&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;IP routing-table 0.0.0.0 0.0.0.0 下一跳地址
特点：没有明确匹配路由时，数据统一转发的 兜底路径&lt;/p&gt;
&lt;h3&gt;NAT 应用&lt;a href=&quot;#nat-应用&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;easy IP&lt;a href=&quot;#easy-ip&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;acl 2000
rule permit source 192.168.1.0 0.0.0.255
假设出接口 g0/0/0
int g0/0/0
nat outbound 2000   //从这个口出去的流量自动做 nat 转换，但是还缺少路
ip route-static 0.0.0.0 0.0.0.0 外网网关 IP  //这就是路，nat 只是创建了门
当没有路由的时候（直连路由、动态路由、其他静态路由）则需要配置”路“则缺省路由告诉设备怎么去外网&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;路由表里没有任何去往外网的路由时，才需要缺省路由兜底&lt;/p&gt;
&lt;h4&gt;地址池 NAT&lt;a href=&quot;#地址池-nat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;acl 2000
rule permit source 192.168.1.0 0.0.0.255
nat address-group 1 （编号） 200.1.1.10 200.1.1.20  //创建 1 号地址池 200.1.1.0~200.1.1.20
int g0/0/0
nat outbound 2000 address-group 1  // 从出网接口出去的地址经 nat 地址池连接外网&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;address-group 1&lt;/strong&gt;：准备一堆公网 IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;acl 2000&lt;/strong&gt;：准备一堆内网 IP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nat outbound 2000 address-group 1&lt;/strong&gt;：内网 → 公网，转换完成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;nat address-group 1 起始 IP 结束 IP
acl 2000 rule permit source 内网网段 反掩码
interface 出口
nat outbound 2000 address-group 1&lt;/p&gt;
&lt;h4&gt;NAT Server&lt;a href=&quot;#nat-server&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;作用：让外网能访问内网的服务器，如摄像头、网站、游戏服务器等&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;int g0/0/0
nat server protocol tcp global 64.1.1.4 www inside 192.168.1.10 www
global 全局外网 ip、inside 内网、www 则为网页意思就是端口 80
nat server global 64.1.1.4 inside 192.168.1.10  // 也可以直接转换不指定协议和端口&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;静态 NAT&lt;a href=&quot;#静态-nat&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;作用：一个内网 IP 永久对应一个公网 IP，永不变&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nat static global 64.1.1.10 inside 192.168.1.10
当内网服务器需要固定公网 ip 时使用，不能变也不能和其他人共用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;NAT ALG&lt;a href=&quot;#nat-alg&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;作用：让一些特殊协议能正常穿越 NAT，如 FTP、SIP 等&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;nat alg ftp enable
当有些协议 NAT 搞不定时，就可用 alg 来解决&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;nat 服务查看&lt;a href=&quot;#nat-服务查看&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;dis nat session all
NAT Session Table Information:
Protocol : UDP(17)
SrcAddr Port Vpn : 192.168.1.1 5120   //源地址
DestAddr Port Vpn : 64.1.1.10 5120   //目标地址
NAT-Info
New SrcAddr : 64.1.1.4  //地址池将内网 ip 转成了这个
New SrcPort : 10259  //转换后的端口
New DestAddr : ----
New DestPort : ----
最终 内网 192.168.1.1 → NAT → 公网 64.1.1.4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Telnet&lt;a href=&quot;#telnet&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;真机 telnet eNSP 中的虚拟机&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;telnet server enable // 开启 telnet 服务
user-interface vty 0 4  //  开启五个连接，0 1 2 3 4 从 0 开始
authentication-mode aaa / password // aaa 需要账号密码，而 password 则只需密码
aaa
[Huawei-aaa]local-user test password cipher 123456 //创建 test 用户密码，cipher 则加密显示
[Huawei-aaa]local-user test privilege level 15   // 为用户 test 配置权限等级，其中 0-15 越大权限越高
[Huawei-aaa]local-user test service-type telnet    //配置 test 用户仅用于 telnet 权限&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;0 级：只能 ping&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1 级：只能看，不能改&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2～14：能配置，权限逐级升高&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 级：拥有设备全部权限&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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;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;0&lt;/td&gt;&lt;td&gt;访问级&lt;/td&gt;&lt;td&gt;最低权限，仅基础网络诊断&lt;/td&gt;&lt;td&gt;ping、tracert&lt;/td&gt;&lt;td&gt;临时测试人员、访客&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;监控级&lt;/td&gt;&lt;td&gt;可查看设备状态，不能配置&lt;/td&gt;&lt;td&gt;display 系列命令（查看版本、接口、日志等）&lt;/td&gt;&lt;td&gt;值班人员、监控人员&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;配置级&lt;/td&gt;&lt;td&gt;可进行部分基础配置&lt;/td&gt;&lt;td&gt;部分简单配置命令&lt;/td&gt;&lt;td&gt;初级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;配置级&lt;/td&gt;&lt;td&gt;可进行更多系统配置&lt;/td&gt;&lt;td&gt;系统基础配置、接口配置&lt;/td&gt;&lt;td&gt;运维人员&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;可管理大部分设备功能&lt;/td&gt;&lt;td&gt;路由、ACL、接口等配置&lt;/td&gt;&lt;td&gt;中级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;权限进一步提升&lt;/td&gt;&lt;td&gt;更多系统管理命令&lt;/td&gt;&lt;td&gt;中级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;可执行更多管理类操作&lt;/td&gt;&lt;td&gt;策略、安全相关部分配置&lt;/td&gt;&lt;td&gt;中高级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;权限接近高级管理员&lt;/td&gt;&lt;td&gt;大部分设备管理命令&lt;/td&gt;&lt;td&gt;中高级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;高级管理权限&lt;/td&gt;&lt;td&gt;可配置大部分安全、系统功能&lt;/td&gt;&lt;td&gt;高级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;管理级&lt;/td&gt;&lt;td&gt;更高管理权限&lt;/td&gt;&lt;td&gt;可配置几乎所有非核心安全项&lt;/td&gt;&lt;td&gt;高级运维&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;特权级&lt;/td&gt;&lt;td&gt;接近最高权限&lt;/td&gt;&lt;td&gt;可配置绝大多数功能&lt;/td&gt;&lt;td&gt;项目负责人、高级工程师&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;特权级&lt;/td&gt;&lt;td&gt;高权限管理&lt;/td&gt;&lt;td&gt;几乎所有配置 + 部分安全管理&lt;/td&gt;&lt;td&gt;高级工程师&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;特权级&lt;/td&gt;&lt;td&gt;高权限管理&lt;/td&gt;&lt;td&gt;可执行大部分系统级操作&lt;/td&gt;&lt;td&gt;高级工程师&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;特权级&lt;/td&gt;&lt;td&gt;接近最高权限&lt;/td&gt;&lt;td&gt;可执行系统级、安全级操作&lt;/td&gt;&lt;td&gt;资深工程师&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;特权级&lt;/td&gt;&lt;td&gt;几乎最高权限&lt;/td&gt;&lt;td&gt;除极少数关键操作外，全部可执行&lt;/td&gt;&lt;td&gt;资深工程师、管理员助理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;最高权限级&lt;/td&gt;&lt;td&gt;设备完全控制权&lt;/td&gt;&lt;td&gt;所有命令：配置、删除、重启、保存、升级、文件管理等&lt;/td&gt;&lt;td&gt;设备管理员、最高权限账号&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;网络拓扑&lt;a href=&quot;#网络拓扑&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;星型拓扑&lt;a href=&quot;#星型拓扑&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：通过中间节点将其他节点连接在一起。
优点：容易新增设备，数据必须经过中心，节点易中转，方便网络监控
缺点：中心节点比较重要，出现问题容易影响整个网络。&lt;/p&gt;
&lt;h3&gt;总线型拓扑&lt;a href=&quot;#总线型拓扑&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：所有节点通过一条总线连接在一起
&lt;strong&gt;已淘汰&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;环形网络&lt;a href=&quot;#环形网络&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：所有节点连成一个换
优点：节省电缆
缺点：不易扩展&lt;/p&gt;
&lt;h3&gt;树形网络&lt;a href=&quot;#树形网络&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：像一棵树一样的层次化的星型结构
缺点：能够快速将多个星型网络连接在一，易拓展
缺点：层级越高的设备出现问题易导致网络瘫痪&lt;/p&gt;
&lt;h3&gt;全网状网络&lt;a href=&quot;#全网状网络&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：所有节点都通过线缆两两连接
优点：具有高可用、高效率通信
缺点：成本高，不易扩展&lt;/p&gt;
&lt;h3&gt;部分网状网络&lt;a href=&quot;#部分网状网络&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：在全网状基础上，只在重要节点之间才两两相连
优点：成本低于全网状
缺点：可靠性比全网状有所降低&lt;/p&gt;
&lt;h3&gt;组合型的网络&lt;a href=&quot;#组合型的网络&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;特点：在上列所有类型的网络组合在一起
优点： 结合优缺点查漏补缺，更好的组网
缺点：较为复杂&lt;/p&gt;
&lt;h2&gt;网络模型&lt;a href=&quot;#网络模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;OSI 模型&lt;a href=&quot;#osi-模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;应用层   ——— 为应用提供网络服务&lt;/li&gt;
&lt;li&gt;表示层   ——— 数据格式化、加密解密&lt;/li&gt;
&lt;li&gt;会话层   ——— 建立、维护、管理会话连接&lt;/li&gt;
&lt;li&gt;传输层   ——— 建立、维护、管理端到端连接&lt;/li&gt;
&lt;li&gt;网络层   ——— IP 寻址和路由选择&lt;/li&gt;
&lt;li&gt;数据链路层  ———— 控制网络层与物理层之间的同行&lt;/li&gt;
&lt;li&gt;物理层   ———比特流传输&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;TCP IP 模型&lt;a href=&quot;#tcp-ip-模型&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在实际应用中一般将上层合并，下两层依旧分开，就成了 TCP IP 模型
TCP/IP 标准模型&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;应用层&lt;/li&gt;
&lt;li&gt;主机到主机层&lt;/li&gt;
&lt;li&gt;英特网层&lt;/li&gt;
&lt;li&gt;网络接入层&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;TCP/IP 对等模型&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;应用层&lt;/li&gt;
&lt;li&gt;传输层&lt;/li&gt;
&lt;li&gt;网络接入层&lt;/li&gt;
&lt;li&gt;数据链路层&lt;/li&gt;
&lt;li&gt;物理层&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/figure&gt;
&lt;h3&gt;各层常见协议&lt;a href=&quot;#各层常见协议&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4&gt;应用层&lt;a href=&quot;#应用层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;HTTP、Telnet、FTP、SMTP、TFTP&lt;/p&gt;
&lt;h4&gt;传输层&lt;a href=&quot;#传输层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;TCP、UDP&lt;/p&gt;
&lt;h4&gt;网络层&lt;a href=&quot;#网络层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;IP、
&lt;strong&gt;IGMP&lt;/strong&gt;：负责 IP 组播成员管理的协议。用于在 IP 主机和其他直接相邻的组播路由器之间建立、维护组播成员关系。
&lt;strong&gt;TCMP&lt;/strong&gt;：基于 IP 协议在网络中发送控制消息，提供可能在同行环境中的各种问题反馈，通过这些信息，使得更换里者可以做出诊断采取措施解决。&lt;/p&gt;
&lt;h4&gt;数据链路层&lt;a href=&quot;#数据链路层&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Ethernet ：以太网协议，一种多路访问广播型数据链路层协议，是当前应用最广泛的协议。
PPP：点对点，用于广域网
PPPoE：Point-to-Point-Protocol over Ethernet 以太网承载 PPP 协议，常见应用如家宽拨号上网&lt;/p&gt;</content:encoded><category>category:study</category><category>category:NE</category><category>category:ensp-notes</category><category>tag:ensp</category><category>tag:笔记</category><category>tag:study</category></item><item><title>自定义关键词示例</title><link>https://blog.vull.top/ja/post/custom-keywords</link><guid isPermaLink="false">ja:custom-keywords</guid><description>展示如何设置文章关键词。</description><pubDate>Sun, 05 Apr 2026 10:43:11 GMT</pubDate><content:encoded>&lt;p&gt;本文展示如何设置文章关键词。&lt;/p&gt;
&lt;h2&gt;frontmatter 关键词设置&lt;a href=&quot;#frontmatter-关键词设置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在文章的 frontmatter 中添加 keywords 字段即可设置关键词：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;我的文章&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;2026-01-01&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;keywords&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;示例关键词一&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - &lt;/span&gt;&lt;span&gt;示例关键词二&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;这是篇带有关键词的文章。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后生成的页面会包含以下 meta 标签：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;keywords&quot;&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;示例关键词一, 示例关键词二, ... site.keywords&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>category:笔记</category><category>tag:教程</category></item><item><title>shoka配置备份</title><link>https://blog.vull.top/ja/post/study/blog/shoka/shoka%E9%85%8D%E7%BD%AE%E5%A4%87%E4%BB%BD</link><guid isPermaLink="false">ja:study/blog/shoka/shoka配置备份</guid><description>shoka配置备份</description><pubDate>Thu, 19 Mar 2026 23:20:56 GMT</pubDate><content:encoded>&lt;p&gt;由于 shoka 姐姐站点出现 loadding 死循环，特此备份 shoka 配置指南&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href=&quot;#%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE&quot;&gt;📌基本配置&lt;/a&gt; - &lt;a href=&quot;#%E7%95%8C%E9%9D%A2%E6%98%BE%E7%A4%BA&quot;&gt;🌈界面显示&lt;/a&gt; - &lt;a href=&quot;#%E7%89%B9%E6%AE%8A%E5%8A%9F%E8%83%BD&quot;&gt;🦄特殊功能&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h1&gt;基本配置&lt;a href=&quot;#基本配置&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;xxxxxxxxxx // hexo-safago Waline 评论区链接处理 - 内联脚本 script.  (function() {    // 从配置中读取白名单    var whitelist = !{JSON.stringify(config.hexo_safego.whitelist.domain_whitelist)};        function isInWhitelist(url) {      return whitelist.some(function(domain) {        return url.indexOf(domain) !== -1;      });    }        function convertLink(link) {      var href = link.getAttribute(&apos;href&apos;);      if (!href || href.startsWith(&apos;/&apos;) || href.startsWith(&apos;mailto:&apos;) || href.startsWith(&apos;tel:&apos;)) {        return;      }            // 检查白名单      if (isInWhitelist(href)) {        return;      }            if (link.dataset.safagoProcessed) {        return;      }            try {        var encodedUrl = btoa(href);        var newHref = &apos;/go.html?u=&apos; + encodedUrl;        link.setAttribute(&apos;href&apos;, newHref);        link.setAttribute(&apos;target&apos;, &apos;_blank&apos;);        link.dataset.safagoProcessed = &apos;true&apos;;      } catch(e) {        console.error(&apos;[safago-inline] Error:&apos;, e);      }    }        function processWalineLinks() {      var links = document.querySelectorAll(&apos;.wl-nick a[href], .wl-card a[href]&apos;);      links.forEach(convertLink);    }        // 初始处理    if (document.readyState === &apos;loading&apos;) {      document.addEventListener(&apos;DOMContentLoaded&apos;, processWalineLinks);    } else {      processWalineLinks();    }        // 延迟处理（备用）    setTimeout(processWalineLinks, 2000);        // 事件委托：在链接被点击时进行转换（最重要）    document.addEventListener(&apos;click&apos;, function(e) {      var link = e.target.closest(&apos;a[href]&apos;);      if (link &amp;amp;&amp;amp; (link.classList.contains(&apos;wl-nick&apos;) || link.closest(&apos;.wl-card&apos;))) {        convertLink(link);      }    }, true);        // PJAX 支持    document.addEventListener(&apos;pjax&lt;div&gt;&lt;/div&gt;&apos;, processWalineLinks);  })();​pug&lt;a href=&quot;#xxxxxxxxxx-hexo-safago-waline-评论区链接处理---内联脚本-script--function----从配置中读取白名单--var-whitelist--jsonstringifyconfighexo_safegowhitelistdomain_whitelist----function-isinwhitelisturl----return-whitelistsomefunctiondomain-----return-urlindexofdomain---1-----------function-convertlinklink----var-href--linkgetattributehref---if-href--hrefstartswith--hrefstartswithmailto--hrefstartswithtel-----return-----------检查白名单---if-isinwhitelisthref-----return----------if-linkdatasetsafagoprocessed-----return----------try-----var-encodedurl--btoahref----var-newhref--gohtmlu--encodedurl----linksetattributehref-newhref----linksetattributetarget-_blank----linkdatasetsafagoprocessed--true-----catche-----consoleerrorsafago-inline-error-e-----------function-processwalinelinks----var-links--documentqueryselectorallwl-nick-ahref-wl-card-ahref---linksforeachconvertlink--------初始处理--if-documentreadystate--loading----documentaddeventlistenerdomcontentloaded-processwalinelinks----else----processwalinelinks--------延迟处理备用--settimeoutprocesswalinelinks-2000-----事件委托在链接被点击时进行转换最重要--documentaddeventlistenerclick-functione----var-link--etargetclosestahref---if-link--linkclasslistcontainswl-nick--linkclosestwl-card-----convertlinklink--------true-----pjax-支持--documentaddeventlistenerpjax-processwalinelinks--pug&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;特殊功能&lt;a href=&quot;#特殊功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;code&gt;links&lt;/code&gt; 链接块&lt;a href=&quot;#links-链接块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本功能参考 NexT，基于 Hexo Tag 功能，用来建立友链或其他网址链接功能。&lt;/p&gt;
&lt;p&gt;文章中的使用格式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;links&lt;/code&gt; 标签块，包围 &lt;code&gt;yml&lt;/code&gt; 语法书写的内容，字段包括&lt;/li&gt;
&lt;/ol&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;code&gt;site&lt;/code&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;code&gt;owner&lt;/code&gt;&lt;/td&gt;&lt;td&gt;管理员名字&lt;/td&gt;&lt;td&gt;可选，默认为 &lt;code&gt;site&lt;/code&gt; 的值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站点链接&lt;/td&gt;&lt;td&gt;必填&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;desc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;cateCards:    - slug: Study      cover: Study/cover.jpg    - slug: Life      cover: Life/cover.jpgyml&lt;/td&gt;&lt;td&gt;可选，默认为 &lt;code&gt;url&lt;/code&gt; 的值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站点图片&lt;/td&gt;&lt;td&gt;可选，默认为 &lt;code&gt;images/404.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;color&lt;/code&gt;&lt;/td&gt;&lt;td&gt;方块颜色&lt;/td&gt;&lt;td&gt;可选，默认为 &lt;code&gt;#666&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% links %​&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#站点名称&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#管理员名字&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#站点网址&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#简短描述&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#一张图片&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#颜色代码&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% endlinks %​&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举个栗子：&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% links %​&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;个人首页&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RPWN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SHARED BY Vullfin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://nav.vull.top/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;assets/nav.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#7ab8ba&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;赞赏主页&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RPWN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://sponsor.vull.top/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SHARED BY Vullfin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;assets/milk.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#e9bcc1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;吃啥好呢？&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RPWN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://eat.vull.top/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SHARED BY Vullfin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;assets/eat.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#FA8072&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;个人主页&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  owner&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;RPWN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  url&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://vull.top/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  desc&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SHARED BY Vullfin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  image&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;assets/home.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;#6097b3&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% endlinks %​&lt;/span&gt;&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&gt;
&lt;a href=&quot;https://nav.vull.top/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;assets/nav.png&quot; alt=&quot;个人首页&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;个人首页&lt;/div&gt;&lt;div&gt;SHARED BY Vullfin&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;a href=&quot;https://sponsor.vull.top/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;assets/milk.png&quot; alt=&quot;赞赏主页&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;赞赏主页&lt;/div&gt;&lt;div&gt;SHARED BY Vullfin&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;a href=&quot;https://eat.vull.top/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;assets/eat.png&quot; alt=&quot;吃啥好呢？&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;吃啥好呢？&lt;/div&gt;&lt;div&gt;SHARED BY Vullfin&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;a href=&quot;https://vull.top/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;assets/home.png&quot; alt=&quot;个人主页&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;div&gt;个人主页&lt;/div&gt;&lt;div&gt;SHARED BY Vullfin&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;以上标签块里的内容，还可以保存到一个 &lt;code&gt;yml&lt;/code&gt; 文件中，然后使用 &lt;code&gt;linksfile&lt;/code&gt; 标签。
其中， &lt;code&gt;path&lt;/code&gt; 位于 &lt;code&gt;&amp;lt;root&amp;gt;/source&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% linksfile&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;] %&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;举个栗子：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;	&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;​% linksfile friends/_data.yml %​&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;code&gt;code&lt;/code&gt; 代码块&lt;a href=&quot;#code-代码块&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;markdown-it-prism&lt;/code&gt; 进行代码高亮，支持显示行号、行高亮 &lt;code&gt;mark&lt;/code&gt; 、命令行提示符 &lt;code&gt;command&lt;/code&gt; 、代码块标题。&lt;/p&gt;
&lt;p&gt;基本格式： &lt;code&gt;[language] [title] [url] [link text] [mark] [command]&lt;/code&gt;&lt;/p&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;language&lt;/td&gt;&lt;td&gt;支持的语言戳此如果不需要代码高亮，但希望显示代码块样式，则设为 &lt;code&gt;raw&lt;/code&gt;留空或设为 &lt;code&gt;info&lt;/code&gt; ，将不显示代码高亮和代码块样式&lt;/td&gt;&lt;td&gt;null&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;title&lt;/td&gt;&lt;td&gt;代码块的标题文字&lt;/td&gt;&lt;td&gt;null&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;url&lt;/td&gt;&lt;td&gt;代码块标题右侧显示的链接&lt;/td&gt;&lt;td&gt;null&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;link text&lt;/td&gt;&lt;td&gt;上述链接显示的标题&lt;/td&gt;&lt;td&gt;link&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mark&lt;/td&gt;&lt;td&gt;行高亮显示，格式为 &lt;code&gt;mark:行号,行号开始-行号结束,其他行号&lt;/code&gt; 。 例如 &lt;code&gt;mark:1,4-7,10&lt;/code&gt; ，将高亮显示第 1、4、5、6、7、10 行&lt;/td&gt;&lt;td&gt;null&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;command&lt;/td&gt;&lt;td&gt;命令行提示符，格式为 `command:(&quot;提示内容&quot;&lt;div&gt;&lt;/div&gt;,行号&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;java 行高亮 https://shoka.lostyu.me 参考链接 mark:1,6-7&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import java.util.Scanner;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Scanner in = new Scanner (System.in);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 输入 Scan 之后，按下键盘 Alt + “/” 键，Eclipse 下自动补全。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;System.out.println (in.nextLine ());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;System.out.println (&quot;Hello&quot; + &quot;world.&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;bash 命令行提示符 command:(&quot;[root@localhost] $&quot;:1,9-10||&quot;[admin@remotehost]&lt;/span&gt;&lt;span&gt; #&quot;:4-6)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/usr/home/chris/bin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls -la&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;total 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;drwxr-xr-x   2 chris  chris     11 Jan 10 16:48 .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;drwxr--r-x  45 chris  chris     92 Feb 14 11:10 ..&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-rwxr-xr-x   1 chris  chris    444 Aug 25  2013 backup&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-rwxr-xr-x   1 chris  chris    642 Jan 17 14:42 deploy&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git add -A&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git commit -m &quot;update&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git push&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; java.util.Scanner;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Scanner in &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Scanner&lt;/span&gt;&lt;span&gt; (System.in);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 输入 Scan 之后，按下键盘 Alt + “/” 键，Eclipse 下自动补全。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;System.out.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt; (in.&lt;/span&gt;&lt;span&gt;nextLine&lt;/span&gt;&lt;span&gt; ());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;System.out.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&quot;Hello&quot;&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; &quot;world.&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pwd&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/usr/home/chris/bin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; -la&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;drwxr-xr-x&lt;/span&gt;&lt;span&gt;   2&lt;/span&gt;&lt;span&gt; chris&lt;/span&gt;&lt;span&gt;  chris&lt;/span&gt;&lt;span&gt;     11&lt;/span&gt;&lt;span&gt; Jan&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt; 16:48&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;drwxr--r-x&lt;/span&gt;&lt;span&gt;  45&lt;/span&gt;&lt;span&gt; chris&lt;/span&gt;&lt;span&gt;  chris&lt;/span&gt;&lt;span&gt;     92&lt;/span&gt;&lt;span&gt; Feb&lt;/span&gt;&lt;span&gt; 14&lt;/span&gt;&lt;span&gt; 11:10&lt;/span&gt;&lt;span&gt; ..&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-rwxr-xr-x&lt;/span&gt;&lt;span&gt;   1&lt;/span&gt;&lt;span&gt; chris&lt;/span&gt;&lt;span&gt;  chris&lt;/span&gt;&lt;span&gt;    444&lt;/span&gt;&lt;span&gt; Aug&lt;/span&gt;&lt;span&gt; 25&lt;/span&gt;&lt;span&gt;  2013&lt;/span&gt;&lt;span&gt; backup&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-rwxr-xr-x&lt;/span&gt;&lt;span&gt;   1&lt;/span&gt;&lt;span&gt; chris&lt;/span&gt;&lt;span&gt;  chris&lt;/span&gt;&lt;span&gt;    642&lt;/span&gt;&lt;span&gt; Jan&lt;/span&gt;&lt;span&gt; 17&lt;/span&gt;&lt;span&gt; 14:42&lt;/span&gt;&lt;span&gt; deploy&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; -A&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; commit&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; &quot;update&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;&lt;code&gt;quiz&lt;/code&gt; 练习题与答案&lt;a href=&quot;#quiz-练习题与答案&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个功能是用来显示练习题的。
需要在 Front Matter 中添加 &lt;code&gt;quiz: true&lt;/code&gt; ，以正确显示题型标签。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title: 练习题与答案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;quiz: true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. 编译时多态主要指运算符重载与函数重载，而运行时多态主要指虚函数。 {.quiz .true}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. 有基类 `SHAPE`，派生类 `CIRCLE`，声明如下变量：  {.quiz .multi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ```cpp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    SHAPE shape1,*p1;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    CIRCLE circle1,*q1;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;plain 下列哪些项是 “派生类对象替换基类对象”。
- &lt;code&gt;p1=&amp;amp;circle1;&lt;/code&gt; {.correct}
- &lt;code&gt;q1=&amp;amp;shape1;&lt;/code&gt;
- &lt;code&gt;shape1=circle1;&lt;/code&gt; {.correct}
- &lt;code&gt;circle1=shape1;&lt;/code&gt;
{.options}
&amp;gt; - :heavy_check_mark: 令基类对象的指针指向派生类对象
&amp;gt; - :x: 派生类指针指向基类的引用
&amp;gt; - :heavy_check_mark: 派生类对象给基类对象赋值
&amp;gt; - :x: 基类对象给派生类对象赋值
&amp;gt; {.options}
3. 下列叙述正确的是 &lt;span&gt;&lt;/span&gt; 。 {.quiz}
- 虚函数只能定义成无参函数
- 虚函数不能有返回值
- 能定义虚构造函数
- A、B、C 都不对 {.correct}
{.options}&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;title: 练习题与答案&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;quiz: true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1. 编译时多态主要指运算符重载与函数重载，而运行时多态主要指虚函数。 {.quiz .true}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. 有基类 `SHAPE`，派生类 `CIRCLE`，声明如下变量：  {.quiz .multi}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ```cpp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    SHAPE shape1,*p1;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    CIRCLE circle1,*q1;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;plain 下列哪些项是 “派生类对象替换基类对象”。
- &lt;code&gt;p1=&amp;amp;circle1;&lt;/code&gt; {.correct}
- &lt;code&gt;q1=&amp;amp;shape1;&lt;/code&gt;
- &lt;code&gt;shape1=circle1;&lt;/code&gt; {.correct}
- &lt;code&gt;circle1=shape1;&lt;/code&gt;
{.options}
&amp;gt; - :heavy_check_mark: 令基类对象的指针指向派生类对象
&amp;gt; - :x: 派生类指针指向基类的引用
&amp;gt; - :heavy_check_mark: 派生类对象给基类对象赋值
&amp;gt; - :x: 基类对象给派生类对象赋值
&amp;gt; {.options}
3. 下列叙述正确的是 &lt;span&gt;&lt;/span&gt; 。 {.quiz}
- 虚函数只能定义成无参函数
- 虚函数不能有返回值
- 能定义虚构造函数
- A、B、C 都不对 {.correct}
{.options}&lt;/p&gt;
&lt;p&gt;行内公式：&lt;span&gt;&lt;span&gt;E=mc2E = mc^2&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;块级公式：&lt;/p&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;∫−∞∞e−x2dx=π\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∫&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;∑n=1∞1n2=π26\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;∑&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;∞&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;π&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;:::default&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;默认默认&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::primary&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;基本基本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::info&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;提示提示&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::success&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;成功成功&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::warning&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;警告警告&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;危险危险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::danger no-icon&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;危险危险&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;:::&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>category:study</category><category>category:shoka</category><category>tag:shoka</category></item><item><title>safago插件优化</title><link>https://blog.vull.top/ja/post/study/blog/safago%E6%8F%92%E4%BB%B6%E4%BC%98%E5%8C%96</link><guid isPermaLink="false">ja:study/blog/safago插件优化</guid><description>解决safego插件无法抓取waline评论链接</description><pubDate>Thu, 19 Mar 2026 21:12:04 GMT</pubDate><content:encoded>&lt;h1&gt;hexo-safego&lt;a href=&quot;#hexo-safego&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/willow-god/hexo-safego&quot;&gt;开源地址&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; hexo-safego&lt;/span&gt;&lt;span&gt; --save&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;无法抓取 waline 评论区链接&lt;a href=&quot;#无法抓取-waline-评论区链接&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;++ 增加内联 pug&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// hexo-safago Waline评论区链接处理 - 内联脚本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  (&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // 从配置中读取白名单&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    var&lt;/span&gt;&lt;span&gt; whitelist &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;{JSON.stringify(config.hexo_safego.whitelist.domain_whitelist)};&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    function&lt;/span&gt;&lt;span&gt; isInWhitelist&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      return&lt;/span&gt;&lt;span&gt; whitelist.&lt;/span&gt;&lt;span&gt;some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; url.&lt;/span&gt;&lt;span&gt;indexOf&lt;/span&gt;&lt;span&gt;(domain) &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    function&lt;/span&gt;&lt;span&gt; convertLink&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      var&lt;/span&gt;&lt;span&gt; href &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; link.&lt;/span&gt;&lt;span&gt;getAttribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;href&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;href &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; href.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; href.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;mailto:&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; href.&lt;/span&gt;&lt;span&gt;startsWith&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;tel:&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // 检查白名单&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;isInWhitelist&lt;/span&gt;&lt;span&gt;(href)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt; (link.dataset.safagoProcessed) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        var&lt;/span&gt;&lt;span&gt; encodedUrl &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; btoa&lt;/span&gt;&lt;span&gt;(href);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        var&lt;/span&gt;&lt;span&gt; newHref &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;/go.html?u=&apos;&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; encodedUrl;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        link.&lt;/span&gt;&lt;span&gt;setAttribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;href&apos;&lt;/span&gt;&lt;span&gt;, newHref);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        link.&lt;/span&gt;&lt;span&gt;setAttribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;target&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;_blank&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        link.dataset.safagoProcessed &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;true&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      } &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;(e) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        console.&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;[safago-inline] Error:&apos;&lt;/span&gt;&lt;span&gt;, e);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    function&lt;/span&gt;&lt;span&gt; processWalineLinks&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      var&lt;/span&gt;&lt;span&gt; links &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; document.&lt;/span&gt;&lt;span&gt;querySelectorAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;.wl-nick a[href], .wl-card a[href]&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      links.&lt;/span&gt;&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;(convertLink);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // 初始处理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (document.readyState &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;loading&apos;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      document.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;DOMContentLoaded&apos;&lt;/span&gt;&lt;span&gt;, processWalineLinks);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    } &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      processWalineLinks&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // 延迟处理（备用）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    setTimeout&lt;/span&gt;&lt;span&gt;(processWalineLinks, &lt;/span&gt;&lt;span&gt;2000&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // 事件委托：在链接被点击时进行转换（最重要）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    document.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;click&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      var&lt;/span&gt;&lt;span&gt; link &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; e.target.&lt;/span&gt;&lt;span&gt;closest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;a[href]&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt; (link &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (link.classList.&lt;/span&gt;&lt;span&gt;contains&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;wl-nick&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; link.&lt;/span&gt;&lt;span&gt;closest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;.wl-card&apos;&lt;/span&gt;&lt;span&gt;))) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        convertLink&lt;/span&gt;&lt;span&gt;(link);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }, &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // PJAX支持&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    document.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;pjax:complete&apos;&lt;/span&gt;&lt;span&gt;, processWalineLinks);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  })();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded><category>category:study</category><category>category:blog</category><category>tag:blog</category><category>tag:safego</category><category>tag:hexo</category></item><item><title>shokaX迁移避坑指南</title><link>https://blog.vull.top/ja/post/study/blog/shoka/shokax%E8%BF%81%E7%A7%BB%E9%81%BF%E5%9D%91%E6%8C%87%E5%8D%97</link><guid isPermaLink="false">ja:study/blog/shoka/shokax迁移避坑指南</guid><description>ShokaX主题避坑指南</description><pubDate>Thu, 19 Mar 2026 12:29:58 GMT</pubDate><content:encoded>&lt;h1&gt;不蒜子统计无法居中&lt;a href=&quot;#不蒜子统计无法居中&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;1.通过 pnpm 安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; hexo-shokax-busuanzi&lt;/span&gt;&lt;span&gt; --save&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.增加自定义 CSS&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;位于博客根目录 source_data 下创建 custom.styl&lt;/p&gt;
&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;/* 一些自定义样式 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/* 修复 busuanzi 不居中的问题 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#busuanzi-wrap&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  width: 100% !important&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  text-align&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;center&lt;/span&gt;&lt;span&gt; !important&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  display: block !important&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;hexo-shokax-create-time&lt;a href=&quot;#hexo-shokax-create-time&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;p&gt;使用 github 内置的 readme 教程安装&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;重点：还需要再主题目录下的 config.yml 中配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;createTime:&lt;/span&gt;&lt;span&gt; &quot;2026/01/01 00:00:00&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;hexo-renderer-aether&lt;a href=&quot;#hexo-renderer-aether&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;div&gt;
&lt;p&gt;由于新版代码块渲染插件尚未支持展开和收起功能，导致如果长代码块影响预览，额外增加外部收起展开按钮。&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;增加：\themes\Shokax\scripts\generaters\code-collapse.js&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&apos;use strict&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; fs&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;fs&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;path&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;hexo.extend.generator.&lt;/span&gt;&lt;span&gt;register&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;code-collapse&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;locals&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; sourceFile&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; path.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(hexo.source_dir, &lt;/span&gt;&lt;span&gt;&apos;_data&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;code-collapse.js&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; destPath&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;code-collapse.js&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // 检查源文件是否存在&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;fs.&lt;/span&gt;&lt;span&gt;existsSync&lt;/span&gt;&lt;span&gt;(sourceFile)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // 读取文件内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  const&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; fs.&lt;/span&gt;&lt;span&gt;readFileSync&lt;/span&gt;&lt;span&gt;(sourceFile, &lt;/span&gt;&lt;span&gt;&apos;utf8&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  return&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    path: destPath,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    data: content&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;末尾增加：\themes\Shokax\layout_partials\head\head_com.pug&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// 在代码尾部增加&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 代码块折叠功能脚本&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;url_for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/code-collapse.js&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;defer&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;增加样式：\source_data\custom.styl&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;/* 代码块折叠功能 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;.code-block-wrapper&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  position: relative&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  margin: 1rem 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  border-radius&lt;/span&gt;&lt;span&gt;: 0&lt;/span&gt;&lt;span&gt;.25rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;.collapsed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;amp;&lt;/span&gt;&lt;span&gt;::after&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      content&lt;/span&gt;&lt;span&gt;: &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      position: absolute&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      bottom: 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      left: 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      right: 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      height: 3rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      background: linear-gradient(transparent, rgba(0, 0, 0, 0&lt;/span&gt;&lt;span&gt;.3&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      pointer-events&lt;/span&gt;&lt;span&gt;: none&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      border-radius&lt;/span&gt;&lt;span&gt;: 0 0 0&lt;/span&gt;&lt;span&gt;.25rem&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;.25rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/* 折叠按钮 - 在代码块右上角 */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;.code-toggle-btn-corner&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  position: absolute&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  top: 0&lt;/span&gt;&lt;span&gt;.5rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  right: 2&lt;/span&gt;&lt;span&gt;.5rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  background: rgba(0, 0, 0, 0&lt;/span&gt;&lt;span&gt;.4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  border: 1px solid rgba(255, 255, 255, 0&lt;/span&gt;&lt;span&gt;.3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  color: &lt;/span&gt;&lt;span&gt;#fff&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  padding: 0&lt;/span&gt;&lt;span&gt;.35rem&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;.5rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  border-radius&lt;/span&gt;&lt;span&gt;: 0&lt;/span&gt;&lt;span&gt;.2rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cursor&lt;/span&gt;&lt;span&gt;: pointer&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  font-size&lt;/span&gt;&lt;span&gt;: 0&lt;/span&gt;&lt;span&gt;.85rem&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  font-weight&lt;/span&gt;&lt;span&gt;: bold&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  transition: all 0&lt;/span&gt;&lt;span&gt;.2s&lt;/span&gt;&lt;span&gt; ease&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  z-index&lt;/span&gt;&lt;span&gt;: 10&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  line-height&lt;/span&gt;&lt;span&gt;: 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;:hover&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    background: rgba(0, 0, 0, 0&lt;/span&gt;&lt;span&gt;.6&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    border-color&lt;/span&gt;&lt;span&gt;: rgba(255, 255, 255, 0&lt;/span&gt;&lt;span&gt;.5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;:active&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    transform: scale(0&lt;/span&gt;&lt;span&gt;.95&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;cateCards 首页精选分页&lt;a href=&quot;#catecards-首页精选分页&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;由于这是升级版的 shoka,所以它不能像原版 shoka 直接在分类目录下创建 cover.jpg 就可以了&lt;/li&gt;
&lt;li&gt;主题根目录&lt;strong&gt;config.yml&lt;/strong&gt;配置参考如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;  cateCards&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Study&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      cover&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Study/cover.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    - &lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Life&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      cover&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Life/cover.jpg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>category:study</category><category>category:shokaX</category><category>tag:shokaX</category><category>tag:网站搭建</category></item><item><title>🔒 加密文章演示</title><link>https://blog.vull.top/ja/post/note/encrypted-post-demo</link><guid isPermaLink="false">ja:note/encrypted-post-demo</guid><description>この記事は暗号化されています。ウェブサイトでご覧ください。</description><pubDate>Mon, 16 Feb 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;この記事は暗号化されています。ウェブサイトでご覧ください。&lt;/p&gt;</content:encoded><category>category:笔记</category><category>tag:加密</category><category>tag:测试</category></item></channel></rss>