硬件看门狗:主板上的倒计时复位电路

背景 homelab 里的 r86s(R86S 小主机,Celeron N5100,跑 Proxmox VE)偶尔整机卡死。卡死后机器既不会自己恢复,也不会留下日志,前几次分别过了约 10.5 小时和 4 小时才被人发现并重启。排查过程见 R86S IRQ 16 nobody cared。 在修不了根因(BIOS 没有更新、microcode 已是最新)的情况下,第一件要做的事是让机器卡死后能自动恢复,这就是硬件看门狗的用途。这篇记录硬件看门狗是什么、Linux 和 Proxmox 怎么用它,以及它在 r86s 这次排查里起的作用。 看门狗是什么 看门狗(watchdog timer,WDT)是一个独立于 CPU 运行的倒计时器: 软件启动看门狗,设一个超时时间,比如 10 秒; 软件定期"喂狗"(kick / pet),每次喂狗把倒计时重置回 10 秒; 如果软件卡死、没人喂狗,倒计时走到 0,看门狗就直接拉复位信号,把整台机器重启。 关键在于独立:倒计时由芯片组里的电路自己走,不依赖 CPU 执行任何指令。CPU 死锁、内核卡死、关了中断,它都照样倒数,照样复位。这一点是软件手段做不到的。 这个思路最早来自嵌入式和工控领域:无人值守的设备死机了没人去按电源键,必须自己恢复。单片机几乎都内置看门狗。 硬件看门狗在哪里 它通常不是一块单独的板卡或模块,而是集成在芯片里的一小块电路。x86 机器上常见的几种: 位置 例子 Linux 驱动 Intel 芯片组(ICH/PCH)里的 TCO 定时器 从 1999 年的 ICH 一直到现在的 PCH,包括 Jasper Lake iTCO_wdt AMD 芯片组(FCH)里的 TCO 定时器 大部分 AMD 平台 sp5100_tco 主板上的 Super I/O 芯片 ITE IT87xx、Nuvoton NCT67xx、Fintek F718xx it87_wdt、w83627hf_wdt、f71808e_wdt 服务器的 BMC IPMI 看门狗 ipmi_watchdog ARM SoC 树莓派的 BCM2835 bcm2835_wdt 所以"几乎所有 x86 主板都有"是成立的,至少芯片组里会有一个 TCO 定时器。但"有"不等于"能用": ...

Created 10106-10-10 · Updated 10106-10-10 · 5 min · 1038 words · -

R86S IRQ 16 nobody cared:HD Audio 控制器引发的共享中断告警

背景 homelab 里的 r86s(R86S 小主机,Celeron N5100,Jasper Lake 平台)跑 Proxmox VE,上面是 K8s 的两台 VM:k8s-50 和 k8s-51,拓扑见 Homelab topology。这台机器偶尔会整机卡死,所以每天 04:00 有一个定时任务自动 apt full-upgrade 加重启。 排查卡死问题时,在内核日志里看到了这样一段: kernel: irq 16: nobody cared (try booting with the "irqpoll" option) kernel: CPU: 0 UID: 0 PID: 47 Comm: kworker/u16:1 Tainted: P O 7.0.14-20-pve #1 kernel: Hardware name: BROUNION R86S/R86S, BIOS 5.19 04/12/2022 kernel: Workqueue: pm pm_runtime_work ... kernel: handlers: kernel: [<...>] idma64_irq [idma64] kernel: [<...>] i2c_dw_isr kernel: [<...>] i801_isr [i2c_i801] kernel: [<...>] sdhci_irq [sdhci] threaded [<...>] sdhci_thread_irq [sdhci] kernel: [<...>] azx_interrupt [snd_hda_codec] kernel: Disabling IRQ #16 这篇记录这条告警是什么意思、根因是什么、影响什么,以及能用哪些 OS 或 BIOS 配置消除它。 ...

Created 10106-10-10 · Updated 10106-10-10 · 6 min · 1182 words · -

Linux Bridge 网桥实现分析

