<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Ain\'t no moon?</title><link>https://anemone.moe/</link><description>Recent content in Home on Ain\'t no moon?</description><generator>Hugo</generator><language>zh-cn</language><managingEditor>fermata@h2o.moe (fermata)</managingEditor><webMaster>fermata@h2o.moe (fermata)</webMaster><copyright>© f3rmata following CC BY-NC-SA 4.0</copyright><lastBuildDate>Thu, 06 Mar 2025 13:30:49 +0800</lastBuildDate><atom:link href="https://anemone.moe/index.xml" rel="self" type="application/rss+xml"/><item><title>GNU/Linux 的简单启动流程</title><link>https://anemone.moe/posts/booting-an-operating-system/</link><pubDate>Thu, 06 Mar 2025 13:30:49 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/booting-an-operating-system/</guid><description>&lt;h2 id="disclamer"&gt;Disclamer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;由于我个人才疏学浅，讲义中的内容可能含有大量错误，如果你发现了哪里有不对的地方，请直接联系我。&lt;/li&gt;
&lt;li&gt;讲义中的内容&lt;strong&gt;大量&lt;/strong&gt;参考了 Linux 文档，维基百科以及一些教科书。&lt;/li&gt;
&lt;li&gt;可能这些内容对&lt;strong&gt;应试方面没有任何帮助&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="操作系统是如何启动的"&gt;操作系统是如何启动的&lt;/h2&gt;
&lt;p&gt;在游戏《Slay the Spire》中有这样一个角色：&lt;br&gt;
他拥有一个庞大的卡组，卡组中的每一部分都可以是不可或缺的存在。他的卡往往需要七八个回合才能完成“启动”，常被誉为和“大头”比启动的角色。。。&lt;/p&gt;
&lt;p&gt;&lt;img src="image.png" alt="chicken booting"&gt;&lt;/p&gt;
&lt;p&gt;咳咳，让我们回到正题。&lt;br&gt;
在现实生活中，一个计算机也往往需要多个阶段才能完成启动，这些阶段往往取决于你的计算机的架构（如 x86, mips, arm64 等）和你所使用的操作系统的设计。
但如果你以一个更高的视角来看的话，我们可以将这些操作系统的启动流程分为 4 个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引导阶段 - Stage 1 &amp;ndash; UEFI/BIOS&lt;/li&gt;
&lt;li&gt;启动阶段 - Stage 2 &amp;ndash; Bootloader -&amp;gt; Grub/Windows 启动管理器等&lt;/li&gt;
&lt;li&gt;内核启动 - Stage 3 &amp;ndash; kernel stage -&amp;gt; initramfs/vmlinuz&amp;hellip;&lt;/li&gt;
&lt;li&gt;应用启动 - Stage 4 &amp;ndash; system applications -&amp;gt; init&amp;hellip;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果用一句话来概括的话，就是从简单到复杂，从小到大，一步步搭建出了一个完整的操作系统环境。&lt;/p&gt;
&lt;h2 id="stage1"&gt;Stage1&lt;/h2&gt;
&lt;p&gt;Stage1 的程序往往非常小，负责的功能也非常简单，他们常常是由电脑厂商或者主板厂商编写。
并放置在一块很小的 ROM (Read Only Memory) 上。每当计算机启动或者重置时，CPU 都会固定引导执行这块区域的代码。&lt;/p&gt;
&lt;p&gt;这段代码会去执行一些系统自检（POST），初始化外设等操作，
在这之后，若系统没有问题，则会将磁盘（USB，CD，在以前也可以是软盘）中指定的一块区域内的代码加载到内存中执行，进入启动的第二阶段。&lt;/p&gt;
&lt;p&gt;在现代的 x86/x86_64 系统上，这段固件程序往往被称为 BIOS/UEFI 接口。
BIOS 规范最早可以追溯到 1981 年的 IBM PC 上，
而 UEFI 则最早可以追塞到 1990 年 Intel 针对 BIOS 的设计限制所做的一个优化后的实现。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BIOS - Basic Input/Output System&lt;br&gt;
UEFI - Unified Extensible Firmware Interface&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="image-2.png" alt="bios"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="image-3.png" alt="asus uefi"&gt;&lt;/p&gt;
&lt;p&gt;不同于现代 PC ，历史上的 BIOS 有着至关重要的作用，
所以很多旧操作系统（MS-DOS）常常非常依赖 BIOS 的接口配置（键盘中断，磁盘 I/O 等），
但是现代的操作系统为了提供更加高级的功能并且提高系统的兼容性，
往往在后续启动的阶段中就用自己的实现替换了 BIOS 提供的一些中断设置和 IO 接口配置。
而且在现代的 UEFI 设置中，除去最基本的配置启动项顺序/位置以外，很多厂家还添加了包括电脑 CPU/RAM 性能监测，超频， 安全启动签名等功能。&lt;/p&gt;
&lt;!--
如果常看 B 站维修电脑的视频的话，大家或许也会对 “刷 BIOS” 这个词比较熟悉，
那什么是 “刷 BIOS” 呢？ 为什么要 “刷 BIOS” 呢？ 

简而言之，刷 BIOS 其实就是修改储存 BIOS 程序的芯片里的内容。
（以前的电脑用的是 ROM 储存，但是现在很多的硬件厂家为了能后期更改 BIOS 而将其储存在了一块 flash/eeprom 中）
通过刷写 BIOS，就能绕过很多厂商对于硬件型号，设备编号等的限制，从而使得电脑硬件能够继续启动。