网桥 作者: kendo(http://www.skynet.org.cn/) 第一部份 源码框架 一、网桥原理 传统的中继器,如HUB,是一个单纯的物理层设备,它将每一个收到的数据包,在其所有的端口上广播,由接收主机来判断这个数据包是否是给自己的。这样,网络资源被极大的浪费掉了。 网桥之所以不同于中继器,主要在于其除了有中继的作用外,还有一个更重要的作用,就是学习MAC地址,然后根据每个数据包的目的MAC与自身端口的对应,从关联端口发送数据,而不完全地在整个网段中进行广播。所以,网桥的实现中,有两个关键点: 学习MAC地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想HUB一样,但是每发送一个数据,它都会关心数据包的来源MAC是从自己的哪个端口来的,由于学习,建立地址-端口的对照表 (CAM表) 。 每发送一个数据包,网桥都会提取其目的MAC地址,从自己的地址-端口对照表(CAM表)中查找由哪个端口把数据包发送出去。 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除。网桥对站点所处网段的了解是靠"自学习"实现的。 当使用网桥连接如图2所示的两段LAN时,网桥对来自网段1的MAC帧,首先要检查其终点地址。如果该帧是发往网段1上某一站的,网桥则不将帧转发到网段2,而将其滤除;如果该帧是发往网段2上某一站的,网桥则将它转发到网段2。这表明,如果LAN1和LAN2上各有一对用户在本网段上同时进行通信,显然是可以实现的。因为网桥起到了隔离作用。可以看出,网桥在一定条件下具有增加网络带宽的作用。 网桥的存储和转发功能与中继器相比有优点也有缺点,其优点是: .使用网桥进行互连克服了物理限制,这意味着构成LAN的数据站总数和网段数很容易扩充。 .网桥纳入存储和转发功能可使其适应于连接使用不同MAC协议的两个LAN。 因而构成一个不同LAN混连在一起的混合网络环境。 .网桥的中继功能仅仅依赖于MAC帧的地址,因而对高层协议完全透明。 .网桥将一个较大的LAN分成段,有利于改善可靠性、可用性和安全性。 网桥的主要缺点是: .由于网桥在执行转发前先接收帧并进行缓冲, 与中继器相比会引入理多时延。 .由于网桥不提供流控功能,因此在流量较大时有可能使其过载, 从而造成帧的丢失。 网桥的优点多于缺点正是其广泛使用的原因。 网桥将两个相似的网络连接起来,并对网络数据的流通进行管理。它工作于数据链路层,不但能扩展网络的距离或范围,而且可提高网络的性能、可靠性和安全性。网络1 和网络2 通过网桥连接后,网桥接收网络1 发送的数据包,检查数据包中的地址,如果地址属于网络1 ,它就将其放弃,相反,如果是网络2 的地址,它就继续发送给网络2.这样可利用网桥隔离信息,将同一个网络号划分成多个网段 (属于同一个网络号) ,隔离出安全网段,防止其他网段内的用户非法访问。由于网络的分段,各网段相对独立 (属于同一个网络号) ,一个网段的故障不会影响到另一个网段的运行。 网桥可以是专门硬件设备,也可以由计算机加装的网桥软件来实现,这时计算机上会安装多个网络适配器 (网卡) 。 网桥的功能在延长网络跨度上类似于中继器,然而它能提供智能化连接服务,即根据帧的终点地址处于哪一网段来进行转发和滤除。网桥对站点所处网段的了解是靠"自学习"实现的,有透明网桥、转换网桥、封装网桥、源路由选择网桥。 当使用网桥连接两段LAN 时,网桥对来自网段1 的MAC 帧,首先要检查其终点地址。如果该帧是发往网段1 上某一站的,网桥则不将帧转发到网段2 ,而将其滤除;如果该帧是发往网段2 上某一站的,网桥则将它转发到网段2,这表明,如果LAN1和LAN2上各有一对用户在本网段上同时进行通信,显然是可以实现的。 因为网桥起到了隔离作用。可以看出,网桥在一定条件下具有增加网络带宽的作用。 网桥的存储和转发功能与中继器相比有优点也有缺点,其优点是: 使用网桥进行互连克服了物理限制,这意味着构成LAN 的数据站总数和网段数很容易扩充。 网桥纳入存储和转发功能可使其适应于连接使用不同MAC 协议的两个LAN,因而构成一个不同LAN 混连在一起的混合网络环境。 网桥的中继功能仅仅依赖于MAC 帧的地址,因而对高层协议完全透明。 网桥将一个较大的LAN 分成段,有利于改善可靠性、可用性和安全性。 网桥的主要缺点是: 由于网桥在执行转发前先接收帧并进行缓冲,与中继器相比会引入更多时延。由于网桥不提供流控功能,因此在流量较大时有可能使其过载,从而造成帧的丢失。 网桥的优点多于缺点正是其广泛使用的原因。 网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个"低层的路由器" (路由器工作在网络层,根据网络地址如IP地址进行转发) 。 远程网桥通过一个通常较慢的链路 (如电话线) 连接两个远程LAN,对本地网桥而言,性能比较重要,而对远程网桥而言,在长距离上可正常运行是更重要的。 网桥与路由器的比较 网桥并不了解其转发帧中高层协议的信息,这使它可以同时以同种方式处理IP、IPX等协议,它还提供了将无路由协议的网络 (如NetBEUI) 分段的功能。 由于路由器处理网络层的数据,因此它们更容易互连不同的数据链路层,如令牌环网段和以太网段。网桥通常比路由器难控制。像IP等协议有复杂的路由协议,使网管易于管理路由;IP等协议还提供了较多的网络如何分段的信息 (即使其地址也提供了此类信息) 。而网桥则只用MAC地址和物理拓扑进行工作。因此网桥一般适于小型较简单的网络。 ...

Created 4046-12-04 · Updated 9096-10-09 · 2 min · 218 words · -

usermod

usermod # add user to docker group sudo usermod -aG docker $USER 禁止用户登录 usermod -s /sbin/nologin user0 应用举例: 将 newuser2 添加到组 staff 中 usermod -G staff newuser2 修改 newuser 的用户名为 newuser1 usermod -l newuser1 newuser 锁定账号 newuser1 usermod -L newuser1 解除对 newuser1 的锁定 usermod -U newuser1 功能说明: 修改用户帐号。 语法: usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号] 补充说明: usermod可用来修改用户帐号的各项设定。 参数: -a append -c<备注> 修改用户帐号的备注文字。 -d<登入目录> 修改用户登入时的目录。 -e<有效期限> 修改帐号的有效期限。 -f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。 -g<群组> 修改用户所属的群组。 -G<群组> 修改用户所属的附加群组。 -l<帐号名称> 修改用户帐号名称。 -L 锁定用户密码,使密码无效。 -s<shell> 修改用户登入后所使用的shell。 -u<uid> 修改用户ID。 -U 解除密码锁定。 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Linux 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 1016-12-01 · Updated 9096-10-09 · 1 min · 105 words · -

archlinux wireless

archlinux wireless https://wiki.archlinux.org/index.php/Wireless_network_configuration ip link set wlp3s0 up wifi-menu -o netctl start <profile> netctl enable <profile> netctl start wlp0s26f7u5-w1100n ——deleted sudo wpa_supplicant -i wlp0s26f7u5 -c /etc/wpa_supplicant/wpa_supplicant.conf -d sudo dhcpcd wlp0s26f7u5 维护记录 时间 修改内容 原因 2026-10-09 修复本地 Hugo 构建的 Raw HTML 警告:代码/配置放入代码块,正文中的尖括号占位符改为行内代码;categories 改为 Linux 正文中的 HTML/XML 片段被当作原始 HTML 丢弃;文件名/URL/标题按规范调整

Created 26266-04-26 · Updated 9096-10-09 · 1 min · 48 words · -

kill, killall, signal

kill, killall, signal kill by key ps -ef |grep java ps -ef |grep java|awk '{print $2}'|xargs -t -n 1 kill -9 ps -ef |grep java killall 命令 killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。 killall java http://www.cnblogs.com/itech/archive/2012/03/05/2380794.html kill命令用于终止指定的进程 (terminate a process) ,是Unix/Linux下进程管理的常用命令。通常,我们在需要终止某个或某些进程时,先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令的另外一个用途就是向指定的进程或进程组发送信号 (The command kill sends the specified signal to the specified process or process group) ,或者确定进程号为PID的进程是否还在。比如,有许多程序都把 SIGHUP 信号作为重新读取配置文件的触发条件。 一 常用参数 格式: kill <pid> 格式: kill -TERM <pid> 发送SIGTERM信号到指定进程,如果进程没有捕获该信号,则进程终止 (If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal.) ...

Created 17176-09-17 · Updated 9096-10-09 · 5 min · 992 words · -

Perf

Perf 从2.6.31内核开始,linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找。 Perf 是用来进行软件性能分析的工具。 通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。 最初的时候,它叫做 Performance counter,在 2.6.31 中第一次亮相。此后他成为内核开发最为活跃的一个领域。在 2.6.32 中它正式改名为 Performance Event,因为 perf 已不再仅仅作为 PMU 的抽象,而是能够处理所有的性能相关的事件 从2.6.31内核开始,linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找。 perf Performance analysis tools for Linux. Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level (CPU/PMU, Performance Monitoring Unit) features and software features (software counters, tracepoints) as well. Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。 它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。 常用于性能瓶颈的查找与热点代码的定位。 CPU周期(cpu-cycles)是默认的性能事件,所谓的CPU周期是指CPU所能识别的最小时间单元,通常为亿分之几秒, 是CPU执行最简单的指令时所需要的时间,例如读取寄存器中的内容,也叫做clock tick。 ...

Created 31316-08-31 · Updated 9096-10-09 · 7 min · 1365 words · -

Linux 命令选项, 参数,括号, 可选, 必选

Linux 命令选项, 参数,括号, 可选, 必选 https://blog.csdn.net/raoqin/article/details/8875089 []: 内的内容意思是: 可写可不写 例如: /home下就一个list 文件,使用ls -help中的 Usage: ls [OPTION]… [FILE]… {}: 那就必须要在{}内给出的选择里选一个。 <>: 表示必选 在数据库中 Transact-SQL 语法规则 Transact-SQL 引用中的语法关系图使用下列规则。 规范 用于 大写 Transact-SQL 关键字。 斜体 Transact-SQL 语法中用户提供的参数。 | (竖线) 分隔括号或大括号内的语法项目。只能选择一个项目。 [ ] (方括号) 可选语法项目。不必键入方括号。 {} (大括号) 必选语法项。不要键入大括号。 [ ,…n ] 表示前面的项可重复 n 次。每一项由逗号分隔。 [ …n ] 表示前面的项可重复 n 次。每一项由空格分隔。 加粗 数据库名、表名、列名、索引名、存储过程、实用工具、数据类型名以及必须按所显示的原样键入的文本。 <标签> ::= 语法块的名称。此规则用于对可在语句中的多个位置使用的过长语法或语法单元部分进行分组和标记。适合使用语法块的每个位置由括在尖括号内的标签表示: <标签>。 命令行语法字符 在命令行语法中,某些字符与格式有着特殊的意义与含义。 本文档中的命令行语法使用以下字符格式: 方括号 [] 方括号 ( [ ] ) 表示里面的元素 (参数、值或信息) 是可选的。 您可以选择一个或多个条目,也可以不选。 不要将方括号本身也输入到命令行中。 ...

Created 19196-03-19 · Updated 9096-10-09 · 1 min · 185 words · -

ALSA 配置: 默认静音时用 amixer 解除主音量和 PCM 音量静音

理解和使用 alsa 配置-默认静音,必须先用amixer解除主音量和pcm音量的静音 理解和使用alsa配置-默认静音,必须先用amixer解除主音量和pcm音量的静音 http://blog.chinaunix.net/uid-20564848-id-74727.html ALSA声卡驱动程序的配置 对于声卡驱动程序,除了内核自带的驱动程序之外,您还可以使用Advanced Linux Sound Architecture (ALSA,http://www.alsa-project.org/) 提供的驱动程序。它支持一系列主流声卡,同时它和内核 的声音结构互相兼容,在某种程度上,可以说是内核的声卡驱动模块的补充。 ALSA的声卡驱动程序的一般命名规则是snd-card-<soundcard>。soundcard代表不同类型的声卡。例如,对于所有 的16位Soundblaster声卡,它们对应的驱动程序模块为snd-card-sb16。 若与需要linux内核声音驱动的向后兼容性,您还需要两个模块snd-pcm-oss和snd-mixer-oss。对于amixer设置的多个混音 器,它们都是针对不同的设备的。比如CD通道的设置是针对CD播放器的。而很多应用程序,如象mpg123,xmms,realplayer,都要依赖 PCM通道的设置。MIC代表麦克风。不同的Gain部分对于不同的使用能提供特别的增益。 缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。 amixer -c 0 sset ‘Master’,0 100%,100% unmute amixer -c 0 sset ‘PCM ‘,0 100% unmute 选项包括mute,unmute,capture,nocapture,rec,norec,数字或left:right。amixer不带参数运行时, 返回声卡上所有通道的设置情况。 为了在每次插入声卡驱动模块时,都打开静音,您可以在/etc/modules.conf加入下列语句: post-install snd-card-sb16 amixer -c 0 sset ‘Master’,0 100%,100% unmute && amixer -c 0 sset ‘PCM ‘,0 100% unmute 在成功插入了alsa声卡模块之后,系统会出现/proc/asound目录,这个目录描述了声卡的工作情况,以及创建的设备文件。 在您加载snd-pcm-oss设备模块之后,你也能使用与oss兼容的方式存取声卡,这时如下的映射会被完成: 表 5-3 ALSA设备 OSS设备 次设备号 /dev/snd/pcmC0D0 /dev/audio0 (/dev /audio) 4 /dev/snd/pcmC0D0 /dev /dsp0 (/dev/dsp) 3 ...

Created 1016-01-01 · Updated 9096-10-09 · 2 min · 393 words · -

tr command

tr command # 转大写 echo 'hello' | tr '[:lower:]' '[:upper:]' # 转小写 echo 'HELLO' | tr '[:upper:]' '[:lower:]' # 删除文本中的换行符 tr -d '\n' < input.txt > output.txt # 删除空行 cat file | tr -s "\n" > new_file tr -s "[\012]" < plan.txt tr -s ["\n"] < plan.txt 什么是 tr 命令? tr, translate 的简写 \NNN character with octal value NNN (1 to 3 octal digits) \\ backslash \a audible BEL \b backspace \f form feed \n new line \r return \t horizontal tab \v vertical tab CHAR1-CHAR2 all characters from CHAR1 to CHAR2 in ascending order [CHAR*] in SET2, copies of CHAR until length of SET1 [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0 [:alnum:] all letters and digits [:alpha:] all letters [:blank:] all horizontal whitespace [:cntrl:] all control characters [:digit:] all digits [:graph:] all printable characters, not including space [:lower:] all lower case letters [:print:] all printable characters, including space [:punct:] all punctuation characters [:space:] all horizontal or vertical whitespace [:upper:] all upper case letters [:xdigit:] all hexadecimal digits [=CHAR=] all characters which are equivalent to CHAR https://blog.csdn.net/jeffreyst_zb/article/details/8047065 通过使用tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed的 (极其) 简化的变体: 它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr所能够做的。 ...

Created 14146-02-14 · Updated 9096-10-09 · 6 min · 1089 words · -

System Libraries: 跨平台底层库速查

包管理器升级时,经常会看到一些不认识的底层库(harfbuzz、giflib、little-cms2 等)。它们通常不是自己主动装的,而是被某个上层软件依赖,顺带装上。 这篇文章记录这些底层库是什么、做什么、各平台叫什么包名。库本身是跨平台的,macOS(Homebrew)、Linux(apt / pacman / dnf)上都有,因此不按平台拆分。 遇到不认识的包时,怎么在 macOS 上查依赖关系,见 Homebrew (brew)。 索引 库 功能 常见使用方 harfbuzz OpenType 文本整形(text shaping) Pango、Qt、Firefox、Chromium、LibreOffice、OpenJDK freetype 字体解析与字形光栅化 Linux 桌面、Android、OpenJDK、各类游戏引擎 giflib GIF 图片编解码 OpenJDK、ImageMagick libpng PNG 图片编解码 几乎所有图形软件 jpeg-turbo JPEG 编解码(libjpeg 的 SIMD 加速实现) OpenJDK、浏览器、ImageMagick little-cms2 色彩管理(ICC profile) OpenJDK、GIMP、Ghostscript 包名对照 各平台的包名不完全一致,Linux 发行版通常把运行时库和开发头文件拆成两个包,编译其他软件时需要装带 dev / devel 的那个。 库 Homebrew Debian / Ubuntu(开发包) Arch Fedora / RHEL(开发包) harfbuzz harfbuzz libharfbuzz-dev harfbuzz harfbuzz-devel freetype freetype libfreetype-dev freetype2 freetype-devel giflib giflib libgif-dev giflib giflib-devel libpng libpng libpng-dev libpng libpng-devel jpeg-turbo jpeg-turbo libjpeg-dev libjpeg-turbo libjpeg-turbo-devel little-cms2 little-cms2 liblcms2-dev lcms2 lcms2-devel Arch 和 Homebrew 没有 dev / devel 拆分,头文件和库在同一个包里。 ...

Created 22226-09-22 · Updated 22226-09-22 · 2 min · 251 words · -

Open Source Offline Dictionaries 开源离线词典

这篇整理源于给 enx 挑选词典数据源:enx 的取词弹窗需要一份开源、可离线查询的词典数据,于是把常见的开源词典客户端和词库梳理了一遍,作为选型参考。比较下来,目前初步选定 ECDICT 作为 enx 的词典数据源。 概述 离线查词依赖两样东西:词典客户端(软件)和词库文件(数据)。客户端负责检索、取词、发音;词库决定收词量、释义质量和标注信息。下面按数据来源和格式,整理几类常用的开源 / 开放词库。 常见客户端与开放词库: 名称 类型 平台 主要格式 ECDICT 词库数据 — CSV、SQLite、StarDict、MDX、欧陆、MOBI Wiktionary 词库数据 — JSON(wiktextract)、XML dump、StarDict / MDX 转换版 GoldenDict 客户端 Linux / Windows / macOS StarDict、MDX StarDict / 星际译王 客户端 Linux / Windows StarDict sdcv 客户端 命令行 StarDict MDict 客户端 Windows / Android / iOS MDX / MDD 欧陆词典 客户端 全平台 欧陆原生 / MDX Bob 客户端 macOS 多种插件后端 ECDICT ECDICT 是 skywind3000 维护的英文→中文双解词典数据库,MIT 协议。收词量大,每条记录除中英文释义外,还标注考试大纲(四六级、雅思、托福等)、柯林斯星级、牛津 3000、BNC / COCA 词频,以及动词时态变形(exchange 字段)。 ...

Created 23236-05-23 · Updated 8086-09-08 · 2 min · 358 words · -

linux apps

Linux Apps 跨平台常用软件统一维护于 my apps,本文只记录 Linux 专属工具。 说明 pacman — sudo pacman -S aur — yay -S apt — sudo apt install Essentials 跨平台工具详见 my apps,以下是 Linux 上的安装命令速查: app source notes kitty pacman terminal neovim pacman 编辑器 flameshot pacman 截图+标注 bitwarden pacman 密码管理 btop pacman top 替代 wechat aur visual-studio-code-bin aur VSCode 官方二进制版 Browser Ubuntu install Chrome curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo apt install ./google-chrome-stable_current_amd64.deb Terminal app source notes termite pacman 支持 32 位色 Text Editor app source notes mousepad pacman 轻量文本编辑器 nixnote2-git aur Evernote Linux 客户端 Screenshot / Recording app source notes spectacle pacman KDE 原生截图 simplescreenrecorder pacman 录屏 gtk-recordmydesktop aur 录屏 shutter aur 截图,需配合 perl-goo-canvas System Monitor app source notes ncdu pacman/apt 命令行磁盘空间分析 netdata pacman 系统资源监控 indicator-sysmonitor apt 任务栏系统资源监控 nethogs pacman 网络流量监控 dstat pacman 查看系统性能 dstat -cdlmnpsy slurm aur 网络监控 hardinfo-git aur 硬件信息查看 System Info app source notes fastfetch pacman 打印发行版 logo neofetch pacman/apt 系统信息(已停止维护) stress pacman 压力测试 hdparm pacman 磁盘参数查看 procmon aur 微软的进程监控工具 File Management app source notes filelight pacman 图形化磁盘空间管理 baobab apt 硬盘占用分析工具 catfish pacman 文件搜索 tree apt 树形目录显示 tree -L N nautilus apt Ubuntu 默认文件管理器 Archive / Compression app source notes ark pacman KDE 压缩包管理器 file-roller pacman zip/7z/rar 支持 rar/unrar apt Media / Graphics app source notes digikam pacman KDE 最佳图片管理 gwenview pacman KDE 图片查看 eog apt Eye of Gnome 图片查看 okular pacman PDF reader gpick pacman 颜色拾取工具 Remote Desktop app source notes chrome-remote-desktop aur Google 远程桌面主机 remmina pacman GTK 远程桌面客户端 freerdp pacman remmina RDP 支持包 rdesktop pacman Development Tools app source notes base-devel pacman 编译工具链 lsof pacman hexyl pacman 彩色 hex 编辑器 lrzsz pacman zmodem binutils pacman 二进制文件处理工具集 inetutils pacman telnet 等网络工具 kotlin pacman glow pacman 命令行 markdown 预览 Fonts app source notes ttf-wqy-microhei apt 文泉驿-微米黑 ttf-wqy-zenhei apt 文泉驿-正黑 xfonts-wqy apt 文泉驿-点阵宋体 ttf-consolas-with-yahei-powerline-git aur Consolas+雅黑 ttf-wps-fonts aur WPS 字体依赖 KDE sudo pacman -S powerdevil kmix kscreen ark gwenview kcolorchooser app source notes powerdevil pacman 电源管理,休眠按钮 kmix pacman 音量调节 kscreen pacman 多显示器管理 kcolorchooser pacman 颜色拾取 KDE Widget name notes netspeed widget 网络监控 resources monitor CPU/内存监控 Plasma Week Number 显示周数 Virtualization app source notes kvm pacman wine pacman 需开启 Multilib 仓库 playonlinux pacman Wine 图形前端 podlet aur podman 辅助工具 Utilities app source notes rsibreak pacman 番茄钟 gnome-shell-pomodoro apt Pomodoro pavucontrol apt Chrome 音频输出设置 sl pacman 小火车 x11-apps apt xclock, xserver 测试用 pamac-aur aur 图形界面的 pacman libiconv aur 编码转换 Ventoy — 各种 ISO 安装盘引导工具 References Arch Linux List of Applications 维护记录 时间 修改内容 原因 2026-07-28 Development Tools 表格补充 glow(命令行 markdown 预览工具) 新增常用软件

Created 5056-05-05 · Updated 28286-07-28 · 2 min · 404 words · w10n

Linux TTY 与伪终端 PTY

TTY 是什么 tty 一词源自 teletype(电传打字机):通过串行线,键盘输入和打印机输出来回传递信息的设备,现在这个词泛指所有类型的终端设备。终端是一种字符型设备。 在支持多任务的计算机出现之前,两台 teletype 直接用物理线路相连: +----------+ Physical Line +----------+ | teletype |<--------------------->| teletype | +----------+ +----------+ 计算机支持多任务之后,人们把这些 teletype 接到计算机上当终端用(一是当时已有大量现成的 teletype 设备,二是相关网络已经比较成熟),连接方式变成: +----------+ +----------+ +-------+ Physical Line +-------+ +------+ | | | Terminal |<->| Modem |<--------------------->| Modem |<->| UART |<->| Computer | +----------+ +-------+ +-------+ +------+ | | +----------+ 左边的 Terminal 就是各种 teletype;物理线路两端接的 Modem 就是我们常说的"猫";UART 负责把 teletype 的信号转换成计算机能识别的信号。 /dev 下的几类终端设备文件 类型 设备文件 说明 串行端口终端 /dev/ttySn(如 /dev/ttyS0) 通过计算机串口连接的终端,对应 DOS 下的 COM1、COM2 等;echo test > /dev/ttyS1 可以把 test 发送到接在该端口上的设备 伪终端 /dev/pty/(成对出现,如 ptyp3/ttyp3) 一对逻辑终端设备,不直接对应物理硬件;一端读写会反映到另一端,类似管道;ttyp3 供普通程序当串口用,ptyp3 需要专门设计的程序(如 telnet、getty)使用 控制终端 /dev/tty 当前进程的控制终端;ps -ax 可查看进程关联的控制终端,tty 命令可查看具体对应哪个实际设备 控制台终端 /dev/ttyn、/dev/console UNIX 里显示器通常称为控制台;tty1-tty6 是虚拟终端,Alt+F1~F6 切换,tty0 是当前虚拟终端的别名,系统信息统一发到这里 其它 例如 /dev/ttyIn 针对 ISDN 等具体设备的终端特殊文件 pty:伪终端 如果是远程 telnet 到主机,或者用 xterm,并没有物理终端,这时候就要靠伪终端 pty(pseudo-tty)。 ...

Created 11116-08-11 · Updated 26266-07-26 · 7 min · 1464 words · -

2026 W29

从 HashMap 关联到的 上周说面试复盘整理了一部分,这周继续。blog 里 Java 相关的文档以前记得有些零散,重新整理一下。 HashMap 关联的东西其实挺多的… 先是解决哈希冲突主要的两条路:开链法和开放地址法。链表长到一定程度会转成红黑树,于是又去看了红黑树。哈希值怎么来的又牵出随机数——xorshift、LCG。再往下是 CPU 层面的事:加法/乘法/除法消耗的时钟周期不一样,缓存的空间局部性会直接影响这类数据结构的实际性能。横向看,Python 的 dict、Go 的 map 用的 Swiss Table,思路各不相同。 Swiss Table 这条又牵出 SIMD,还挺有意思的。1997 年的 Pentium MMX 就带了 MMX 指令集,不过只能做整数;AMD 1998 年 K6-2 上的 3DNow! 把单精度浮点加了进来;到 1999 年 Pentium III 的 SSE,才有了独立的 128 位寄存器。早年这套指令主要是拿来做多媒体和图形的。 而 Swiss Table 用 SIMD 一次比对一组控制字节来定位槽位,Go 的 map 后来换成了这个结构——中间隔了二十多年。一个 90 年代末为了跑多媒体加进来的特性,现在被用来加速哈希表的查找。 JVM 这边也一并整理了:HotSpot 的 GC 和 JIT。中间还跑偏去看了下 Linux 的进程调度。 starlabrys:把公司的壳先搭起来 和朋友聊天,有人找到了工作但不太理想,有人还在面试。我之前注册了营业执照,就在想我们是不是可以一起做点什么。 有人建议建一个 GitHub organization,这样想贡献代码的人可以加进来。公司暂时没业务,但有件事是现在就能做的——把官网建起来。 于是注册了域名 starlabrys.com,建了 GitHub org,把仓库和权限用 OpenTofu 管起来,后来又把这部分 IaC 从我自己的配置仓库拆出去,单独放进了 starlabrys-infra。 ...

Created 19196-07-19 · Updated 19196-07-19 · 1 min · 126 words · -

CFS, Completely Fair Scheduler 完全公平调度器

CFS(Completely Fair Scheduler,完全公平调度器)是 Linux 普通进程(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE)曾经使用的调度算法,自 2007 年发布的 Linux 2.6.23 版本起取代了此前的 O(1) 调度器,用红黑树替代了原来的按优先级分桶的数组结构(调度器体系的整体介绍见 Linux 进程调度)。 需要先说明的是:CFS 已经不是当前内核的默认实现。从 2023 年 10 月发布的 Linux 6.6 起,普通进程的默认调度算法换成了 EEVDF,CFS 退居历史。本文仍以 CFS 为主,因为它的 vruntime 和红黑树是理解现在这套调度器的基础。 EEVDF:6.6 之后的默认调度器 EEVDF(Earliest Eligible Virtual Deadline First,最早合格虚拟截止时间优先)由 Peter Zijlstra 实现并在 Linux 6.6 合入,取代 CFS 成为 SCHED_NORMAL 等普通调度策略的默认算法。算法本身并不新,出自 Ion Stoica 和 Hussein Abdel-Wahab 1995 年的一篇论文。 它要解决的是 CFS 的一个短板:CFS 只保证长期的 CPU 时间份额公平,但对"什么时候该轮到我"没有约束,交互式任务的调度延迟不好控制。CFS 时期只能靠 sched_latency_ns 之类的旋钮和一些启发式补偿去调,效果有限。 EEVDF 引入两个概念: lag:进程"应得的 CPU 时间"与"实际获得的 CPU 时间"之差。lag 大于等于 0 说明它还欠着账,才有资格(eligible)被调度;lag 为负说明它已经超额使用,暂时靠边。 virtual deadline:在合格的进程中,按各自请求的时间片长度算出一个虚拟截止时间,调度器每次挑选虚拟截止时间最早的那个。 这样一来,份额公平由 lag 保证,响应延迟由 deadline 保证,需要低延迟的任务可以通过请求更短的时间片来更频繁地被调度,而不必牺牲它的总 CPU 份额。 ...

Created 14146-07-14 · Updated 19196-07-19 · 2 min · 350 words · -

Linux Process Scheduling, 进程调度

进程调度概述 操作系统要实现多进程,进程调度必不可少。进程调度是对 TASK_RUNNING 状态的进程进行调度(进程状态详见 Linux Process State, 进程状态)。如果进程不可执行(正在睡眠或其他),那么它跟进程调度没多大关系。 所以,如果系统负载非常低,盼星星盼月亮才出现一个可执行状态的进程,那么进程调度也就不会太重要,哪个进程可执行就让它执行去,没有什么需要多考虑的。 反之,如果系统负载非常高,时时刻刻都有 N 多个进程处于可执行状态,等待被调度运行,那么进程调度程序为了协调这 N 个进程的执行,必定得做很多工作。协调得不好,系统的性能就会大打折扣,这个时候,进程调度就是非常重要的。 尽管我们平常接触的很多计算机(如桌面系统、网络服务器等)负载都比较低,但是 Linux 作为一个通用操作系统,不能假设系统负载低,必须为应付高负载下的进程调度做精心的设计。 当然,这些设计对于低负载(且没有什么实时性要求)的环境没多大用。极端情况下,如果 CPU 的负载始终保持 0 或 1(永远都只有一个进程或没有进程需要在 CPU 上运行),那么这些设计基本上都是徒劳的。 优先级 现在的操作系统为了协调多个进程的"同时"运行,最基本的手段就是给进程定义优先级。定义了进程的优先级,如果有多个进程同时处于可执行状态,那么谁优先级高谁就去执行,没有什么好纠结的了。 进程的优先级该如何确定呢?有两种方式:由用户程序指定、由内核的调度程序动态调整。Linux 内核将进程分成两个级别:普通进程和实时进程。实时进程的优先级都高于普通进程,除此之外,它们的调度策略也有所不同。 实时进程的调度 实时,原本的涵义是"给定的操作一定要在确定的时间内完成"。重点并不在于操作一定要处理得多快,而是时间要可控(在最坏情况下也不能突破给定的时间)。 这样的"实时"称为"硬实时",多用于很精密的系统之中(比如火箭、导弹之类的)。一般来说,硬实时的系统是相对比较专用的。 像 Linux 这样的通用操作系统显然没法满足这样的要求,中断处理、虚拟内存等机制的存在给处理时间带来了很大的不确定性,硬件的 cache、磁盘寻道、总线争用也会带来不确定性。 比如考虑 i++; 这么一句 C 代码,绝大多数情况下它执行得很快,但是极端情况下还是有这样的可能: i 的内存空间未分配,CPU 触发缺页异常,而 Linux 在缺页异常的处理代码中试图分配内存时,又可能由于系统内存紧缺而分配失败,导致进程进入睡眠; 代码执行过程中硬件产生中断,Linux 进入中断处理程序而搁置当前进程,而中断处理程序的处理过程中又可能发生新的硬件中断,中断永远嵌套不止…… 而像 Linux 这样号称实现了"实时"的通用操作系统,其实只是实现了"软实时",即尽可能地满足进程的实时需求。 如果一个进程有实时需求(它是一个实时进程),则只要它是可执行状态的,内核就一直让它执行,以尽可能地满足它对 CPU 的需要,直到它完成所需要做的事情,然后睡眠或退出(变为非可执行状态)。 而如果有多个实时进程都处于可执行状态,则内核会先满足优先级最高的实时进程对 CPU 的需要,直到它变为非可执行状态。于是,只要高优先级的实时进程一直处于可执行状态,低优先级的实时进程就一直不能得到 CPU;只要一直有实时进程处于可执行状态,普通进程就一直不能得到 CPU。 后来,内核添加了 /proc/sys/kernel/sched_rt_runtime_us 和 /proc/sys/kernel/sched_rt_period_us 两个参数,限定了在以 sched_rt_period_us 为周期的时间内,实时进程最多只能运行 sched_rt_runtime_us 这么多时间,这样就在一直有实时进程处于可执行状态的情况下,给普通进程留了一点点能够得到执行的机会。 那么,如果多个相同优先级的实时进程都处于可执行状态呢?这时就有两种调度策略可供选择: SCHED_FIFO:先进先出,直到先被执行的进程变为非可执行状态,后来的进程才被调度执行。在这种策略下,先来的进程可以调用 sched_yield 系统调用,自愿放弃 CPU,以让权给后来的进程; SCHED_RR:轮转调度,内核为实时进程分配时间片,在时间片用完时,让下一个进程使用 CPU; 强调一下,这两种调度策略仅仅针对于相同优先级的多个实时进程同时处于可执行状态的情况。 ...

Created 10106-02-10 · Updated 14146-07-14 · 3 min · 584 words · -

Scheduler Design Patterns, 调度器设计:抢占与协作

为什么会发生调度?因为 CPU 是有限的,而操作系统上的进程很多,所以操作系统需要平衡各个进程的运行时间。比如说有的进程运行时间已经很长了,已经占用了 CPU 很长时间了,这个时候操作系统要公平,就会换下一个需要运行的进程。 抢占 vs 协作 从调度机制上来讲,调度可以分为抢占式和协作式。 非抢占,协作 非抢占方式是指一旦将调度资源(如 CPU)分配给某任务后,便让该任务一直执行,直到该任务完成或阻塞或主动让出 CPU 控制权,非抢占调度又称为协作式调度,它实现简单,并且对共享资源的访问也更安全(如允许使用不可重入函数)。非抢占算法常见的如 FIFO、STCF(Short Time to Complete First)等。 抢占 抢占方式则允许调度程序根据某种规则,剥夺当前进程的调度资源,将其分配给其它进程。常见的抢占策略有: 基于时间片 给每个进程分配时间片,当时间片用完后,则停止该进程重新调度下一个进程,这种均分 CPU 的算法,又叫轮转调度算法。 基于优先级 给每个进程分配一个优先级,一旦出现一个优先级更高的进程,则停止当前进程并切换到该高优先级进程,这种调度算法又叫优先级抢占。轮转调度和优先级抢占结合,即相同优先级的进程使用轮转调度,如果遇到更高优先级的进程,则可抢占 CPU,现代 OS 如 Linux 通常都使用这种混合调度策略(Linux 具体的调度器体系见 Linux 进程调度)。 基于优先级抢占容易出现优先级反转的问题:优先级低的任务持有一个被优先级高的任务所需要的共享资源,这种情况下,优先级低的任务有资源而得不到 CPU,优先级高的任务有 CPU 而得不到资源,从而阻塞(导致其它中优先级的任务获得执行)或者忙等(可能永远无法获得资源)。 解决优先级反转的方案: 给临界区一个高优先级,所有进入该临界区的任务将获得该高优先级,避免其被随意抢占; 当高优先级任务在等待低优先级进程持有资源时,低优先级进程将暂时获得高优先级进程的优先级,VxWorks 采用的方式; 禁止中断,也就是在临界区不可被抢占,Linux 采用的就是这种方式,在 thread_info.preempt_count 记录每个进程当前持锁计数; 另外,调度器是不能在进程指令流的任意一点执行打断的,因为进程可能此时正在做任何事情,如系统调用、死循环、锁操作等,要实现任意状态的可抢占性代价是很大的,需要 OS 和 App 的通力配合,特别是在涉及内核态的时候,目前所有 OS 都不能在进程执行的任意点进行抢占,只是说不断让抢占区更大、抢占点尽可能地密集。 实时 vs 非实时 从系统需求或用户角度而言,调度系统可以分为实时系统和非实时系统。 在实时操作系统中,系统必须在特定的时间内完成指定的应用。实时通常分为软实时(soft real-time)和硬实时(hard real-time),硬实时是指系统要有确定的最坏情况下的服务时间,即对于事件的响应时间截止期限无论如何都必须得到满足,通常应用在军工航天领域;而软实时只提供统计意义上的实时,比如应用要求在 95% 的情况下都会确保在规定的时间内执行某个任务,而不一定要求 100%。实时系统通常采用抢占调度,实现一个硬实时系统的代价是很高的,要做到进程可以在任意时刻被抢占,在现代 OS 上来讲基本是不可能的,因为 OS 的很多系统调用都是不可被打断的,并且很多操作具备时间的随机性,比如 CPU Cache Miss、Page Fault、CPU 分支预测器等等。 ...

Created 27276-04-27 · Updated 14146-07-14 · 2 min · 387 words · -

Linux Process State, 进程状态

Linux(本文以 4.8.4 内核为例)下,进程状态大致有 7 种: 进程状态 说明 TASK_RUNNING 可运行状态。未必正在使用 CPU,也许是在等待调度 TASK_INTERRUPTIBLE 可中断的睡眠状态。正在等待某个条件满足 TASK_UNINTERRUPTIBLE 不可中断的睡眠状态。不会被信号中断 __TASK_STOPPED 暂停状态。收到某种信号,运行被停止 __TASK_TRACED 被跟踪状态。进程停止,被另一个进程跟踪 EXIT_ZOMBIE 僵尸状态。进程已经退出,但尚未被父进程或者 init 进程收尸 EXIT_DEAD 真正的死亡状态 在 include/linux/sched.h 中,进程状态的定义并没有那么少: /* * Task state bitmask. NOTE! These bits are also * encoded in fs/proc/array.c: get_task_state(). * * We have two separate sets of flags: task->state * is about runnability, while task->exit_state are * about the task exiting. Confusing, but this way * modifying one set can't modify the other one by * mistake. */ #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define __TASK_STOPPED 4 #define __TASK_TRACED 8 /* in tsk->exit_state */ #define EXIT_DEAD 16 #define EXIT_ZOMBIE 32 #define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD) /* in tsk->state again */ #define TASK_DEAD 64 #define TASK_WAKEKILL 128 #define TASK_WAKING 256 #define TASK_PARKED 512 #define TASK_NOLOAD 1024 #define TASK_NEW 2048 #define TASK_STATE_MAX 4096 #define TASK_STATE_TO_CHAR_STR "RSDTtXZxKWPNn" extern char ___assert_task_state[1 - 2*!!( sizeof(TASK_STATE_TO_CHAR_STR)-1 != ilog2(TASK_STATE_MAX)+1)]; /* Convenience macros for the sake of set_task_state */ #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE) #define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED) #define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED) #define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) /* Convenience macros for the sake of wake_up */ #define TASK_NORMAL (TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE) #define TASK_ALL (TASK_NORMAL | __TASK_STOPPED | __TASK_TRACED) /* get_task_state() */ #define TASK_REPORT (TASK_RUNNING | TASK_INTERRUPTIBLE | \ TASK_UNINTERRUPTIBLE | __TASK_STOPPED | \ __TASK_TRACED | EXIT_ZOMBIE | EXIT_DEAD) TASK_RUNNING TASK_RUNNING 是教科书中两种状态的结合:一种是正在占用 CPU 的 RUNNING 状态,一种是 RUNNING 状态的进程时间片耗尽、或者主动让出 CPU、或者被更高优先级进程抢占后,进入的 READY 状态。处于 TASK_RUNNING 状态的进程要么正在 CPU 上运行,要么随时都可以投入运行,只不过 CPU 资源有限,调度器暂时没有选中它们。 ...

Created 14146-06-14 · Updated 14146-07-14 · 7 min · 1324 words · -

COSMIC 桌面环境与 cosmic-greeter

什么是 COSMIC COSMIC(“Computer Operating System Main Interface Components”)是 System76(Pop!_OS 的厂商)用 Rust + iced 从零重写的新一代桌面环境,用来替代 Pop!_OS 之前基于 GNOME Shell 深度定制的 Pop Shell。 Compositor:cosmic-comp,基于 Smithay(Rust 的 Wayland compositor 库),只支持 Wayland,不支持 X11。 UI 工具包:iced(Rust 原生 GUI 库),不依赖 GTK 或 Qt。 特点:内置类似平铺窗口管理器的窗口平铺/浮动切换,风格上介于 GNOME 的简洁与传统桌面(面板 + 应用列表 + 系统托盘)之间。 现状(2026-07):Arch extra 仓库已提供稳定打包(当前 1.2.0-1),可通过包组 cosmic 一次性安装。 KDE Plasma 对比 COSMIC 维度 KDE Plasma COSMIC 实现语言/工具包 C++ / Qt + QML Rust / iced 显示协议 X11 + Wayland 双支持 仅 Wayland(cosmic-comp 基于 Smithay) 项目历史 1996 年至今,成熟度极高 2022 年立项,2024~2025 年逐步稳定,仍在快速迭代 窗口管理风格 浮动窗口为主,插件式支持平铺(如 KWin 脚本、Bismuth) 原生内置平铺/浮动切换,无需插件 可定制程度 极高:几乎每个组件(面板、快捷键、主题、特效)都可深度配置 目前较克制,配置项比 Plasma 少很多,走"够用即可"路线 默认发行版 Kubuntu、openSUSE、Arch 等(无绑定) Pop!_OS(System76 主推,未来默认桌面) 资源占用 中等,特效多时略高 更轻量,Rust 实现 + 无 Qt/GTK 依赖 应用生态 庞大(KDE Applications 套件:Dolphin、Kate、Okular、Konsole 等) 尚在建设中(cosmic-files、cosmic-terminal、cosmic-text-editor 等基础应用刚起步) 主题/外观定制 支持第三方主题、图标包、Global Theme 一键换肤 目前主题选择有限,风格由官方统一把控(类似 GNOME 的"少即是多"哲学) 登录界面集成 SDDM(KWallet 自动解锁等深度集成) cosmic-greeter(greetd),风格与桌面统一,但生态集成不如 SDDM 成熟 适合人群 想要高度自定义、功能全面、多年验证的稳定桌面 想尝鲜 Rust 生态新桌面、偏好简洁一致设计、愿意接受少数功能还不完善 一句话总结:Plasma 是"功能全面、可深度定制"的成熟老牌桌面;COSMIC 是"简洁统一、技术栈新颖"的年轻桌面,目前更适合尝鲜和轻量使用,还不建议完全替代 Plasma 作为主力日常桌面。 ...

Created 12126-07-12 · Updated 12126-07-12 · 3 min · 447 words · -