但事实上，大部分的电脑都已经在使用 UEFI 接口了，所以“刷 BIOS”这个名称其实也不是那么准确。 
--&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips&lt;br&gt;
传统的 BIOS 使用的是 MBR 分区表，而现代的 UEFI 使用的是 GPT 分区表。&lt;br&gt;
什么是分区表？ 这两者又有什么区别？&lt;br&gt;
大家可以上网搜索了解一下，答案会在后续（可能的）文件系统课中揭晓。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="stage2"&gt;Stage2&lt;/h2&gt;
&lt;p&gt;细心的同学可能已经发现了，我们在上一个 Stage 中指定了一段代码，而这段代码是什么呢？&lt;br&gt;
答案也很显而易见，这段代码就是我们的操作系统特定的启动程序，也常被称为 Bootloader。&lt;/p&gt;
&lt;p&gt;以 x86/x86_64 架构为例，在加载 Bootloader 的时候又会分为两个阶段，第一个阶段会加载硬件供应商特定的代码和一个&lt;strong&gt;分区表&lt;/strong&gt;，
这个分区表会告诉 Bootloader 当前计算机的分区情况，
从而让他能够去硬盘中找到分区中储存的操作系统内核，并将操作系统内核的&lt;strong&gt;压缩文件&lt;/strong&gt;加载到内存中。&lt;/p&gt;
&lt;p&gt;如果大家还记得之前安装系统的详细步骤的话，那应该会对给磁盘分区这一步比较熟悉。&lt;br&gt;
常见的 EFI 分区方案是这样的:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Device Start End Sectors Size Type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/nvme0n1p1 &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4196351&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4194304&lt;/span&gt; 2G EFI System
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/nvme0n1p2 &lt;span style="color:#ae81ff"&gt;4196352&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;71305215&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;67108864&lt;/span&gt; 32G Linux swap
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/dev/nvme0n1p3 &lt;span style="color:#ae81ff"&gt;71305216&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3292530687&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3221225472&lt;/span&gt; 1.5T Linux filesystem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;EFI (Extensible Firmware Interface) 是 UEFI 的一个规范，
他规定了在硬盘的第一个 efi 标签的 VFAT 文件系统的分区中存放系统启动所需的文件，
这里也就是我们所说的 Bootloader。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;传统上，内核位于文件系统层次结构的根目录中;&lt;br&gt;
然而，由于 bootloader 必须使用 BIOS 驱动程序来访问硬盘，
因此某些 i386 系统的限制意味着只有硬盘的前 1024 个柱面是可寻址的。&lt;/p&gt;
&lt;p&gt;为了克服这个问题，Linux 鼓励用户在驱动器的开头创建一个分区，
专门用于存储引导加载程序和内核相关文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们以 Linux 下最常用的 GRUB - GNU GRand Unified Bootloader 为例。&lt;br&gt;
当你正确配置完 grub 之后，你的 efi 分区里的内容应该大概是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/efi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── EFI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── gentoo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── grubx64.efi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而在 Boot 目录下，我们可以看到 grub 引导的剩余文件（此处省略了部分内容）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/boot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── amd-uc.img
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── config-6.10.12-gentoo-dist
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── grub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── grub.cfg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── x86_64-efi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── normal.mod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── initramfs-6.10.12-gentoo-dist.img
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── System.map-6.10.12-gentoo-dist
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── vmlinuz-6.10.12-gentoo-dist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GRUB 提供了一个菜单，用户可以在其中从 grub-install 找到的操作系统中进行选择。
选择引导选项后，GRUB 会将选定的内核加载到内存中，并将控制权传递给内核。&lt;br&gt;
或者，GRUB 可以使用链式加载将引导进程的控制权传递给另一个引导加载程序。
是的， grub 在打开 os-prober 之后是可以引导 windows 甚至其他操作系统的。&lt;/p&gt;
&lt;p&gt;Ok，那接下来我们就来看看 BIOS 是如何把一个 GNU/Linux 系统拉起来的把。&lt;/p&gt;
&lt;p&gt;首先，grub 会加载 vmlinuz（压缩的 Linux 内核）到内存。
之后，如果系统需要 initramfs，引导程序会同时将 initramfs（初始内存文件系统）加载到内存，并将其地址传递给内核。&lt;/p&gt;
&lt;p&gt;&lt;img src="image-4.png" alt="grub"&gt;&lt;/p&gt;
&lt;h3 id="vmlinuz"&gt;vmlinuz&lt;/h3&gt;
&lt;p&gt;&lt;img src="image-1.png" alt="boot process"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Notes&lt;br&gt;
vmlinux 是一个&lt;strong&gt;静态链接&lt;/strong&gt;的可执行文件，它包含 Linux 支持的一种对象文件格式的 Linux 内核，
但必须通过添加多重引导头、引导扇区和安装例程，在将其用作作系统内核之前使其可引导。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当你在 grub 中选中 Linux 的系统启动项时，
grub 就会将选中的 &lt;code&gt;vmlinuz&lt;/code&gt; &lt;strong&gt;解压&lt;/strong&gt;并加载到内存中，并初始化核心子系统（如调度器、内存管理）。&lt;br&gt;
在这个阶段结束后，内核会尝试加载临时根文件系统（initrd/initramfs）。
&lt;strong&gt;注意，此时内核还没有加载完整的磁盘和文件系统驱动。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在以前，UNIX 平台将内核映像称为 /unix。
随着虚拟内存的发展，支持此功能的内核被赋予了 vm- 前缀以区分它们。
名称 vmlinux 是 vmunix 的变体，而在 vmlinuz 中，末尾的字母 z 表示它是压缩的（例如 gzip）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ file /boot/vmlinuz-6.10.12-gentoo-dist
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/boot/vmlinuz-6.10.12-gentoo-dist: Linux kernel x86 boot executable bzImage, version 6.10.12-gentoo-dist &lt;span style="color:#f92672"&gt;(&lt;/span&gt;portage@localhost&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#75715e"&gt;#1 SMP PREEMPT_DYNAMIC Thu Oct 3 18:59:52 CST 2024, RO-rootFS, swap_dev 0X12, Normal VGA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ strings vmlinux | grep &lt;span style="color:#e6db74"&gt;&amp;#34;\&amp;lt;sbin\&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/reboot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/request-key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/cpuset_release_agent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/sbin:/bin:/usr/sbin:/usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PATH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/sbin:/usr/sbin:/bin:/usr/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/poweroff
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/sbin/modprobe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ readelf -h vmlinux 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ELF Header:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Magic: 7f &lt;span style="color:#ae81ff"&gt;45&lt;/span&gt; 4c &lt;span style="color:#ae81ff"&gt;46&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;00&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Class: ELF64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Data: 2&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s complement, little endian
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Version: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;current&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; OS/ABI: UNIX - System V
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ABI Version: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Type: EXEC &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Executable file&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Machine: Advanced Micro Devices X86-64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Version: 0x1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Entry point address: 0x100007a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Start of program headers: &lt;span style="color:#ae81ff"&gt;64&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bytes into file&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Start of section headers: &lt;span style="color:#ae81ff"&gt;458719896&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bytes into file&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Flags: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Size of this header: &lt;span style="color:#ae81ff"&gt;64&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bytes&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Size of program headers: &lt;span style="color:#ae81ff"&gt;56&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bytes&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Number of program headers: &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Size of section headers: &lt;span style="color:#ae81ff"&gt;64&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt;bytes&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Number of section headers: &lt;span style="color:#ae81ff"&gt;54&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Section header string table index: &lt;span style="color:#ae81ff"&gt;53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# From https://www.kernel.org/doc/html/latest/arch/x86/boot.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ~ ~
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Protected-mode kernel |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;100000&lt;/span&gt; +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | I/O memory hole |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0A0000 +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Reserved &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; BIOS | Leave as much as possible unused
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ~ ~
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Command line | &lt;span style="color:#f92672"&gt;(&lt;/span&gt;Can also be below the X+10000 mark&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X+10000 +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Stack/heap | For use by the kernel real-mode code.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X+08000 +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Kernel setup | The kernel real-mode code.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Kernel boot sector | The kernel legacy boot sector.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Boot loader | &amp;lt;- Boot sector entry point 0000:7C00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;001000&lt;/span&gt; +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Reserved &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; MBR/BIOS |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;000800&lt;/span&gt; +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | Typically used by MBR |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;000600&lt;/span&gt; +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | BIOS use only |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;000000&lt;/span&gt; +------------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;... where the address X is as low as the design of the boot loader permits.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="systemmap"&gt;System.map&lt;/h3&gt;
&lt;p&gt;在 Linux 中，System.map 文件是内核使用的符号表。&lt;br&gt;
由于地址可能会因一个版本而异，因此会为内核的每个版本生成一个新的 System.map。&lt;/p&gt;
&lt;p&gt;因此， Linux 内核的编译流程是 Source code &amp;ndash;compiling&amp;ndash;&amp;gt; vmlinux
&amp;ndash;stripping/compressing&amp;ndash;&amp;gt; System.map &amp;amp;&amp;amp; vmlinuz&lt;/p&gt;
&lt;p&gt;在内核中，由于所有函数都是以地址引用的，所以 Linux 内核本身不会使用符号名，但是对于有些其他的程序，
如果没有符号名的话，产生的输出往往会有很大的错误，会给内核调试带来很大的麻烦。&lt;/p&gt;
&lt;h3 id="initrdinitramfs"&gt;initrd/initramfs&lt;/h3&gt;
&lt;p&gt;在 initrd 方案中，映像可以是文件系统映像（可选压缩），它在特殊的块设备 （/dev/ram） 中可用，然后作为初始根文件系统挂载。&lt;br&gt;
该文件系统的驱动程序必须静态编译到内核中。一旦初始根文件系统启动，内核将 /linuxrc 作为其第一个进程执行;
当它退出时，内核会假设真正的根文件系统已经挂载，并执行 /sbin/init 开始正常的用户空间引导过程。&lt;/p&gt;
&lt;p&gt;在 initramfs 方案（从 Linux 内核 2.6.13 开始可用）中，映像可以是 &lt;a href="https://www.kernel.org/doc/html/latest/filesystems/ramfs-rootfs-initramfs.html" title="initramfs"&gt;cpio&lt;/a&gt; 存档（可选压缩）或此类存档的串联。
内核将存档解压缩到 tmpfs 的特殊实例中，该实例成为初始根文件系统。&lt;br&gt;
此方案的优点是不需要将中间文件系统或块驱动程序编译到内核中。
在 initramfs 方案中，内核将 /init 作为其预期不会退出的第一个进程执行。&lt;/p&gt;
&lt;p&gt;我们可以使用命令 &lt;code&gt;lsinitcpio /boot/initramfs-linux.img&lt;/code&gt; 查看里面的内容 。
事实上，它包含一个简化的根系统，其中包含各种辅助工具：&lt;/p&gt;
&lt;p&gt;但不管是什么方案，它们两者都起到了提供临时的根文件系统，根据用户的配置（/etc/fstab），辅助挂载真实根文件系统的作用。
它们可以被看作是一个临时的“桥梁”，负责在真实根文件系统可用前提供必要的驱动和工具，完成从内核和启动到用户空间初始化的过渡。&lt;/p&gt;
&lt;h2 id="init-system"&gt;Init system&lt;/h2&gt;
&lt;p&gt;在基于 Unix 的计算机作系统中，init（初始化的缩写）是作系统启动期间启动的第一个进程。
Init 是一个守护进程，它会一直运行，直到系统关闭。
它是所有其他进程的直接或间接祖先，它的主要功能是为系统启动必要的服务和组件，并最终生成一个 tty 供用户登录系统。&lt;br&gt;
init 在引导过程中由内核启动；如果内核无法启动它，就会发生内核 panic，或者它应该由于任何原因而死亡。
Init 通常被分配进程标识符 1。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ ps &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PID TTY STAT TIME COMMAND
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ? Ss 0:01 init &lt;span style="color:#f92672"&gt;[&lt;/span&gt;3&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="daemon-or-demon"&gt;Daemon or Demon?&lt;/h3&gt;
&lt;p&gt;在多任务计算机作系统中，守护进程是作为后台进程运行，而不是由交互式用户直接控制的程序。
传统上，守护进程的进程名称以字母 d 结尾，以阐明该进程实际上是守护进程，以及区分守护进程和普通计算机程序。&lt;br&gt;
例如，syslogd 是实现系统日志记录工具的守护程序，而 sshd 是为传入的 SSH 连接提供服务的守护程序。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该术语是由 MIT 的 Project MAC 的程序员创造的。
根据 1963 年左右参与 MAC 项目的 Fernando J. Corbató 的说法，
他的团队是第一个使用守护进程一词的人，其灵感来自麦克斯韦的恶魔，&lt;/p&gt;
&lt;p&gt;麦克斯韦恶魔是物理学和热力学中的一个虚构代理，有助于对分子进行分类，
他说：“我们幻想地开始使用守护进程这个词来描述不知疲倦地执行系统杂务的后台进程”。
Unix 系统继承了这个术语。麦克斯韦的恶魔与希腊神话中将恶魔解释为在后台工作的超自然生物是一致的。&lt;/p&gt;
&lt;p&gt;“Daemon” 实际上是 “demon” 的一种更古老的形式;
守护进程对善恶没有特别的偏见，而是帮助定义一个人的性格或个性。
古希腊人的“个人守护者”概念与现代的“守护天使”概念相似——eudaemonia 是被善良的灵魂帮助或保护的状态。通常，UNIX 系统似乎同时受到守护进程和恶魔的侵扰。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="sysvopenrc"&gt;SysV/OpenRC&lt;/h3&gt;
&lt;p&gt;OpenRC 是一个基于依赖项的 init 系统，适用于类 Unix 计算机作系统。
它是由 Roy Marples 创建的，Roy Marples 是一名 NetBSD 开发人员，他也积极参与 Gentoo 项目。
在一些 Linux 发行版决定不采用 systemd 之后，它作为 Gentoo 之外的 init 系统被更广泛地采用。&lt;/p&gt;
&lt;p&gt;下面给出了一个 OpenRC 系统的 inittab 基础配置。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/inittab: This file describes how the INIT process should set up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# the system in a certain run-level.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Default runlevel.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id:3:initdefault:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# System initialization, mount local filesystems, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;si::sysinit:/sbin/openrc sysinit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Further system initialization, brings up the boot runlevel.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rc::bootwait:/sbin/openrc boot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l0u:0:wait:/sbin/telinit u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l0:0:wait:/sbin/openrc shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l0s:0:wait:/sbin/halt.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l1:1:wait:/sbin/openrc single
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l2:2:wait:/sbin/openrc nonetwork
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;l3:3:wait:/sbin/openrc default
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# new-style single-user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su0:S:wait:/sbin/openrc single
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;su1:S:wait:/sbin/sulogin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# TERMINALS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#x1:12345:respawn:/sbin/agetty 38400 console linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c1:12345:respawn:/sbin/agetty --noclear &lt;span style="color:#ae81ff"&gt;38400&lt;/span&gt; tty1 linux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c2:2345:respawn:/sbin/agetty &lt;span style="color:#ae81ff"&gt;38400&lt;/span&gt; tty2 linux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# What to do at the &amp;#34;Three Finger Salute&amp;#34;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ca:12345:ctrlaltdel:/sbin/shutdown -r now
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;x:a:once:/usr/bin/startDM
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SysV 中的 runlevel 描述了机器的状态，你可以定义在不同状态中系统锁运行的进程和守护进程（daemon）
runlevel 替代了原先在 UNIX 机器上被配置在 /etc/rc 中的启动脚本，而在 systemd 的机器上，它进一步被替换成了 systemd Targets。&lt;/p&gt;
&lt;p&gt;Gentoo 下的 runlevel 示例：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;ID&lt;/th&gt;
 &lt;th&gt;Description&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;OFF&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;1/S&lt;/td&gt;
 &lt;td&gt;Single-user mode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2&lt;/td&gt;
 &lt;td&gt;Multi-user mode without networking&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;Multi-user mode (default)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4&lt;/td&gt;
 &lt;td&gt;Aliased for runlevel 3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5&lt;/td&gt;
 &lt;td&gt;Full mode&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;Reboot&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="systemd"&gt;systemd&lt;/h3&gt;
&lt;p&gt;systemd 是一个软件套件，为 Linux 系统提供了一系列系统组件。
它的主要目标是跨 Linux 发行版统一服务配置和行为。
它的主要组件是 “system and service manager” — 一个用于引导用户空间和管理用户进程的 init 系统。
它还提供各种守护程序和实用程序的替代品，包括设备管理、登录管理、网络连接管理和事件日志记录等。
它最初的灵感来源是 Apple 公司在 MacOS 系统上使用的 launchd init 程序。&lt;/p&gt;
&lt;p&gt;事实上，现代的 systemd 已经变成了一个相当臃肿且“专制”的软件，甚至你可以说现代的 GNU/Linux 已经变成了 systemd/Linux 了。&lt;br&gt;
历史上针对 systemd 的这些问题有着非常非常多的争论，但是最终大部分的 Linux 发行版都最终选择了 systemd 作为他们默认提供的服务管理器。&lt;br&gt;
虽然 systemd 功能非常强大，但是我个人不是非常喜欢。。&lt;/p&gt;
&lt;h2 id="使用-qemu-和-gdb-简单调试一个内核"&gt;使用 qemu 和 gdb 简单调试一个内核&lt;/h2&gt;
&lt;p&gt;先让我们克隆一份 linux 源码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ git clone --depth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; https://github.com/torvalds/linux.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ cd linux &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在配置中选中 &lt;code&gt;Kernel hacking -&amp;gt; Compile-time checks and compiler options -&amp;gt; Debug information -&amp;gt; Generate DWARF Version 5 debuginfo&lt;/code&gt;
和 &lt;code&gt;Provide GDB scriptes for kernel debugging&lt;/code&gt;&lt;br&gt;
然后再选择一些你需要的内核配置，保存退出，运行 &lt;code&gt;make -j$(nproc)&lt;/code&gt; 编译一份内核镜像。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LD arch/x86/boot/compressed/vmlinux
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BUILD arch/x86/boot/bzImage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Kernel: arch/x86/boot/bzImage is ready &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#75715e"&gt;#2)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编译完成后，你的目录下应该会多出来一个编译好的 vmlinux 文件和一个 bzImage 镜像文件。
他们就是我们等会需要调试的内核可执行文件了。&lt;/p&gt;
&lt;p&gt;接下来让我们生成一下一些用于调试 linux 的 gdb &lt;a href="https://www.kernel.org/doc/html/v6.14-rc5/process/debugging/gdb-kernel-debugging.html"&gt;脚本&lt;/a&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ make scripts_gdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再把他们加载到 gdb 启动配置中。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ echo &lt;span style="color:#e6db74"&gt;&amp;#34;add-auto-load-safe-path &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;PWD&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.gdbinit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ gdb vmlinux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后，我们再启动一个 qemu 虚拟机用于调试。&lt;/p&gt;
&lt;p&gt;我们首先需要一个简单的用于调试的文件系统，这里我们选择 buildroot 工具帮助我们生成。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ git clone https://gitlab.com/buildroot.org/buildroot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ cd buildroot &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make menuconfig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ make -j&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;nproc&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指定好 vmlinux 和 buildroot 镜像的位置之后，我们用这些参数开启一个 qemu 虚拟机。
（注意 nokaslr 的内核参数，这里我们为了方便调试而关闭了地址随机化）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;❯ qemu-system-x86_64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -kernel linux/arch/x86_64/boot/bzImage &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -nographic &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -drive format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;raw,file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;buildroot/output/images/rootfs.ext4,if&lt;span style="color:#f92672"&gt;=&lt;/span&gt;virtio &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -append &lt;span style="color:#e6db74"&gt;&amp;#34;root=/dev/vda console=ttyS0 nokaslr&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m 4G &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -enable-kvm &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -cpu host &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -smp &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;nproc&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -net nic,model&lt;span style="color:#f92672"&gt;=&lt;/span&gt;virtio &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -net user,hostfwd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;tcp::10022-:22 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s -S
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!--
## Booting Linux from a RISCV Device? 
--&gt;</description></item><item><title>DN42 初探</title><link>https://anemone.moe/posts/dn42-quickstart/</link><pubDate>Thu, 20 Feb 2025 21:23:04 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/dn42-quickstart/</guid><description>&lt;h2 id="加入-dn42-实验性网络"&gt;加入 DN42 实验性网络&lt;/h2&gt;
&lt;p&gt;按照惯例，一般在接入 dn42 网络之后会写一些关于如何加入的博客教程，但是鉴于网上相关的教程已经有很多了，
&lt;del&gt;而且我也有点懒&lt;/del&gt;，我就不再赘述了。我就放一些我参考的博客和文章好了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://dn42.dev/Home"&gt;dn42 wiki&lt;/a&gt;&lt;br&gt;
dn42 的官方 wiki，内容很多也很全面，对于想要折腾的人是一个很好的参考资料来源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://lantian.pub/article/modify-website/dn42-experimental-network-2020.lantian/"&gt;lantian&amp;rsquo;s blog&lt;/a&gt;&lt;br&gt;
lantian 写的一篇很详细的教程，如果不想看英文的 wiki 的话可以直接看这篇。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;顺带一提，我在申请 DN42 的 IPv6 的地址的时候好像搞错了 &lt;code&gt;inet6num&lt;/code&gt; 和 &lt;code&gt;route6 cidr&lt;/code&gt; 的概念（（&lt;br&gt;
&lt;code&gt;inet6num&lt;/code&gt; 的地址是必须用 0 填充的，而 &lt;code&gt;cidr&lt;/code&gt; 表示的时候可以省略地址中的 0。&lt;/p&gt;
&lt;h3 id="什么是-dn42-实验性网络"&gt;什么是 DN42 实验性网络？&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;DN42 全称 Decentralized Network 42（42 号去中心网络），是一个大型、去中心化的 VPN 网络。
但是与其它传统 VPN 不同的是，DN42 本身不提供 VPN 出口服务，即不提供规避网络审查、流媒体解锁等类似服务。
相反，DN42 的目的是模拟一个互联网。它使用了大量在目前互联网骨干上应用的技术（例如 BGP 和递归 DNS），可以很好地模拟一个真实的网络环境。
————摘自 Lantian 关于 DN42 网络的介绍&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="dn42.png" alt="dn42 logo"&gt;&lt;/p&gt;
&lt;h2 id="配置-bgp-信息"&gt;配置 BGP 信息&lt;/h2&gt;
&lt;h3 id="更改一下系统配置"&gt;更改一下系统配置&lt;/h3&gt;
&lt;p&gt;不同的操作系统的配置方法可能会不太一样，不过我这里就以 Linux 为例了。&lt;/p&gt;
&lt;p&gt;首先，你必须保证你的主机开启了包转发。&lt;br&gt;
在 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; 中写入&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
# 开启包转发
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;之后，你需要关掉 Linux 内核的 &lt;code&gt;rp_filter&lt;/code&gt; 检查&lt;br&gt;
还是在 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; 中写入以下内容&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 禁用 rp_filter 功能
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最后执行一下 &lt;code&gt;sysctl -p&lt;/code&gt; 使配置生效。&lt;/p&gt;
&lt;h3 id="配置-bird-v2"&gt;配置 BIRD v2&lt;/h3&gt;
&lt;p&gt;因为我用的是 BIRD 来进行 BGP 通信，我这里就还是以 BIRD 的配置过程为例好了&lt;br&gt;
参考： &lt;a href="https://dn42.dev/howto/Bird2"&gt;dn42 wiki 中关于 BIRD2 的介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Debian 12 中的软件源默认就含有比较新的 Bird2 版本，直接用 &lt;code&gt;apt install bird2&lt;/code&gt; 就可以安装了。&lt;br&gt;
安装完之后就可以按照官方 wiki 上的示例配置 bird 了。&lt;br&gt;
bird2 的配置文件默认在这里👉 &lt;code&gt;/etc/bird/bird.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;################################################
# Variable header #
################################################

define OWNAS = &amp;lt;OWNAS&amp;gt;; # 这里替换成你的 DN42 ASN
define OWNIP = &amp;lt;OWNIP&amp;gt;; # 这里替换成你的主机的 DN42 IPv4
define OWNIPv6 = &amp;lt;OWNIPv6&amp;gt;; # 这里替换成你的主机的 DN42 IPv6
define OWNNET = &amp;lt;OWNNET&amp;gt;; # 这里替换成你申请的 DN42 IPv4 网络段 （CIDR格式）
define OWNNETv6 = &amp;lt;OWNNETv6&amp;gt;; # 这里替换成你申请的 DN42 IPv6 网络段 （CIDR 格式）
define OWNNETSET = [&amp;lt;OWNNET&amp;gt;+]; # 同理，把 &amp;lt;OWNNET&amp;gt; 里的内容替换成你申请的 DN42 IPv4 网络段就可以了
define OWNNETSETv6 = [&amp;lt;OWNNETv6&amp;gt;+]; # 与上面是一样的，把 &amp;lt;OWNNETv6&amp;gt; 替换成你申请的 DN42 IPv6 网络段

################################################
# Header end #
################################################

router id OWNIP;

protocol device {
 scan time 10;
}

/*
 * Utility functions
 */

function is_self_net() {
 return net ~ OWNNETSET;
}

function is_self_net_v6() {
 return net ~ OWNNETSETv6;
}

function is_valid_network() {
 return net ~ [
 172.20.0.0/14{21,29}, # dn42
 172.20.0.0/24{28,32}, # dn42 Anycast
 172.21.0.0/24{28,32}, # dn42 Anycast
 172.22.0.0/24{28,32}, # dn42 Anycast
 172.23.0.0/24{28,32}, # dn42 Anycast
 172.31.0.0/16+, # ChaosVPN
 10.100.0.0/14+, # ChaosVPN
 10.127.0.0/16+, # neonetwork
 10.0.0.0/8{15,24} # Freifunk.net
 ];
}

roa4 table dn42_roa;
roa6 table dn42_roa_v6;

# 之后我们需要配置一下这里的 ROA 规则
protocol static {
 roa4 { table dn42_roa; };
 include &amp;#34;/etc/bird/roa_dn42.conf&amp;#34;;
};

protocol static {
 roa6 { table dn42_roa_v6; };
 include &amp;#34;/etc/bird/roa_dn42_v6.conf&amp;#34;;
};

function is_valid_network_v6() {
 return net ~ [
 fd00::/8{44,64} # ULA address space as per RFC 4193
 ];
}

protocol kernel {
 scan time 20;

 ipv6 {
 import none;
 export filter {
 if source = RTS_STATIC then reject;
 krt_prefsrc = OWNIPv6;
 accept;
 };
 };
};

protocol kernel {
 scan time 20;

 ipv4 {
 import none;
 export filter {
 if source = RTS_STATIC then reject;
 krt_prefsrc = OWNIP;
 accept;
 };
 };
}

protocol static {
 route OWNNET reject;

 ipv4 {
 import all;
 export none;
 };
}

protocol static {
 route OWNNETv6 reject;

 ipv6 {
 import all;
 export none;
 };
}

template bgp dnpeers {
 local as OWNAS;
 path metric 1;

 ipv4 {
 import filter {
 if is_valid_network() &amp;amp;&amp;amp; !is_self_net() then {
 if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then {
 # Reject when unknown or invalid according to ROA
 print &amp;#34;[dn42] ROA check failed for &amp;#34;, net, &amp;#34; ASN &amp;#34;, bgp_path.last;
 reject;
 } else accept;
 } else reject;
 };

 export filter { if is_valid_network() &amp;amp;&amp;amp; source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; };
 import limit 9000 action block;
 };

 ipv6 { 
 import filter {
 if is_valid_network_v6() &amp;amp;&amp;amp; !is_self_net_v6() then {
 if (roa_check(dn42_roa_v6, net, bgp_path.last) != ROA_VALID) then {
 # Reject when unknown or invalid according to ROA
 print &amp;#34;[dn42] ROA check failed for &amp;#34;, net, &amp;#34; ASN &amp;#34;, bgp_path.last;
 reject;
 } else accept;
 } else reject;
 };
 export filter { if is_valid_network_v6() &amp;amp;&amp;amp; source ~ [RTS_STATIC, RTS_BGP] then accept; else reject; };
 import limit 9000 action block; 
 };
}


include &amp;#34;/etc/bird/peers/*&amp;#34;;
# 我们之后可以在这个目录下添加 peer。
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加一个-peer"&gt;添加一个 Peer&lt;/h3&gt;
&lt;p&gt;为你的 peer 在 &lt;code&gt;/etc/bird/peers/&lt;/code&gt; 目录下添加一个新的配置文件。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# /etc/bird/peers/&amp;lt;NEIGHBOR_NAME&amp;gt;.conf

protocol bgp &amp;lt;NEIGHBOR_NAME&amp;gt; from dnpeers {
 neighbor &amp;lt;NEIGHBOR_IP&amp;gt; as &amp;lt;NEIGHBOR_ASN&amp;gt;;
}
# 对于支持 Multiprotocol BGP 的 Peer 来说可以不需要上面的内容

protocol bgp &amp;lt;NEIGHBOR_NAME&amp;gt;_v6 from dnpeers {
 neighbor &amp;lt;NEIGHBOR_IPv6&amp;gt;%&amp;lt;NEIGHBOR_INTERFACE&amp;gt; as &amp;lt;NEIGHBOR_ASN&amp;gt;;
 # Or:
 # neighbor &amp;lt;NEIGHBOR_IPv6&amp;gt; as &amp;lt;NEIGHBOR_ASN&amp;gt;;
 # interface &amp;lt;NEIGHBOR_INTERFACE&amp;gt;;****
 # 注： &amp;lt;NEIGHBOR_IPv6&amp;gt; 是对方的 IPv6 Link-local 地址，
 # &amp;lt;NEIGHBOR_INTERFACE&amp;gt; 是你的主机和对面 Peer 通讯时用的网卡名称，
 # &amp;lt;NEIGHBOR_ASN&amp;gt; 是对方的 DN42 ASN
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="添加-roa-规则"&gt;添加 ROA 规则&lt;/h3&gt;
&lt;p&gt;DN42 wiki 上给出了一些社区贡献的规则列表，你可以设置一个 crontab 或者 systemd-timer 来定时更新它们。&lt;/p&gt;
&lt;p&gt;以 crontab 配置为例：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-crontab" data-lang="crontab"&gt;*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42.conf https://dn42.burble.com/roa/dn42_roa_bird2_4.conf &amp;amp;&amp;amp; birdc configure &amp;gt; /dev/null
*/15 * * * * curl -sfSLR {-o,-z}/etc/bird/roa_dn42_v6.conf https://dn42.burble.com/roa/dn42_roa_bird2_6.conf &amp;amp;&amp;amp; birdc configure &amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="检查-bgp-连接状态"&gt;检查 BGP 连接状态&lt;/h3&gt;
&lt;p&gt;在终端输入 &lt;code&gt;birdc show protocols&lt;/code&gt;，就能看到现在 BGP 的连接状态了。&lt;br&gt;
如果配置没问题的话，Info 那一列应该就会出现 &lt;code&gt;Established&lt;/code&gt; 的字样。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ birdc show protocols
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BIRD 2.0.12 ready.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name Proto Table State Since Info
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;device1 Device --- up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;static1 Static dn42_roa up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;static2 Static dn42_roa_v6 up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kernel1 Kernel master6 up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kernel2 Kernel master4 up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;static3 Static master4 up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;static4 Static master6 up 2025-01-21 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iedon_v6 BGP --- up 2025-02-01 Established 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;moe233_v6 BGP --- up 2025-02-15 Established 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;potat0_v6 BGP --- up 2025-02-17 Established 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;恭喜你，你成功加入 DN42 网络了！&lt;br&gt;
如果你还想试试看其他东西的话，我建议可以去看看你的 Peer 的 Looking glass（如果有的话），
或者探索一下 DN42 的内部服务，甚至在 DN42 内申请一个域名，搭建你自己的服务了！&lt;/p&gt;
&lt;h2 id="我的-peer-信息"&gt;我的 Peer 信息&lt;/h2&gt;
&lt;p&gt;如果你想和我 Peer，欢迎发邮件联系我 (&lt;code&gt;fermata@h2o.moe&lt;/code&gt;)，并附上你的 Peer 信息，
我看到之后就会联系你来和你 Peer 了。&lt;/p&gt;
&lt;h3 id="sast-network"&gt;SAST-NETWORK&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ASN: 4242420721&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目前的 Peer 有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Patot0&lt;/li&gt;
&lt;li&gt;iedon&lt;/li&gt;
&lt;li&gt;moe233&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del&gt;全都是不需要直接联系对方的 Peer（&lt;/del&gt;&lt;/p&gt;
&lt;h3 id="p1-san-fransisico-digital-ocean"&gt;P1 San Fransisico (Digital Ocean)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DN42 IPv4: &lt;code&gt;172.21.74.1/32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DN42 IPv6: &lt;code&gt;fda7:a114:4f0e::1/128&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Endpoint: &lt;code&gt;do-sf.h2o.moe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Publickey: &lt;code&gt;HBn/8dyDkC8z4kY5tGZsG3d7iyyc8SWwl5c93po580w=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;IPv6 Link-local: &lt;code&gt;fe80::721:1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[转载] 南方周末 2025 新年献词｜用你的活法定义世界的算法</title><link>https://anemone.moe/posts/south-weekly-new-years-dedication/</link><pubDate>Wed, 01 Jan 2025 20:20:18 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/south-weekly-new-years-dedication/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s/KiAvmaFlpMjbSI2nrfskCA"&gt;原文链接&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　当无人驾驶的汽车从你身边闪过，当大模型“写好”你的年终总结，当光影魔法“复活”你的亲人，当虚拟“爱人”向你提出分手……&lt;/p&gt;
&lt;p&gt;　　多年以后，当你回忆2024，生活的海面上，已浮现明日世界的冰山一角。你经历的那些改变，都在确认一场加冕。&lt;/p&gt;
&lt;p&gt;　　生成式AI快速迭代，人机对话上演“物我两忘”；诺贝尔奖连番垂青AI，机器人被注入“灵魂”；俄乌的战场上、加沙的瓦砾里，AI系统在搜寻血肉之躯；预测蛋白质和基因结构，AI模型又助力人类“长命百岁”。&lt;/p&gt;
&lt;p&gt;　　中国没有缺席这场加冕。百模大战，智能体涌现；脑机接口试验成功，AI辅诊纳入医保；传统制造在摆脱重复劳作，千年古建被写入“黑神话”。&lt;/p&gt;
&lt;p&gt;　　这一年，AI更加强大，以前所未有的速度嵌入各行各业；这一年，AI更多风险，从人类安全、伦理，蔓延至社会的方方面面。&lt;/p&gt;
&lt;p&gt;　　技术狂飙的欣喜与奥本海默式焦虑接踵而至。AI“教母”呼吁，要像“登月计划”一样推动它发展。诺奖得主担忧：“比我们更智能的系统终将控制一切”；联合国通过监管人工智能的“里程碑”决议，欧盟批准首个AI监管法案；《人工智能全球治理上海宣言》呼吁：“在人类决策与监管下，以人工智能技术防范人工智能风险”。而在全球AI中心、大洋彼岸的加州，首次提出防止大模型对人类造成“严重伤害”的监管法案，却遭到了否决……&lt;/p&gt;
&lt;p&gt;　　争议仍在持续，但“奇点”正在来临。看吧，OpenAI并不open，偏见垒起高墙；“驴象之争”落定，技术海沟深潜；机器在模拟人、超越人的道上一路狂奔，人却依然在为生存与日常踯躅蹒跚。&lt;/p&gt;
&lt;p&gt;　　从远古走来，我们曾用燧石敲出火种，用蒸汽顶开束缚，用钨丝点亮暗夜，用网络消弭距离，却从未如此面对“人与工具”的二律背反：&lt;/p&gt;
&lt;p&gt;　　不眠不休的机器极大提升着效率，也无情刷新着劳动价值的版图。当一技之长的护城河渐成小溪，无数普通劳作者将如何开辟新的领域？&lt;/p&gt;
&lt;p&gt;　　海量资源推动着信息平权，也制造着新的鸿沟。在人人都成为“知识容器”的一刻，如何保持智识的独特与人性的温暖？&lt;/p&gt;
&lt;p&gt;　　算力和数据提速着认知与决策，也拨动着心灵中公平正义的天平。若将一切抉择都交给算法，人的精神与觉醒是否面临荒芜？&lt;/p&gt;
&lt;p&gt;　　如果机器可以从事一切工作、治疗一切疾病、抵达一切远方、对抗一切时间，人类作为创造者，登临那造物之巅，看到的究竟是创世纪的朝霞还是终结者的余晖？&lt;/p&gt;
&lt;p&gt;　　迭代进化的洪流，湮没着无数往昔。有时这世界就像一个庞大的系统，你对人生所有的规划与努力，或许都抵不过时代洪流一次不容分说的安排。但我们终究无法接受，在未来的某一天，人工智能回顾“我们”，就像我们回顾寒武纪海洋中的三叶虫、侏罗纪丛林里的恐龙。生而为人，就绝不甘为无角色的NPC，总期望在这个世界找到那个真正的自己。&lt;/p&gt;
&lt;p&gt;　　在彷徨中寻找、在跌撞中摸索、在进击中演化，是生命的常态。世界广袤，不是每只方舟都能渡尽所有，可每个生于平凡的人，都在那“日复一日”的度过中苦苦寻觅：无数次刷过那些卷子才走进大学，无数次鼓足那股勇气才向你表白，无数次蹚入那条河流才游到彼岸……历史不是文学家笔下的修辞，而是无数重复又动人的真实故事：虽说前途未卜，但总怀着懵懂的希望。&lt;/p&gt;
&lt;p&gt;　　极致的赋能，令一切“在场”都有“离场”之虞。但每个渺小的个体，都能写下大时代中的愿望与倔强。程序正在得出最精准的结果，可生命不是通往结局的直行线，那其中，应有你百转千回、一咏三叹的人生印记。&lt;/p&gt;
&lt;p&gt;　　要做系统的变量，让存在具有意义。&lt;/p&gt;
&lt;p&gt;　　像一粒火星带来一次绽放，像一只蝴蝶扇动一场飓风。未来不是既定的结局，每个人都可以参与它的塑造；参差不是主线的分支，每条线都可能写出新的章节。&lt;/p&gt;
&lt;p&gt;　　人的抉择，不是程序接收的指令，而是自我的觉知与他者的共情。经历命运的无常，你在力挽狂澜；看到弱者的无助，你正奔走呼告。在枯鱼涸辙时坚守底线，在斗转星移时保持清醒，在人机交互时感受心跳：你没有程序般的标准答案，却始终懂得什么是爱、什么是恨、什么是长夜的痛哭和隐约心头的小确幸。&lt;/p&gt;
&lt;p&gt;　　人创造工具，人从来不是工具。面对机器的高效，面对AI的全能，生命的价值与尊严所以存在，仅仅因为我们是人——因生活而坚忍不拔的人，因梦想而起舞燃烧的人，因相信而赤诚勇敢的人，因挚爱而舍身忘我的人。&lt;/p&gt;
&lt;p&gt;　　因为“它”无懈可击，“你”才意义涌现，人生从来就不是一次次“建模”：AI高速运算，你毅然抉择；AI排遣心事，你伸出援手；AI给出建议，你拼尽全力。用你的活法定义世界的算法，将你的真实汇成世界的真相，真正点亮黑夜的并不只有太阳，还有内心的火、眼中的光。&lt;/p&gt;
&lt;p&gt;　　每一次黎明璀璨，总有人星夜来迎。是他们在马路上川流不息、在格子间凝神贯注、在田野中播下谷种，也是他们用肩膀扛起家庭、把背影投入风雨、以微笑眺望希冀。文明的壮丽绝不仅止于任何器物的如日中天，终将归于每个人的梦想、成长与求变，终要在爱与责任中折射出人之光辉：哪怕浪潮汹涌，始终跌跌撞撞，却总在拼尽全力游向心的方向。&lt;/p&gt;
&lt;p&gt;　　新年的阳光会如约而至，它照耀着每个与众不同的人。这个世界不会因为技术变得简单，复杂才是它的本质，我们也终将在这复杂中找到存在的意义。因为你无法计算，所以无可估量；因为你并不完美，反而独一无二——这是我们对人与AI关系的反思，更是对人类价值的再次确认。我们之所以在这颗星球上行走，不是为了成为最快最好的机器，而是要在这浩瀚的星辰大海中找到自己、确认自己、喜欢自己。&lt;/p&gt;
&lt;p&gt;　　祝你新年快乐！&lt;/p&gt;
&lt;p&gt;　　文/南方周末编辑部&lt;/p&gt;</description></item><item><title>面向零基础小白的博客搭建教程</title><link>https://anemone.moe/posts/ultimate-guide-to-set-up-a-basic-personal-blog/</link><pubDate>Sun, 17 Nov 2024 23:27:21 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/ultimate-guide-to-set-up-a-basic-personal-blog/</guid><description>&lt;p&gt;这次主要是想写篇文章介绍一下一个简单的静态博客的搭建过程，
作为运维组授课的补充资料。&lt;/p&gt;
&lt;p&gt;嘛，毕竟上次授课的时间和电子部他们冲突了，挺多人听了一半就走了，&lt;br&gt;
而且后面在讲解这部分内容的时候可能也没有具体表达清楚，所以干脆就写一个文字版的教程，
方便对照着参考搭建。（速速来交换友链 😋）&lt;/p&gt;
&lt;h2 id="step1"&gt;Step1&lt;/h2&gt;
&lt;p&gt;给你的博客取个名字，并且获取一个属于你自己的域名&lt;/p&gt;
&lt;p&gt;这个地方也没有什么好说的，基本上每个人在这块都有自己的想法&lt;br&gt;
不过要注意一下的是：&lt;br&gt;
1）你取得名字要好记&lt;br&gt;
2）域名没有被人提前注册了&lt;/p&gt;
&lt;h3 id="什么是域名"&gt;什么是域名？&lt;/h3&gt;
&lt;p&gt;简而言之，域名（Domain Name）是互联网上用来识别和访问网站的一个易于记忆的地址。
这个地址可以通过 dns 服务器指向任何 ip 或者其他域名，有了域名之后，你就不需要去费劲记忆你的服务器的 ip 了。&lt;/p&gt;
&lt;h3 id="如何白嫖购买域名"&gt;如何白嫖/购买域名？&lt;/h3&gt;
&lt;p&gt;首先，如果你之前按照 C++ 组的教程成功申请到了 Github 学生包的话，
那就可以直接申请学生包内免费一年时间的 &lt;code&gt;.live&lt;/code&gt; &lt;code&gt;.tech&lt;/code&gt; 域名。&lt;/p&gt;
&lt;p&gt;如果你比较喜欢其他的域名后缀，也可以自行去域名网站挑选购买，比较常见的域名购买网站有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://namesilo.com"&gt;Namesilo&lt;/a&gt; 首选，价格便宜，支持支付宝付款，不需要备案，但是后台管理面板比较简陋&lt;/li&gt;
&lt;li&gt;&lt;a href="https://godaddy.com"&gt;GoDaddy&lt;/a&gt; 全球最大的域名注册商&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dnspod.cn/"&gt;Dnspod&lt;/a&gt; 国内老牌厂家，功能强大，有的后缀需要备案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;域名厂家可以自由选择，但基本上域名注册的价格是根据你的域名后缀来的，有的后缀，例如 &lt;code&gt;.xyz&lt;/code&gt; &lt;code&gt;.top&lt;/code&gt; 会比较便宜，
有的域名，比如说 &lt;code&gt;.io&lt;/code&gt; &lt;code&gt;.dev&lt;/code&gt; &lt;code&gt;.com&lt;/code&gt; 则可能会比较贵，按照你个人的需求自由选择就行。&lt;/p&gt;
&lt;p&gt;或者，你也可以使用网上的一些其他免费域名服务，比如说 &lt;code&gt;eu.org&lt;/code&gt; 等，
但这类服务一般会有一定的使用风险，说不定哪一天就不能再使用了。各位可以自行权衡。&lt;/p&gt;
&lt;h3 id="如何将域名解析到-cloudflare"&gt;如何将域名解析到 Cloudflare？&lt;/h3&gt;
&lt;p&gt;Cloudflare 是世界上最大的 cdn 服务提供商，他家为用户提供了免费且功能非常强大的许多功能，强烈建议把新注册的域名解析到 cf，
再在 cf 的控制面板中更改域名的 dns 设置。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;注册 Cloudflare 账号&lt;/li&gt;
&lt;li&gt;选择添加域&lt;/li&gt;
&lt;li&gt;输入你的域名后选择继续 -&amp;gt; 选择 Free 计划（对于博客来说已经 100% 够用了）&lt;/li&gt;
&lt;li&gt;删除掉域名注册商预留的 dns 记录&lt;/li&gt;
&lt;li&gt;在你的域名注册商处更改 nameserver&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="image-5.png" alt="cloudflare"&gt;&lt;/p&gt;
&lt;p&gt;由于域名注册商种类繁多，我就把 Cloudflare 关于更改 nameserver 的教程贴到这里，大家可以自行参考。&lt;br&gt;
&lt;a href="https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/#update-your-nameservers"&gt;Cloudflare 的教程&lt;/a&gt;&lt;/p&gt;
&lt;ol start="6"&gt;
&lt;li&gt;更改成功后，你就可以愉快的使用 cloudflare 管理你的域名啦！&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="step2"&gt;Step2&lt;/h2&gt;
&lt;p&gt;选择安装一个静态网站生成器，并且生成你网站的内容。&lt;br&gt;
对于一个简单的个人博客来说，往往不会带有太多的动态的，需要服务器处理的内容，
所以可以直接将你所有的页面生成成一系列静态的 html 网页部署在服务器上，这样既节省了资源，也加快了网站的访问速度。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hugo.opendocs.io/about/benefits/"&gt;Hugo 文档中对静态网站生成器好处的解释&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="安装-hexo"&gt;安装 Hexo&lt;/h3&gt;
&lt;p&gt;现在网上有着各种各样的静态页面生成器，例如 &lt;code&gt;hexo&lt;/code&gt; &lt;code&gt;hugo&lt;/code&gt; &lt;code&gt;jekyll&lt;/code&gt; &lt;code&gt;vuepress&lt;/code&gt; 等，
你可以自由选择一种作为你的博客的生成工具 &lt;del&gt;（你们前端真恐怖啊）&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;但是对于本篇教程，我们主要就 Hexo 为例来进行说明。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hexo.io/zh-cn/docs/index.html"&gt;Hexo 的官方中文文档&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装 nodejs（使用 nvm）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# installs nvm (Node Version Manager)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# download and install Node.js (you may need to restart the terminal)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nvm install &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# verifies the right Node.js version is in the environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node -v &lt;span style="color:#75715e"&gt;# should print `v22.11.0`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# verifies the right npm version is in the environment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm -v &lt;span style="color:#75715e"&gt;# should print `10.9.0`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hint: 安装过程中可能需要自行解决一下网络访问问题&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 npm 安装 hexo&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 全局安装 hexo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo npm install -g hexo-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使用 hexo 新建一个博客&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 将 &amp;lt;folder&amp;gt; 替换为你的博客名称/文件夹名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexo init &amp;lt;folder&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd &amp;lt;folder&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 初始化项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;初始化后，您的项目文件夹将如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── _config.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── scaffolds
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── source
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| ├── _drafts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| └── _posts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── themes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;_config.yml&lt;/code&gt; 是你的博客的配置文件，你可以在这里修改你博客的相关配置。&lt;br&gt;
&lt;code&gt;themes&lt;/code&gt; 文件夹下存放了你的博客的主题文件，如果你想修改博客的主题的话，可以把主题文件放在这个文件夹下。&lt;br&gt;
&lt;code&gt;source&lt;/code&gt; 文件夹下存放了你的博客的页面文件，如果你想给你的博客添加页面/文章，就可以在这里进行修改&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置你的博客&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说了那么多，不如先把你的博客启动起来看看吧。&lt;br&gt;
先切换到你博客的根目录，然后输入 &lt;code&gt;hexo server&lt;/code&gt; 在你的本地启动博客。&lt;/p&gt;
&lt;p&gt;&lt;img src="image.png" alt="console_output"&gt;&lt;/p&gt;
&lt;p&gt;然后按照提示打开 &lt;code&gt;http://localhost:4000&lt;/code&gt; 查看你的博客页面。&lt;/p&gt;
&lt;p&gt;&lt;img src="image-1.png" alt="hexo_blog"&gt;&lt;/p&gt;
&lt;p&gt;可以看出，我们的博客成功启动了 🎉🎉&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择一个主题：&lt;/strong&gt;&lt;br&gt;
可以看出，我们的博客的默认页面可能还不是非常的美观，
我们可以在&lt;a href="https://hexo.io/themes/"&gt;主题列表&lt;/a&gt;选择一个合适的套用到我们的博客上。&lt;/p&gt;
&lt;p&gt;这里以 &lt;a href="https://github.com/fluid-dev/hexo-theme-fluid"&gt;fluid&lt;/a&gt; 主题为例：&lt;/p&gt;
&lt;p&gt;首先按照教程下载 github release, 并解压至博客的 themes 文件夹，重命名成 &lt;code&gt;fluid&lt;/code&gt;:&lt;br&gt;
此时你的博客的目录结构应该大概是这样子的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;themes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── fluid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── _config.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── languages
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── layout
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── package.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── README_en.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── scripts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── source
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后我们要更改博客的配置文件让 hexo 使用我们刚刚安装的主题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 修改 _config.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim _config.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Hexo &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填你的博客的标题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;subtitle&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填副标题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填对博客的描述&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;keywords&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;author&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;John Doe &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填作者的信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;language&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;zh-cn &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填博客的语言，我这里改成了中文，如果你想用英语写博客的话可以改回 en&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;timezone&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;Asia/Shanghai&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里填时区信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 省略了一些内容&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;http://example.com &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 这里改成你的域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;theme&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fluid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;详细的配置说明可以参考 &lt;strong&gt;&lt;a href="https://hexo.io/zh-cn/docs/configuration"&gt;官方文档&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置完成后，我们可以重新启动一下 hexo 来应用我们的更改。&lt;/p&gt;
&lt;p&gt;&lt;img src="image-3.png" alt="fluid_site"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开始写作把&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 新建一篇文章或一个页面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexo new post &lt;span style="color:#e6db74"&gt;&amp;#34;Hello, SAST&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;hexo 此时会提示我们它已经在 &lt;code&gt;source/_posts/Hello-SAST.md&lt;/code&gt; 目录下创建了这个 markdown 文件，
我们只要在这个文件里写作即可。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://markdown.cn/docs/tutorial-basics/basic-syntax/"&gt;基本的 markdown 语法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当我们写完之后保存， &lt;code&gt;hexo server&lt;/code&gt; 会帮我们动态更新博客里的内容，回到刚才的页面刷新，我们就可以看到我们写的内容了。&lt;/p&gt;
&lt;p&gt;&lt;img src="image-4.png" alt="hello-sast"&gt;&lt;/p&gt;
&lt;h2 id="step3"&gt;Step3&lt;/h2&gt;
&lt;p&gt;部署你的博客&lt;br&gt;
目前为止，我们都还是只在本地运行你的博客，&lt;br&gt;
那么我们该如何把你的博客公布到互联网上，和你的朋友们分享呢？&lt;/p&gt;
&lt;p&gt;注意⚠： 你可以任选一个这里的方法部署你的博客，但是你可能需要按照这几种不同方法的教程分别调整你的域名的解析设置。&lt;/p&gt;
&lt;h3 id="github-pages--cloudflare-pages"&gt;Github Pages / Cloudflare Pages&lt;/h3&gt;
&lt;p&gt;免费而且方便的方法，但是可能访问速度会比较慢， Github Pages 似乎也不能被国内搜索引擎检索到，
不过仍然是比较推荐的部署方法之一&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hexo.io/zh-cn/docs/github-pages"&gt;将博客部署在 Github Pages&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="paas"&gt;PaaS&lt;/h3&gt;
&lt;p&gt;选择一个现有的 PaaS 服务部署&lt;br&gt;
由于我们只是一个非常简单的静态网站，所以我们可以任意选择现有的一些 Paas 平台发布。&lt;br&gt;
这些平台既有免费的，也有收费的。比如说 &lt;code&gt;vercel&lt;/code&gt; &lt;code&gt;netlify&lt;/code&gt; &lt;code&gt;heroku&lt;/code&gt; 等等&lt;br&gt;
（Github 学生也包含一些免费额度）&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hexo.io/zh-cn/docs/one-command-deployment"&gt;一键部署&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="s3-储存服务"&gt;S3 储存服务&lt;/h3&gt;
&lt;p&gt;一些云厂商也提供了将 S3 储存内的文件部署成网页的选项，
如果你正好手头有一个 S3 储存，可以尝试一下这个方案&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ZfGyeJ8jYxI"&gt;Linode S3&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="vps-server"&gt;VPS Server&lt;/h3&gt;
&lt;p&gt;如果你正好有一个海外的服务器（国内的服务器需要备案），你可以把博客部署在你的服务器上。&lt;br&gt;
ps: 如果实在不想折腾，可以直接问学长白嫖（&lt;/p&gt;
&lt;h4 id="上传你的博客文件"&gt;上传你的博客文件&lt;/h4&gt;
&lt;p&gt;rsync, git, rclone 等工具都可以用来同步本地和服务器的文件，&lt;br&gt;
为了方便起见，这里选择使用 rsync&lt;br&gt;
先在 &lt;code&gt;_config.yml&lt;/code&gt; 里填入部署配置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rsync&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;host&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;&amp;lt;host&amp;gt; &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 服务器主机地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;user&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;&amp;lt;user&amp;gt; &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 服务器用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;&amp;lt;root&amp;gt; &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 博客上传至远程服务器的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;port&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;port] &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 服务器的端口，默认为 22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;登入服务器，安装 rsync&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install rsync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后，部署本地博客至服务器：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安装 hexo 的 rsync 插件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install hexo-deployer-rsync --save
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 使用 rsync 方式部署&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hexo deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="配置反代服务器"&gt;配置反代服务器&lt;/h4&gt;
&lt;p&gt;Hint: 在配置之前，你可能需要将你的域名解析到你的服务器 ip 来让 Caddy 获取一个 ssl 证书&lt;/p&gt;
&lt;p&gt;这里以 Caddy 为例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install caddy &lt;span style="color:#75715e"&gt;# 安装 Caddy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim Caddyfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;caddy start &lt;span style="color:#75715e"&gt;# 让 Caddy 在后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Caddyfile 配置：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://caddyserver.com/docs/quick-starts/static-files"&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Caddyfile" data-lang="Caddyfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;example.com &lt;span style="color:#75715e"&gt;# 这里填你的域名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;root&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;*&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/www/mysite&lt;/span&gt;&lt;span style="color:#75715e"&gt; # 这里填你博客存放的位置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;file_server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果一切顺利的话，那么你现在就拥有了一个属于你自己的博客啦 🥳🥳&lt;/p&gt;</description></item><item><title>Ask Smart Questions</title><link>https://anemone.moe/posts/ask-smart-questions/</link><pubDate>Thu, 12 Sep 2024 21:31:17 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/ask-smart-questions/</guid><description>&lt;h2 id="how-to-ask-questions"&gt;how to ask questions?&lt;/h2&gt;
&lt;p&gt;从历史上来说，黑客们（hackers）往往指代了那些最早接触（甚至参与构建了）互联网，并且愿意深入研究计算机架构，了解其工作原理的那些人。他们在互联网上逐渐形成了一种特殊的文化，吸引着越来越多的人加入。&lt;/p&gt;
&lt;p&gt;但是，想要融入这个群体中，我们就必须了解他们的习惯、礼仪和行为方式。只从如何问问题这个方面上来说，“问问题”这一在日常生活中简单而惯常的事情，在互联网上（或者说在黑客的群体中）往往有着微妙而不简单的差别。&lt;/p&gt;
&lt;p&gt;很多黑客圈子中看似无理的行为并不是存心冒犯，而是直截了当、一针见血的交流风格，这种风格更注重解决问题，而不是使人感觉舒服而却模模糊糊。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;夸张的讲法是：你要的是“友善”（以上述方式）还是有用？两个里面挑一个。&lt;/p&gt;
&lt;p&gt;记着：当黑客说你搞砸了，并且（无论多么刺耳）告诉你别再这样做时，他正在为关心你和他的社区而行动。对他而言，不理你并将你从他的生活中滤掉更简单。如果你无法做到感谢，至少要表现得有点尊严，别大声哀嚎，也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者，就指望别人像对待脆弱的洋娃娃那样对你。&lt;/p&gt;
&lt;p&gt;有时候，即使你没有搞砸（或者只是在他的想像中你搞砸了），有些人也会无缘无故地攻击你本人。在这种情况下，抱怨倒是真的会把问题搞砸。&lt;/p&gt;
&lt;p&gt;这些来找麻烦的人要么是毫无办法但自以为是专家的不中用家伙，要么就是测试你是否真会搞砸的心理专家。其它读者要么不理睬，要么用自己的方式对付他们。这些来找麻烦的人在给他们自己找麻烦，这点你不用操心。&lt;/p&gt;
&lt;p&gt;也别让自己卷入口水战，最好不要理睬大多数的口水战 —— 当然，这是在你检验它们只是口水战，并且未指出你有搞砸的地方，同时也没有巧妙地将问题真正的答案藏于其后（这也是有可能的）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="some-rules"&gt;some rules&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在提问之前，先自己尝试解决问题（包括但不限于STFW, RTFM， RTFSC），没有经过自己尝试和思考而提出的问题，在黑客社区里会被认为是想要不劳而获。&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;/li&gt;
&lt;li&gt;问题在得到解决时，可以留下一段简短的描述和感谢，让之后遇到同样问题的人也可以解决问题。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Gentoo Proprietary Softwares Workaround</title><link>https://anemone.moe/posts/gentoo-proprietary-softwares-workaround/</link><pubDate>Thu, 12 Sep 2024 11:45:10 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/gentoo-proprietary-softwares-workaround/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;在使用linux的时候，有时你会不得不面对安装一些专有软件的困境。&lt;br&gt;
如果你运气好，可能在网上可以找到一些解决这些问题的教程，如果运气不好，你可能就有些束手无策了。
这篇文章主要就我个人在处理这些软件时遇到的问题以及附带的一些解决方案。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我的电脑环境：&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gentoo Linux x86_64&lt;/li&gt;
&lt;li&gt;Linux Kernel: 6.6.32&lt;/li&gt;
&lt;li&gt;Wayland Compositor: Hyprland&lt;/li&gt;
&lt;li&gt;CPU/GPU: Intel 13900H/Xe Graphics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="qqwechat"&gt;QQ/Wechat&lt;/h2&gt;
&lt;p&gt;在QQ推出新版本之前，在Linux上安装使用QQ一直是一件难事，不过自从QQ NT版本出现后，tx逐渐优化了他们的软件对Linux的支持。&lt;/p&gt;
&lt;p&gt;gentoo用户可以使用 &lt;code&gt;eselect repository enable gentoo-zh&lt;/code&gt; 来启用&lt;code&gt;gentoo-zh&lt;/code&gt;软件源安装
或者使用flatpak版本（方便，且自带沙盒，便于管理）&lt;/p&gt;
&lt;h2 id="vivado"&gt;Vivado&lt;/h2&gt;
&lt;p&gt;建议直接使用 flatpak 版本的 &lt;a href="https://flathub.org/apps/com.github.corna.Vivado"&gt;Vivado&lt;/a&gt;，
不仅省时省力，还给 Vivado 提供了一个简单的沙盒环境，强烈推荐👍&lt;/p&gt;
&lt;p&gt;&lt;del&gt;接下来就是臭名昭著的Vivado了
在最新版的安装包中，Vivado 看似取消了对不兼容 Linux 发行版的安装限制，
但在最后一步 &lt;code&gt;Generating installed devices list&lt;/code&gt; 时会因为系统缺少 &lt;code&gt;libtinfo.so.5&lt;/code&gt; 而卡住。
解决方法是安装 &lt;code&gt;ncurses:5``ncurses-compat&lt;/code&gt; 及相关库。Gentoo 已经不再提供老版本的 ncurses 了，所以你可能需要先自己处理一下相关运行时，
并在运行Vivado安装程序时在前面加上 &lt;code&gt;LD_PRELOAD='linbtinfo.so.5'&lt;/code&gt;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;其次，建议在安装完成后把Vivado文件夹内的lib中对不同发行版的运行库 &lt;code&gt;Rhel SuSE Ubuntu&lt;/code&gt; 全部复制出来，放到上级目录 &lt;code&gt;lnx64.o&lt;/code&gt; 中。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://support.xilinx.com/s/question/0D52E00006hpQNASA2/vivado-installation-got-stuck-says-generating-installed-devices-list?language=en_US"&gt;Xilinx_Support&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="vitis"&gt;Vitis&lt;/h2&gt;
&lt;p&gt;基本上操作与 Vivado 相同，但也建议将 lib 文件夹内的运行库依赖拷贝出来，不然有可能会遇到启动时无反应的问题。
注： flatpak 版本也可能会遇到上述问题，需要手动解决一下。&lt;/p&gt;
&lt;h3 id="wayland-hidpi设置"&gt;Wayland HIDPI设置&lt;/h3&gt;
&lt;p&gt;Vivado好像不会采用环境变量的设置，但是在Vivado的设置界面 &lt;code&gt;Tools -&amp;gt; Settings -&amp;gt; Display&lt;/code&gt; 可以手动设置缩放&lt;/p&gt;
&lt;h3 id="调用外部编辑器"&gt;调用外部编辑器&lt;/h3&gt;
&lt;p&gt;&lt;del&gt;调用时需要重置运行库设置（不使用Vivado自己的），可以通过写一个外部脚本实现。
不记得之前是从哪里看到这个解决方案的了。。。等我找到再贴上来吧。&lt;/del&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;unset LD_LIBRARY_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;emacsclient -n -w &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &amp;gt; /dev/null 2&amp;gt;&amp;amp;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在 flatpak 版本调用外部编辑器：&lt;/strong&gt;&lt;br&gt;
先在主机上设置&lt;code&gt;.v&lt;/code&gt;文件的默认编辑器，再在 Vivado 中设置使用 &lt;code&gt;xdg-open [filename]&lt;/code&gt; 打开&lt;/p&gt;
&lt;h2 id="stm32cubemx"&gt;STM32CubeMX&lt;/h2&gt;
&lt;p&gt;Updated on 2025.03.14.&lt;/p&gt;
&lt;p&gt;现在 CubeMX 也有 flatpak 版本了，强烈建议使用，免去了很多麻烦：）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;貌似 CubeMX 在 Gentoo 下还是会无法生成 STM32CubeIDE 项目，目前还没搞明白具体为什么会这样。。。&lt;br&gt;
查日志的时候看到的报错都是 NullPointerException，有点无语😅&lt;/p&gt;
&lt;p&gt;现在可能的解决方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在它的设置里更换 STM32CubeMX 的源仓库，不要让他放在家目录下，可能可以解决无法生成 CubeIDE 项目的问题。&lt;/li&gt;
&lt;li&gt;使用 distrobox，每次都使用 distrobox 里的 ubuntu 容器打开 CubeMX，但还是有机率会挂。&lt;/li&gt;
&lt;li&gt;使用 flatpak 或者 docker 之类的工具给他打一个包，但问题是每次它自动更新都会失败，
也就意味着你可能需要每次更新都得为他打一个包。理论上最优解，但可能比较费事。&lt;/li&gt;
&lt;li&gt;使用 STM32CubeIDE。相对来说比较简单的解决方法，但还是有时候会莫名其妙闪退，
而且 Eclipse 我也有点用不习惯。。。&lt;/li&gt;
&lt;li&gt;使用 PlatformIO 或者 CMSIS 库，一劳永逸解决问题 &lt;del&gt;（真的有人想在它给的注释中间写代码吗）&lt;/del&gt; ，但学习成本相对来说会比较高。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="matlab"&gt;Matlab&lt;/h2&gt;
&lt;p&gt;基本上是字面意义上的开箱即用，按照官方教程安装完就可以直接使用了。可能装完之后还会有一些 opengl 和 wayland 缩放的问题，
不过基本上按照 &lt;a href="https://wiki.archlinux.org/title/MATLAB#"&gt;Arch Wiki&lt;/a&gt; 上的教程都可以解决，还是非常舒适的。&lt;/p&gt;</description></item><item><title>[转载] 优绩主义与社会结构下的精英困境</title><link>https://anemone.moe/posts/meritocracy-and-the-dilemma-of-the-elites-within-the-social-structure/</link><pubDate>Wed, 29 May 2024 21:33:18 +0800</pubDate><author>fermata@h2o.moe (fermata)</author><guid>https://anemone.moe/posts/meritocracy-and-the-dilemma-of-the-elites-within-the-social-structure/</guid><description>&lt;h2 id="一些想法"&gt;一些想法&lt;/h2&gt;
&lt;p&gt;仅仅作为一名普通双非学校的学生，在看到这篇文章时的心情还是非常复杂的。或许我们并不是文章中所提到的精英学子，但我们却似乎被笼罩在了他们的阴影之下。我们拼了命的向上爬，想成为那些顶尖“985”的一员，然而，可能现实也并没有我们幻想的那么美好。&lt;/p&gt;
&lt;h2 id="导读"&gt;【导读】&lt;/h2&gt;
&lt;p&gt;从优绩主义理论视角出发，整体性地反思985学子焦虑现象的社会心理与深层机制。根据访谈对象的生命自述，深入剖析功绩主义理念下的自我规训与自我剥削、985高校内部的分层与流动、优绩主义承诺下的希望、努力与落空等各个层面。高校隐形的优绩主义新包装、多元而不多元化的评价体系、985标签的光环与负担、“上”与“下”的隐忧与动力、优绩主义的承诺与失效、普遍性社会结构与985学子焦虑的关联等诸多问题，揭示了985学子焦虑现象应该得到社会更多的关注与重视。我们希望通过深描，讲述优绩主义盛行时代中国精英学子的生命故事及其情感认知，并在“理解他人的理解”中观照写作者自身的生活世界，达到与自己、与他人、与社会、与历史、与世界的沟通与和解。&lt;/p&gt;
&lt;p&gt;【关键词】优绩主义 985学子 焦虑 情感&lt;/p&gt;
&lt;h2 id="01-引言"&gt;&lt;strong&gt;01&lt;/strong&gt; 引言&lt;/h2&gt;
&lt;p&gt;历史学家斯塔夫里阿诺斯（Leften Stavros Stavrianos）曾说：“我们每一代人都需要重写历史，因为每个时代都会产生新问题，探求新答案。”[1]人类社会自20世纪末进入互联网时代以来高速发展，伴随着社交网络、平台社会、短视频、人工智能等一波接一波的浪潮，人类的生活方式前所未有地被各种信息和选择所充盈，但深度媒介化的社会也带来了前所未有的挑战与困扰，尤其在情感和日常生活层面。比起前人，我们究竟是更富足了还是更贫瘠了？究竟是更快乐了还是更焦虑了？青年群体的生长轨迹和社会语境，相较于前代更是发生了翻天覆地的变化。不仅是生活方式的剧变，也涉及情感、精神状况、行为模式、生命状态的一系列变化。作为原子化的社会个体，其生活状态是否自足，精神状况是否自洽？新代际遇到了哪些新问题、新困惑？这些都需要我们不断地发现和反思。本文就是聚焦青年群体中特殊的一类，通过对65位985学子的深度访谈，深度反思985学子焦虑的内在机制，及其与优绩主义、社会结构之间的深度绑缚。&lt;/p&gt;
&lt;p&gt;毋庸置疑，在一切社会分层之中，教育是最重要的维度之一，古今中外亦然。无论是哪个阶层，都希望自己的后代能够跻身名校教育，这是阶层上升或是维持阶层的重要途径。20世纪90年代以来，中国的大学教育改革，进一步将大学分层为985大学、211大学、一本、二本、三本等各个阶梯。我们认为，出身乃至阶层是揭示大学生生命状态的一个维度，但不能涵盖所有的层面。整体社会内卷加剧和深度媒介化社会，使得他者的生活，无论是“成功”的还是“失败”的，都弥漫在我们的社交网络与线下环境中。在整体焦虑弥漫的当代社会，很难出于刻板印象，将处于教育金字塔尖的985学子的焦虑斥之为“矫情”。人类学家格尔茨说：“解释人类学的根本使命并不是回答我们那些最深刻的问题，而是使我们得以接近别人——在别的山谷守护别的羊群时——所给出的回答，从而把这些回答归于记载人类曾说过什么的记录中去。”[2]从格尔茨的看法出发，所有人类的生活，哪怕是看起来再微不足道,其激发的回响都使我们对人类整体图景的了解和认知更进一步。&lt;/p&gt;
&lt;h2 id="02-功绩主义理念下的自我规训与自我剥削"&gt;&lt;strong&gt;02&lt;/strong&gt; 功绩主义理念下的自我规训与自我剥削&lt;/h2&gt;
&lt;p&gt;在所有的结构性因素中，教育机制无疑对985学子的焦虑产生了无可替代的影响。从广义的角度来看，只要是教人育人、以文化之的过程，都可以被称为教育，包括学校教育、家庭教育、社区教育等机制。更隐性的是，教育机制通过培养共同的价值观和信仰，塑造了社会的文化结构，其理念和规则也深深地辐射着体系内的每一个人，其中十分重要的一条就是优绩主义规则。韩炳哲使用功绩社会（achievement society）这一概念来诊断现代社会的绩效主义，他指出：现代社会中人们基于自我优化、自我成就、尽职尽责等自诩为内在心灵中的自由意志强迫自己一再做出绩效，力图最大化地发挥自身功效。[3]21世纪的社会不再是一个规训社会，而是功绩社会[4]，生活在其中的社会成员不再是被虔敬和命令剥削的“驯化的主体”，而是着迷于自我优化和效率提升的功绩主体。功绩社会作为韩炳哲提出的一个诊断社会的启发性概念，成为我们透析985学子焦虑现象主要的理论视角来源。&lt;/p&gt;
&lt;p&gt;迈克尔·桑德尔在《精英的傲慢》中讨论了优绩主义规则带来的困境,从理论上对“优绩主义”原则本身及其后果进行了全面的检视批判，认为优绩主义是暴虐的原则，它使“那些处于顶端的人发现自己很难抗拒这样的想法：他们应该获得成功，而那些处于底层的人也应该处于底层的位置”[5]。“优绩”（merit）是指才能、努力和成就，优绩主义规则是指社会与经济的奖赏应当依据优绩决定，其基本逻辑具有合理性，即人们在机会平等的条件下公平竞争，成绩优异者获胜。实际上，包括中国在内的大多数现代社会都认同优绩主义，认为“择优录取”及“能者多得”是理所当然的公平原则，尤其是在教育领域，高考就是优绩主义最为突出的表现形式。优绩主义规则成为教育机制的一条内在逻辑，深深地辐射着社会的整体教育理念，同时也在教育机制的运行中不断被制度化，作用于社会中的细微个体。他们已经成为985学子了，为什么还是会感到焦虑？实际上，由于研究对象的独特性，这个问题本身就蕴含着对高等教育等教育机制的深思。&lt;/p&gt;
&lt;h3 id="一新的隐性规则优绩主义的新包装"&gt;（一）新的隐性规则：优绩主义的新包装&lt;/h3&gt;
&lt;p&gt;985学子可以说是优绩主义规则下短暂的胜利者，但随着迈入新的人生进程，优绩主义可能失效，优绩主义遮蔽的问题更是不断显露。在无法常胜的恐慌下，焦虑随之而生。“迈过大学（尤其是985高校）的门槛”不仅意味着新的教育层次和人生阶段，也是应试教育的尾声、社会化过程的开端。真正踏入这个校园时，他们才发现这里并非只有书本知识，他们需要适应新的规则。这些规则不完全是教育机制本身，却是学生长期身处其中的教育机制的后果和连锁反应。985学子的一种普遍性焦虑源于大家的来路极其相似，是通过同一种选拔体系、在同一种确定性的规则中被筛分出来的，这背后发挥作用的就是优绩主义逻辑和应试教育规则。受访者1说：“可能你是天津的，他是北京的……就是大家无非是在这条路上跑得更累一点或者稍微轻松一点的区别，但是方向都是这样的，都是在这条路上。”&lt;/p&gt;
&lt;p&gt;这套以优绩主义为深层逻辑的系统和规则的背后是一套潜在的奖惩机制，包括提供较高的社会地位，使得后来进入985高校的学子在前期一直有信奉和依赖它的动力，并长期维持被其形塑、固定的“好学生”身份。进入985高校正是践行这一规则的结果，也可以说是遵循它而被奖励的甜美果实。这一深层规则通过形塑985学子的日常感知影响他们的后续行为，要求他们满足“好好学习”的社会期待。因此，985学子被期望在成绩上表现出色，他们则因为面临更大的压力而更努力地去践行这套规则，以维持或提升他们在社会结构中的地位，形成一个周而复始的循环。&lt;/p&gt;
&lt;p&gt;吊诡的是，在当前的环境之下，进入大学后学习不是唯一选项，整体氛围上又明显缺乏高考以前对成绩的重视，看似选择更多元了，以优绩主义规则为基础的“唯成绩论”看似被打破了，就像受访者2形容的开阔境地：“这并不是我的个人独有感受，一方面是脱下了应试的枷锁，可以毫无负担地撒欢玩耍，另一方面也感知到自身在应试能力之外的各种匮乏。那时开始我逐渐感受到世界的参差，感受到在考试成绩之外的、更开阔也更复杂的衡量尺度。”但当下不一样的是，985学子一方面要为了新的规则（如保研、奖学金、不挂科）继续努力，保持高绩点；另一方面，他们还面临着更多元的评价体系。这何尝不是优绩主义的一种新包装？问题在于，此时的多元化不是包容，而是带来了新的压力，不是某一项优秀就可以，而是每一项都优秀才算好——除了成绩，在别的评价标准上也要样样优秀。而且很多时候，新的规则并不像“奋斗考大学”那么清晰，而是需要自己去慢慢探索。这些隐性规则对学生的影响隐蔽、深远又广泛。对985学子来说，18岁之前的知识是在书本上的白纸黑字，18岁上大学之后就不同了，许多东西都要自己去想，新的规则也要自己去探索和适应。&lt;/p&gt;
&lt;h3 id="二多元却不多元化的评价体系"&gt;（二）“多元”却不“多元化”的评价体系&lt;/h3&gt;
&lt;p&gt;蓝江认为，功绩社会会阻碍主体之间的合作和交流，让追求绩效的个体之间的关系变成竞争关系，造成了当下社会中泛滥的内卷和焦虑现象。[6]正如上述“新的隐性规则”所讲，上大学后，985学子面临的多元维度的评价体系并没有减轻他们的负担，反而是加剧其压力，导致“多元”却不“多元化”的矛盾。一些受访者仍然认为现有的教育或社会评价体系过于单一，只注重学术成绩和表现，也即优绩主义导向。受访者3说：“从小老师、父母和学校带给我一种想法，只有知识是正统的，其他只是锦上添花。那时候我的大学，主流评价体系中也没有考量那么多东西。比如说，保研或者奖学金，就是辅导员根据成绩来去评定的。我当时还没有意识到评价体系可以是多元的。”受访者4认为，在学校中实施这种量化细分的评价方式带有实用主义色彩，忽视了学校教育的精神导向：“大学评价体系更多就是看谁学习成绩更好，或者说谁能够做出来相应的成绩，参加很多活动获奖，有丰富的履历，所谓的多元发展评价。学校毕竟还是不要太进入一种特别量化、讲究效率的体系当中去，也可以有对非物质成就、精神体验的褒奖。”&lt;/p&gt;
&lt;p&gt;还有一些受访者已经感受到了多维度评价体系给自己施加的压力，它意味着要在更多的方面有所成就。受访者5明白，相比应试教育体系的优等生，大学里的优等生的内涵已经又扩充了几个维度，只能逼自己去适应这些维度：“之前应试教育阶段只有成绩，但是到了大学之后肯定不是只为学分绩，所以在各方面也会注意去提升自己。”受访者6也认为，上大学后整体大环境将“全能”的要求附在学生身上：“大学之后，优秀学子在不同的价值体系里面都非常出色，像学生活动、成绩、出国和学术等，不光是在某一个维度上面有比较出色的表现，人家是全能的。”&lt;/p&gt;
&lt;p&gt;评价体系不单一意味着要求部分学生走出舒适圈，比如，那些对学生工作、组织活动等方面不擅长、不感兴趣的学生。受访者们也对多维度评价体系展开了反思。受访者7分析指出，这种体系没有考虑到对学生的要求和给学生的机会的匹配程度，加剧了评价指标和资源分配上的不合理：“生活80%的时间都在学习，都在all for分数、all for排名。现在给的资源机会又要求我们必须有非常丰富的社会实践经历、非常良好的个人才能，我们很难在日常的生活中完成。整个大的体系就是不太合理的。”&lt;/p&gt;
&lt;p&gt;在针对当前的评价体系不够多元化和包容性的批判中，还有许多受访者表达了社会和学界对博士生乃至整个学术生产的评价体系的质疑。受访者8讲述了读博期间以学术为核心的评价体系与实践冲突的问题：“我读博就想完成学校的最低毕业标准，把更多精力放到临床和实践学习上，以后更好地帮助到别人。（但是）读博是做科研，就是以发文章为标准，表面上看来它也是唯一的指标，会关系到能否找到一个更好的工作（教职）。”还有一些受访者则是关注到当前社会规则或学术界规则对博士生的评价体系显得功利和急进，并反思学术的最终意义与学者的价值追求。受访者1从学术的本质出发，指出这种学术体系可能剥夺学术乐趣：“学术要求更深度的思考过程，要求时间，但是我们现行的评价体系是会催促着你不断生产新的内容，三年发不出来你就要走人。”受访者9则结合自己在北美高校的所见对比指出，这样的学术评价体系是实用主义和结果导向的，可能反而导致学术成果质量不佳，并反思了这个体系是否在迫使学者生产无意义的文章：“当你没有太多紧迫感地做一件事情的时候，可能没那么功利，更能享受这个过程，不会太结果导向。”受访者10也表达了类似观点：“我曾经很长一段时间对于做学术、对整个人文社会科学的意义和价值产生过质疑，很大一个原因就在于论文发表。有的文章用很精致、高大上的学术话语包装我们都知道的现象，他们并没有真的发自内心觉得这个问题很重要，而是迫于发论文的要求。”&lt;/p&gt;
&lt;p&gt;诚然，优绩主义在历史进程中，曾经对弱势社会阶层的上升起过巨大的促进作用，并不完全应该作为被批判的对象。比如，冯婷认为需要坚持优绩主义与矫正优绩主义并行，给成功者以尊敬，给未获成功者以尊严，倡导并维护价值的多样性等见解值得借鉴。[7]但是优绩主义在当下社会结构中的日渐僵化及其所带来的负面影响，值得我们持续地进行深思。&lt;/p&gt;
&lt;h2 id="03-985高校内部的分层与流动"&gt;&lt;strong&gt;03&lt;/strong&gt; 985高校内部的分层与流动&lt;/h2&gt;
&lt;p&gt;当前国内教育机制构成的一个重要社会文化就是“高校鄙视链”的层级结构，它反映了社会对不同层次高校的认可程度。这个结构中，首先，最顶端的是顶级高校，如清北、国内常青藤（其中最著名的是“C9”联盟）等；其次是重点高校，如985、211等；再次是一般本科高校；最后是专科学校。这种层级结构会从教育评价体系辐射至社会各个领域，包括学子目标、父母期望、企业要求以及社会地位的认定等。对985学子而言，自己所在的高校处于高校鄙视链的哪个层级、自己未来是否能前往这个金字塔结构的中层并往顶端攀升、求职时自己的母校（尤其是本科学校）是否能给自己带来裨益，这些对他们来说都极为关键，仅仅从互联网上和现实生活中学子们积极参与建构的“清北之争”、比“C9”联盟更进一步的“C5高校之争”等议题就能反映出这一点。高校鄙视链的存在使得学生在学业过程、职业发展等方面都可能产生压力和困扰，加剧他们的焦虑情绪。985学子也需要持续在鄙视链中进行分层与流动，面对如何找到跃升空间的问题。&lt;/p&gt;
&lt;h3 id="一期待与压力985既是光环也是负担"&gt;（一）期待与压力：“985既是光环，也是负担”&lt;/h3&gt;
&lt;p&gt;与“高校鄙视链”的层级结构相呼应，自然而然地，近年社会舆论似乎在不遗余力地赋予处于这一层级中上层的985高校及学子以光环。正如受访者6所说，“×大会给我一个在社会上的光环”。与此同时，社会也非常关注他们在光环背后的阴暗面，比如许多新闻报道将新闻信息中的“985”作为一个可以吸引眼球的关键词。作为置身光环之中的人，985学子自身当然能感知到这一光环的存在及影响。受访者11反思了985光环遮蔽了她缺乏参考的迷茫未来：“读到985出来，我身边可参考的样本太少，以至于我对我的前途非常迷茫。985的光环只是很偶尔地提醒我，学习能力还不错，平时我也不会觉得清北出来一定就是优秀的人，我觉得看一个人就一定要看他的多方面素质。”&lt;/p&gt;
&lt;p&gt;可见，与985光环并行的是对985学子施压的双重力量——期待与压力，它由内外因素共同结构。一方面，社会整体对985学子有高期待和高要求；另一方面，这些学子也存在实现自我、提升自我的内在驱动力。受访者12说：“我心里面觉得，读了这么多年书，从985高校出来，毕业之后还是没有找到自己合适的工作，就有压力。”清北学子遇到的双重境遇更为深刻。访谈中，清北学生普遍反映“社会对清北学生是有期待的”，且往往比985学子有更高的期待。受访者13分享了她在面临家人、同事对于“清北人”更高的期待时的困惑心理：“比如，我考选调，我的家人可能会觉得本科毕业、普通985和211学生也可以考，你读这个研的意义在哪儿？你为什么一定要上北大？我现在进了南京市教育局，同事的反应就是北大都要来我们教育局了。我不明白，清北的人到底应该过一种什么样的人生，会有一种什么样的期待。”受访者14还指出了清北学生迈入职场时可能面临的心理失衡：“你进了北大，大家对你的期待就是，你是一个北大的人，你要做出北大人该做的水平……其实你进去（公司）会有点心理失衡，你会有可能和一些不一定都是一本的学生在一起工作。”名校生往往很顾及学校的光环，他们能切身感受到自己享受着光环的余晕，但也“不想砸了学校的招牌”，背负着随之而来的新压力。985学子的标签既是光环，也是负担，恰到好处地说明了其作为双刃剑对于985学子心理焦虑的重大影响。&lt;/p&gt;
&lt;h3 id="二上与下的隐忧与动力"&gt;（二）“上”与“下”的隐忧与动力&lt;/h3&gt;
&lt;p&gt;在优绩主义逻辑的驱使下，随着985光环而来的就是985高校内部的分层和流动——“上”与“下”的问题。其底层逻辑如同受访者15所说，“阶层的跃升也好，向上的流动也好，教育是唯一的途径”，同时这也是对整个社会建构的“高校鄙视链”文化的深层呼应。受访者5以“下坡路”隐喻自身一直平稳的升学历程，指出对985学子而言在高校层级中“不进则退”的特征：“你看我这×大本硕博，你不觉得是在走下坡路吗？×大本科这个平台给了我看似还不错的能力，走得很顺，它就是一个顺的下坡路。上坡路的话，我可能保研就会跑到其他学校，如果再走上坡路的话，我可能成为一个海博。这是一个相对来说我心目中优等生的发展路径。”受访者16在谈到考研选择时也分析了诸多考生普遍采取的高校层级跃升目标：“考研目标选择，60—70%大众的选择其实是上一个阶梯的。双非会考211，211会考985，985会考更好的985。”受访者17反思了自己身为清北学生，在保研推免机会的获得上享受了比普通985学子更大的隐性“特权”，她说：“我本科时在年级内的绩点排名不高，却拥有宝贵的推免资格，其实体现了×大作为国内数一数二、在其他985高校之上的名校给本校生的隐性‘特权’。从这个层面说，进入比985高校更高一级的清北，客观上让此后的人生更顺利，可能缓解本校学生的压力和焦虑，也无形中增加共同参与竞争的其他学校同学的压力。”&lt;/p&gt;
&lt;p&gt;在爬上巅峰的快感和名校光环的笼罩下，他们面临的困难甚至不是“向上跃升”，而是“不下降”都难，不得不“向下走”而带来的心理失衡也非常多见。受访者17分析指出了在社会普遍心理和学子的内在驱使下，清北学子面临着“向下走”的魔咒、时时可能出现的跌落感与“反向考研”的无奈，背后其实是他们升学选择空间的压缩：“我从北大树洞上观察到学生一种普遍的焦虑来源：从清北本到非清北985高校（甚至211、双非）硕博的隐性‘下降’及其引发的心态失衡问题。很多跟我相似处境的北大同学都会担忧‘向下走’的问题，有的同学因此选择留学。这也是一种悲哀——很多学生进入清北、基本达到国内本科教育的巅峰，却很难在进一步的激烈竞争中持续保持留在巅峰，而是被不能‘向下走’的魔咒缠住。”正如受访者18所说，“起点越高，想再往上走越难”。关于985学子在“上”与“下”中的犹豫，应当考虑到他们是已在优绩主义规则中获得阶段性胜利的人。受访者5在面临“上”可能会承担的风险时退缩了：“向上够一够的选项都是要付出代价的，如果自己没有那么强的话，就要承担风险。”受访者19则指出，985学子的试错成本更高，所以即使不涉及“上”与“下”的改变也可能畏首畏尾、不敢挑战：“我感觉作为一个985大学的学生试错成本很高，每一步都不能出差错，没有孤注一掷的勇气。最终还是选择回到舒适空间。”优绩主义视野下的985高校分层及流动，诚如桑德尔所说的：“把高等教育变成一场竞争激烈的分类竞赛，对民主和教育都是不健康的。”[8]&lt;/p&gt;
&lt;h2 id="04-优绩主义承诺下的希望努力与落空"&gt;&lt;strong&gt;04&lt;/strong&gt; 优绩主义承诺下的希望、努力与落空&lt;/h2&gt;
&lt;p&gt;当谈到《精英的傲慢》这本审视优绩主义规则的书时，受访者9坦诚地说：“985学子作为精英，感到很焦虑，精英的焦虑是很难理解的吗？”她实际上是指精英焦虑本就具有内在合理性。当我们将优绩主义失效的视角引入时，就会发现其中更为深刻的动因是“985学子的努力与回报率”问题，从个人心理和社会心理层面为我们的选题提供了另一个解释视角。&lt;/p&gt;
&lt;h3 id="一优绩主义的承诺与失效"&gt;（一）优绩主义的承诺与失效&lt;/h3&gt;
&lt;p&gt;从我们的材料中可以发现，在时代变迁与社会冲击下，优绩主义遭到又一重批判：规则与现实之间存在断裂。即使当前许多985学子能依靠努力获取教育资源，最后是否能转化为职业成就也值得商榷。优绩主义规则给上一世代的回馈相对更多，随着时代变迁，在当前中国社会深度转型和机会结构压缩等因素影响下，优绩主义规则不能缓释985学子感到无力的现状，就如受访者20所感叹的：“我想生活在努力奋斗就一定能成才赚钱的神话时代。”&lt;/p&gt;
&lt;p&gt;这也就引出，985学子焦虑和其他人群的焦虑相比，其特殊性在于，他们在应试教育阶段接受的观念就是优绩主义：“拿现在的努力学习换取一份比较确定的光明的未来。”即应试教育阶段的所有人被灌输一种同等的观念，默认他们只要努力学习就会拥有美好的前途，后来却发现并非如此。在所有信任这个规则的人群中，985学子是最坚信、最努力、最怀有希望的，也是其后最迷茫、最失落、最焦虑的。985学子的另一个困境还在于，他们接受的精英教育、被打开的宽阔视野，使他们能清晰地感知到周遭世界和社会运行的整体规律，同样也会预见这种大结构下关乎自己未来、自己命运的无力处境，这无异于清醒的痛苦。&lt;/p&gt;
&lt;p&gt;受访者5觉得自己上大学最大的意义就是获得了文凭，因为985的学历是后续求职的一个门槛。换句话说，文凭及其后续回报是985学子希望自己千辛万苦付出努力后能得到的“功绩”。问题就在于，在机会结构缩小的前提下，当前985学子在获得文凭上的付出，越来越难以在社会中有效转化，他们在学历上的积累也许不适配于当下社会的运行规则，也就使得他们更容易生成负面的感知。她从心理层面分析了当前内卷大环境下学历转化率低，985学子即使再努力，最终希望也可能落空的无力困境：“我觉得985学子焦虑的核心点在于曾经拥有的希望的落空，另外现在985好像也没有太多光环。从转化来说，在生活水平上，曾经对于光明未来的想法，被薪水没那么高、房价又高的现实冲击，你会发现活得很辛苦，我考上985有什么意义？这种辛苦不是我读了985就能改变的。”&lt;/p&gt;
&lt;p&gt;更可怕的是，985学子仍会不断被优绩主义规则绑架未来人生。受访者5分析了985学子在学业、就业上得持续付出回报率未知的努力，遭受仿佛一眼望不到头的辛苦：“考上985和在985里面读书其实都是不容易的，这种辛苦好像一直是没有尽头的一样，得一直努力才行。‘以后就轻松了’，但是发现以后也轻松不了。没有一个确定的有回报率的以后，所以现在很多人活在当下。”在社会加速语境中，社会时钟节点的整体前移趋势显著，越来越提前的一个个时钟节点，常常令人透不过气来，时间焦虑也成为受访者的一种普通精神状态。我们认为，个体在社会所铺设的时间轨道及优绩主义原则面前，依然应该保有一定程度的互动协商的权利。一套僵化的、过于强势的优绩主义原则，对个体心灵来说也形同桎梏。&lt;/p&gt;
&lt;h3 id="二普遍性的社会结构与985学子焦虑的关联"&gt;（二）普遍性的社会结构与985学子焦虑的关联&lt;/h3&gt;
&lt;p&gt;不可否认的是，985学子的焦虑心态与当下普遍性社会结构深度相关。《中国青年网民社会心态调查报告（2022）》从焦虑感、奋斗观、就业观、消费观、婚恋观、生育观、网络暴力七方面对当代中国青年网民进行调查，其中青年网民学习/工作焦虑最为突出，表现出“边焦虑边奋斗”的生活状态。《报告》指出：“在教育水平层面，研究生及以上学历的青年网民相比本科、大专和初高中学历的青年网民表达出了更多的焦虑感，呈现出了‘越优秀越焦虑’的情况。”[9]这也为我们研究985学生焦虑提供了一个佐证。焦虑的普遍性折射出韩炳哲提出的“功绩主义”特征。东亚地区复杂、多元、急速的现代化进程被学者称为“压缩性现代化”[10]，是指经济、政治、文化等各方面的因素在时间与空间维度被高度压缩，处于不同阶段的历史文化因素在同一个社会中共存。在这样的背景之下，“快”成为中国社会的核心特征，整个社会缺乏成长性思维，更多使用量化指标体系来评估各项发展成果，对于人或人才的评价也是如此。作为社会中坚力量的青年深受影响，不可避免地被卷入绩效、量化、竞争、效率之中，焦虑正在成为青年群体一种普遍的社会心理。社会中的每个人都面临着被淘汰的危机，在绩效管理制度之下，为了在与他人的竞争中取得胜利，每个人都不得不努力提升自己。“变成更好的自己”成为青年人的口头禅，为了赢过“昨天的自己”不得不进行更大程度的压榨。正如韩炳哲所说：“疲惫的、抑郁的功绩主体在不断地消耗自我，在同自身的战斗中困苦不堪。”在看似积极进取的姿态背后，是青年群体疲惫、燃尽的自我。从这个层面来看，“佛系”“反内卷”“躺平”等低欲望生活的表现形式不过是青年对功绩社会做出的反应，这些心理调适也正是社会结构变迁下个体的另一种反抗。&lt;/p&gt;
&lt;p&gt;985学生的焦虑是一个时代的缩影。从1977年高考恢复至今走过了46个年头，鲤鱼跃龙门的神话随着时代变迁逐渐消散。时代洪流下，985学子自嘲为“小镇做题家”，自我降格为“打工人”，但其深层社会心理仍然是“不敢停、害怕错、拼命赶”的状态，最终筋疲力尽。在我们的访谈中，受访者21提到的“交卷”比喻十分有趣：“当我意识到社会时钟的时候，我总是在追赶不同的节点，我的焦虑也来源于对这个节点的追赶。我觉得这个节点就像我自己在交卷子一样，我总是在想我现在一定要干正事，人一定要做对这个考试、这份卷子有用的事情。”“交卷”的比喻形象地概括了中国人的一生，然而仅从自我的调适层面难以彻底地解决焦虑，治标不治本。我们需要从“优绩主义”的角度重新反思教育体制，重新厘清教育的本质，“选才”是否应该凌驾在“育人”之上，教育竞争的游戏规则是否加剧了阶级的固化？也需要重新审视社会结构、时代变迁、媒介机制、个体生命历程等多重因素，从宏观的角度进行多元思考。唯有全社会形成“放缓”的节奏，从源头机制提供“休息”的保障，才能真正地让青年有栖息之所。&lt;/p&gt;
&lt;p&gt;在这种情况下，对焦虑、内卷、躺平等当代青年独特的社会心理，不能一味地站在批判性的视角简单批评，还应真正关注到青年所面临的多重困境。近年“慢生活”“治愈系文化”的悄然兴起也正是一种协商路径。“人生是旷野，不是轨道”，袤则咨询发布的《2023大社交趋势观察报告》将这种现象概括为“旷野想象”，报告指出当代年轻人开始反思“线性前进”的执念。在经济增长放缓的前提下，上升通道变得越来越拥挤；出口在变少，排队的人在变多。同时，工业化的进程大大丰富了物质供给，低消耗、低成本的生活并非难事。藉此，更多人意识到人生并非直线上升的过程，而是充满了分支和可能性，更多更具探索精神而非一味顺从社会规训的生活方式，进入了大众讨论的范畴。[11]&lt;/p&gt;
&lt;h2 id="05-结语"&gt;&lt;strong&gt;05&lt;/strong&gt; 结语&lt;/h2&gt;
&lt;p&gt;关于985学子焦虑，我们的写作方式是对话、倾听而非评判，我们希望通过几十位受访者的自我叙事，描摹出优绩主义盛行时代中国精英学子的生命故事、求学之路及其情感认知，并在“理解他人的理解”中观照写作者自身的生活世界。我们试图真实地呈现出他们的心路历程，这种真实既可能是指现实生活中真实无误发生过的事件与变化，也可能指向他们对现实世界的真实感知与阐释。我们的受访者普遍接受过精英大学通识教育的洗礼，这意味着他们有能力、也有意愿，对985高校学子的焦虑、迷茫、困顿以及中国社会的整体内卷化趋势，进行相当程度的结构性归因。我们可以看见这一批精英学子如何理解自我，如何理解社会，如何阐释个体命运与社会结构之间的密切勾连，又如何凭借既有的个体资源建构内卷时代的自我行动策略。学者项飙近年来鼓励青年寻找“附近”，摆脱人生的“悬浮”状态，产生了很大的影响。[12]他的本意是劝说青年从空想转为行动，从虚拟世界转向附近的生活空间，从中获得脚踏实地的能力，治愈生活的能力。这个“附近”不仅仅是地点和空间，不仅仅是日常生活流，更包括“附近”的人的生存及情感状况。在“远方的苦难”应该被看见、被诉说、被重视的同时，“附近的人”的情感和生命也应该被看见、被诉说、被重视。米尔斯所谓的“社会学的想象力”[13]，正是在历史和社会结构下，关注个人生活浩瀚的复杂性与多元性。青年是人类的未来，青年的身上投射着人类社会的希望。关注985学子的生命及精神状态，对整体社会的良性发展具备严肃的重大意义。任何一个微小的个体或现象背后，都连接着更大的社会结构与语境，所谓见微知著，一叶知秋。而传播学——“communication”的原意无论是“传播”还是“沟通”，都点醒我们，最重要的是突破圈层，勇敢地呈现自己，达到与自己、与他人、与社会、与历史、与世界的沟通与和解。&lt;/p&gt;
&lt;h2 id="注释"&gt;注释：&lt;/h2&gt;
&lt;p&gt;[1][美]斯塔夫里阿诺斯.全球通史：从史前史到21世纪（第7版修订版上册）[M].吴象婴,梁赤民等译.北京：北京大学出版社，2006:9.&lt;br&gt;
[2][美]克利福德·格尔茨.文化的解释[M].韩莉译.南京:译林出版社，2014:39.&lt;br&gt;
[3][德]韩炳哲.精神政治学[M].关玉红译.北京：中信出版社,2019:26.&lt;br&gt;
[4][德]韩炳哲.倦怠社会[M].王一力译.北京：中信出版社,2019.&lt;br&gt;
[5][美]迈克尔·桑德尔.精英的傲慢：好的社会该如何定义成功[M].曾纪茂译.北京：中信出版社，2021:255.&lt;br&gt;
[6]蓝江.功绩社会下的倦怠：内卷和焦虑现象的社会根源[J].理论月刊,2022（7）:5-11.&lt;br&gt;
[7]冯婷.优绩主义：价值、批判及其矫正[J].探索与争鸣，2023（10）:93.&lt;br&gt;
[8][美]迈克尔·桑德尔.精英的傲慢：好的社会该如何定义成功？[M].曾纪茂译.北京：中信出版社,2021:171.&lt;br&gt;
[9]复旦发展研究院.中国青年网民社会心态调查报告（2022）[EB/OL].https://fddi.fudan.edu.cn/79/d1/c18985a489937/page.htm.&lt;br&gt;
[10]Chang K S.East Asia’s Condensed Transition to Second Modernity[J].Soziale Welt,2010,61(H.3/4):319-328.&lt;br&gt;
[11]袤则咨询.2023大社交趋势观察报告[EB/OL].https://socialbeta.com/t/socialbeta-report-social-trends-2023.&lt;br&gt;
[12]项飙,康岚.“重建附近”：年轻人如何从现实中获得力量？——人类学家项飙访谈（上）（下）[J].当代青年研究,2023(5):1-9+21;2023(6):1-10.&lt;br&gt;
[13]Mills,C.W.,The Sociological Imagination(Fortieth Anniversary Edition),New York,NY:Oxford University Press,1959/2000,pp.6-7.&lt;/p&gt;
&lt;p&gt;[基金项目：2023年度国家社科基金一般项目“平台视角下饭圈组织化的多元机制与协同治理研究”（23BXW116）。]&lt;br&gt;
原刊于《中国图书评论》2024年05期。&lt;br&gt;
本文系未编排稿，成稿请查阅本刊。&lt;/p&gt;</description></item></channel></rss>