Linux per memcg lru lock

AI生产环境故障根因:基础设施层隐性失配解析 AI系统在生产环境中频繁出现延迟突增、精度下降、OOM等异常,并非模型本身缺陷,而是底层基础设施与AI工作负载之间存在隐性失配。其本质源于Linux内存管理、CPU调度策略、网络栈参数、存储IO行为以及时钟同步机制等物理与内核层约束未被适配。这类问题具有高隐蔽性、低可观测性、强环境依赖性等特点,传统MLOps工具链普遍缺乏对cgroup v2、NUMA拓扑、eBPF可观测性及硬件微架构影响的建模能力。本书聚焦AI工程化中最易被忽视的‘基础设施土壤’,通过真实P0事故还原、内核级诊断脚本与可验证调优清单,帮助 阅读详情

内核关于per memcg lru lock的重要提交:

f9b1038ebccad354256cf84749cbc321b5347497

6168d0da2b479ce25a4647de194045de1bdd1f1d

背景

自电子计算机诞生以来,内存性能一直是行业关心的重点。内存也随着摩尔定律,在大小和速度上一直增长。云服务器动辄单机接近 TB 的内存大小,加上数以百记的 CPU 数量也着实考验操作系统的资源管理能力。

作为世间最流行的操作系统 Linux, 内核使用 LRU(Last Recent Used)链表来管理全部用户使用的内存,用一组链表串联起一个个的内存页,并且使用 lru lock 来保护链表的完整性。

所有应用程序常用操作都会涉及到 LRU 链表操作,例如,新分配一个页,需要挂在 inactive lru 链上, 2 次访问同一个文件地址, 会导致这个页从 inactive 链表升级到 active 链表, 如果内存紧张, 页需要从 active 链表降级到inactive 链表, 内存有压力时,页被回收导致被从 inactive lru 链表移除。不单大量的用户内存使用创建,回收关系到这个链表, 内核在内存大页拆分,页移动,memcg 移动,swapin/swapout, 都要把页移进移出 lru 链表。

可以简单计算一下 x86 服务器上的链表大小:x86 最常用的是 4k 内存页, 4GB 内存会分成 1M 个页, 如果按常用服务器 256GB 页来算, 会有超过 6 千万个页挂在内核 lru 链表中。超大超长的内存链表和频繁的 lru 操作造成了 2 个著名的内核内存锁竞争, zone lock 和 lru lock。这 2 个问题也多次造成麻烦,系统很忙,但是业务应用并没得到多少 cpu 时间, 大部分 cpu 都花在 sys 上了。一个简单 2 次读文件的 benchmark 可以显示这个问题, 它可以造成 70% 的 cpu 时间花费在 LRU lock 上。https://git.kernel.org/pub/scm/Linux/kernel/git/wfg/vm-scalability.git/tree/case-lru-file-readtwice

作为一个知名内核性能瓶颈, 社区也多次尝试以各种方法解决这个问题, 例如,使用更多的 LRU list, 或者 LRU contention 探测(https://lwn.net/Articles/753058/)。

但是都因为各种原因被 Linux 内核拒绝。

寻找解决方案

通过仔细的观察发现, 内核在 2008 年引进内存组 -memcg 以来, 系统单一的 lru lists 已经分成了每个内存组一个 lru list, 由每个内存组单独管理自己的 lru lists。那么按道理 lru lock 的 contention 应该有所减小啊?为什么还是经常在内部服务器观察到 lru lock hot 引起的 sys 高?

原来, 内核在引入 per memcg lru lists 后,并没有使用 per memcg lru lock, 还在使用旧的全局 lru lock 来管理全部 memcg lru lists。这造成了本来可以自治的 memcg A, 却要等待 memcg B 释放使用的 lru lock。然后 A 拿起的 lru lock 又造成 memcg C 的等待。

那么把全局 lru lock 拆分到每一个 memcg 中, 不是可以理所当然的享受到了 memcg 独立的好处了吗?这样每个memcg 都不会需要等待其他 memcg 释放 lru lock。锁竞争限制在每个 memcg 内部了。

要完成 lru lock 拆分,首先要知道 lru lock 保护了多少对象, 通常情况中, page lru lock 需要保护 lru list 完整性, 这个是必须的。与 lru list 相关的还有 page flags 中的 lru bit,这个 lru bit 用作页是否在 lru list 存在的指示器, 可以避免查表才能知道页是否在 list 中。那么 lru lock 保护它也说的通。

但是 lru lock 看起来还有一些奇怪的保护对象,承担了一些不属于它的任务:

1. PageMlock bit 保护 munlock_vma 和 split_huge_page 冲突,

其实, 上述 2 个函数在调用链中都需要 page lock, 所以冲突可以完全由 page lock 来保证互斥。这里 lru lock 使用属于多余。

2. pagecache xa_lock 和 memcg->move_lock,

xa_lock 并没有需要 lru lock 保护的场景,这个保护也是多余。相反,lru lock 放到 xa_lock 之下, 符合xa_lock/lock_page_memcg 的使用次序。反而可以优化 lru lock 和 memcg move_lock 的关系。

3. lru bit in page_idle_get_page 用在这里是因为担心 page_set_anon_rmap 中, mapping 被提前预取访问,造成异常。用 memory barrier 方式可以避免这个预取, 所以可以在 page idle 中撤掉 lru lock。

+  WRITE_ONCE(page->mapping, (struct address_space *) anon_vma);

经过这样的修改, lru lock 可以在 memory lock 调用层次中降级到最底层。

这时,lru lock 已经非常简化,可以用 per memcg lru lock 来替换全局的 lru lock 了吗?还不行,使用 per memcg lru lock 有一个根本问题,使用者要保证 page 所属的 memcg 不变,但是页在生命周期中是可能转换 memcg 的,比如页在 memcg 之间 migration,导致 lru_lock 随着 memcg 变化, 拿到的 lru lock 是错误的,好消息是 memcg 变化也需要先拿到 lru lock 锁,这样我们可以获得 lru lock 之后检查这个是不是正确的锁:

如果不是, 由反复的 relock 来保证锁的正确性。bingo!完美解决!

由此, 这个 feature 曲折的 upstream 之路开始了。

最终解决

这个 patchset 2019 年发出到社区之后, Google 的 Hugh Dickins 提出, 他和 facebook 的 Konstantin Khlebnikov 同学已经在 2011 发布了非常类似的 patchset,当时没有进主线。不过 Google 内部生产环境中一直在使用。所以现在 Hugh Dickins 发出来他的 upstream 版本。关键路径和我的版本是一样的。

2 个相似 patchset 的 PK, 引起了memcg 维护者 Johannes 的注意, Johannes 发现在 compaction 的时候, relock 并不能保护某些特定场景:

所以他建议,也许增加原子的 lru bit 操作作为 lru_lock 的前提也许可以保护这个场景。Hugh Dickins 则不认为这样会有效,并且坚持他 patchset 已经在 Google 内部用了 9 年了。一直安全稳定。

Johannes 的建议的本质是使用 lru bit 代替 lru lock 做 page isolation 互斥,但是问题的难点在其他地方, 比如在通常的一个 swap in 的场景中:

swap in 的页是先加入 lru,然后 charge to memcg,这样造成页在加入 lru 时,并不知道自己会在那个 memcg 上, 我们也拿不到正确的 per memcg lru_lock,所以上面场景中左侧 CPU 即使提前检查 PageLRU 也找不到正确的 lru lock 来阻止右面 cpu 的操作, 然并卵。

正确的解决方案, 就是上面第 9 步移动到第 7 步前面, 在加入 lru 前 charge to memcg。并且在取得 lru lock 之前检查lru bit是否存在, 这样才可以保证我们可以拿到的是正确的 memcg 的 lru lock。由此提前清除/检查 lru bit 的方法才会有效。这个 memcg charge 的上升, 在和Johannes讨论后, Johannes 在 5.8 完成了代码实现并且和入主线。

在新的代码基础上, 增加了 lru bit 的原子操作 TestClearPageLRU, 把 lru bit 移出了 lru lock 的保护,相反用这个 bit 来做 page isolation 的互斥条件, 用 isolation 来保护页在 memcg 间的移动, 让 lru lock 只完成它的最基本任务, 保护 lru list 完整性。至此方案主体完成。lru lock 的保护对象也由 6 个减小到一个。编码实现就很容易了。

测试结果

方案完成后, 上面提到的 file readtwice 测试中,多个 memcg 的情况下,lru lock 竞争造成的 sys 从 70% 下降了一半,throughput 提高到260%(80 个 cpu 的神龙机器)。

Upstream 过程

经过漫长 4 轮的逐行 review, 目前这个 feature 已经进入了 linus 的 5.11。https://github.com/torvalds/Linux

第一版 patch 发到了社区后, Google 的 skakeel butt 立刻提出, Google 曾经在 2011 发过一样的 patchset 来解决 per memcg lru lock 问题。所以,skakeel 要求我们停止自己开发, 基于 Google 的版本来解决这个问题。然后我才发现真的 2011 年 Google Hugh Dickins 和 Facebook Konstantin Khlebnikov 就大约同时提出类似的 patchset。但是当时引起的关注比较少,也缺乏 benchmark 来展示补丁的效果, 所以很快被社区遗忘了。不过 Google 内部则一直在维护这组补丁,随他们内核版本升级。

对比 Google 的补丁,我们的实现共同点都是使用 relock 来确保 page->memcg 线性化, 其他实现细节则不尽相同。测试表明我们的 patch 性能更好一点。于是我基于自己的补丁继续修改并和 Johannes 讨论方案改进。这也导致了以后每一版都有 Google 同学的反对:我们的测试发现你的 patchset 有 bug,请参考 Google 可以工作的版本。并在 Linux-next 上发现一个小 bug 时达到顶峰(https://lkml.org/lkml/2020/3/6/627)。Google 同学批评我们抄他们的补丁还抄出一堆 bug。

其实这些补丁和 Hugh Dickins 的补丁毫无关联, 并且在和 Johannes 的持续讨论中,解决方案的核心:page->memcg 的线性化已经进化了几个版本了, 从 relock 到 lock_page_memcg,再到 TestClearPageLRU,和 Google 的补丁是路线上的不同。

面对这样的无端指责,memcg 维护者 Johannes 看不下去, 出来说了一些公道话:我和 Alex 同学都在尝试和你不同的方案来解决上次提出的 compacion 冲突问题,而且我记得你当时是觉得这个冲突你无能为力的:

之后 Google 同学分享了他们的测试程序,然后在这个话题上沉默了一段时间。

后来 memcg charge 的问题解决后, 就可以用 lru bit 来保证 page->memcg 互斥了。v17 coding 很快完成后。intel 的 Alexander Duyck,花了 5 个星期, 逐行逐字的 review 整个 patchset,并其基于补丁的改进, 提出了一些后续优化补丁。5 个星期的 review, 足以让一个 feature 错过合适的内核 upstream 窗口。但是也增强了社区的信心。

(重大内核的feature 的merge窗口是这样的:大的 feature 在进入 linus tree 之前, 要在 Linux-next tree 待一段时间, 主要的社区测试如 Intel LKP、Google syzbot 等等也会在着重测试 Linux-next。所以为了保证足够的测试时间, 进入下个版本重要 feature 必须在当前版本的 rc4 之前进入 Linux-next。而当前版本 -rc1 通常 bug 比较多,所以最佳 rebase 版本是 rc2,错过最佳 merge 窗口 rc2-rc4. 意味着需要在等2个月到下一个窗口。并且还要适应新的内核版本的相关修改。)

基于 5.9-rc2 的 v18 版本完成后, Google hugh dickins 同学强势归来,主动申请测试和 review,根据他的意见 v18 做了很多删减和合并,甚至推翻了一些 Alexander Duyck 要求的修改。patch 数量从 32 个压缩到 20 个。Hugh Dickin 逐行 review 了整整 4 个星期。也完美错过了 5.10 和入窗口。之后 v19,Johannes 同学终于回来开始 review。Johannes 比较快,一个星期就完成了 review。现在 v20, 几乎每个 patch 都有了 2 个 reviewed-by: Hugh/Johannes。

然而, 这次不像以前, 以前 patchset 没有人关心, 这次大家的 review 兴趣很大,来了就停不住, SUSE 的 Vlastimil Babka 同学又过来开始 review, 并且提出了一些 coding style 和代码解释要求。不过被强势的 Hugh Dickins 驳回:

Hugh 的影响力还是很大的, Vlastimil 和其他潜在的 reivewer 都闭上了嘴。代码终于进了基于 5.10-rc 的 Linux-next。不过这个驳回也引起一个在 5.11 提交窗口的麻烦, memory 总维护者 Andrew Morthon 突然发现 Vlastimil Babka 表示过一些异议。所以他问我:是不是舆论还不一致, 还有曾经推给你一个 bug, 你解决了吗?

I assume the consensus on this series is "not yet"?

Hugh 再次出来护场:我现在觉得 patchset 足够好了, 足够多人 review 过足够多的版本了, 已经在 Linux-next 安全运行一个多月了,没有任何功能和性能回退, Vlastimil 也已经没有意见了。至于那个 bug, Alex 有足够的证据表明和这个补丁无关。

最终这个 patchset 享受到了 Andrew 向 Linus 单独推送的待遇。进了 5.11。


 

win10+conda+pytorch-gpu安装 pytorch 官网上只有linux和Mac的程序包,没有windows系统的,但是windows系统还是可以用pytorch的。  github: https://github.com/peterjc123/pytorch-scripts 首先要安装anaconda: 推荐清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ ... 阅读详情

相关推荐

Palabos User Guide中文解读 | 第一章 | 介绍

译者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,能不能完成全本翻译再说,而且文中我也会标记我不确定的地方,以传达意思为主,翻译不当的地方还请各位读者帮忙指正。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of...

Yulan Fang's notes. 6977

Linux memcg lru lock提升锁性能

继续检查,这个页是否在swapcache中,如果在,返回这个页地址加虚拟地址地址在页中的偏移,如果不在,获得一个内存页, 到swap设备上读取内容填到这个页,此处产生IO, 为Major page fault. 接下了就上把这个页加到swapcache,加入 LRU, 加入page table, 关联到所属的memcg, 并且添加反向映射,然后用户就可以正常使用了。解决的根本是改变页加入lru list和memcg的次序:如下所示,先关联memcg, 然后在加入lru list.get lru_lock;

GetnextWindow的专栏 1787

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4573

Linux内存管理中锁使用分析及典型优化案例总结

1技术背景 锁在Linux内存管理中起着非常重要的作用。一方面,锁在内存管理中保护了多线程的临界区并发处理; 另一方面,内存管理各种锁的使用在一些场景也会表现出性能问题。本文针对内核内存管理中典型的锁进行介绍及典型优化案例总结。本文分析基于Linux内核6.9版本(部分为低版本内核,会特别说明)。2内存管理中的锁 2.1PG_Locked Linux内核物理内存使用page进行管理,...

内核工匠 4180

SAP LTMC实战指南:物料主数据高效导入全解析

本文详细解析了SAP LTMC工具在物料主数据高效导入中的实战应用,包括工具选择、项目搭建、模板定制、数据导入全流程及常见问题解决方案。重点介绍了LTMC的预置模板、LTMOM灵活配置、数据校验机制等核心功能,帮助用户快速掌握SAP数据迁移技巧,提升工作效率。

weixin_33738555的博客 434

计算机视觉——SIFT特征匹配

文章目录一、SIFT特征检测原理1.1基本思想1.2二、SIFT特征检测图片兴趣点三、SIFT特征检测描述子匹配四、输入图片检测与之 一、SIFT特征检测原理 1.1基本思想 1.2 二、SIFT特征检测图片兴趣点 代码: 检测结果: 三、SIFT特征检测描述子匹配 四、输入图片检测与之 ...

weixin_43869874的博客 3855

memcg lru lock 血泪史

背景自电子计算机诞生以来,内存性能一直是行业关心的重点。内存也随着摩尔定律,在大小和速度上一直增长。现在的阿里云服务器动辄单机接近TB的内存大小,加上数以百记的CPU数量也着实考验操作系...

宋宝华 1700

2025年ZBrush雕刻实战:从基础到高级技巧全解析

本文全面解析2025年ZBrush雕刻实战技巧,从基础界面操作到高级笔刷应用。详细介绍了核心功能区域如工具面板和灯箱,以及推荐材质选择。重点讲解6个实用笔刷技巧,包括Standard、Move和ClayBuildup等,帮助用户从入门到精通掌握ZBrush雕刻技术。

weixin_29300241的博客 360

Linux cgroup v1 内存控制器(Memory Resource Controller / memcg)深度解析:从 page_counter 设计到控制文件实战

内存资源控制器(Memory Resource Controller)是 Linux cgroup v1 中隔离与限制一组任务内存行为的基础设施:它以 cgroup 为边界对匿名页(RSS)、文件页缓存与交换缓存(swap cache)进行计费与回收,并提供硬上限、内存+交换联合上限、层级计费、软上限、OOM 控制与内存压力通知等能力。本文以 [Documentation/admin-guide/

gitblog_00774的博客 894

dify upload存在SSRF漏洞

Dify 是一个用于构建 AI 应用程序的开源平台。

nnn2188185的博客 1478

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2463

Linux内存管理进阶:VMA、缺页异常、SLUB与页面回收

Linux内存管理是系统稳定性和性能优化的核心课题。进程的虚拟地址空间通过mm_struct与VMA来刻画,每一段映射都对应一个VM Area,理解其合并、分裂与查找机制,是排查VMA数量膨胀和RSS异常的基础。缺页异常是虚拟地址真正落地的必经关卡,按PTE状态分为匿名页、文件映射和写时复制等路径,通过majflt与minorfault区分IO瓶颈。内核自身分配小对象时并未直接使用伙伴系统,而是借助SLUB缓存复用对象,降低开销与碎片化。当内存压力上升时,kswapd与直接回收协同工作,配合LRU链表、sw

weixin_34389926的博客 203

二、TCP/IP协议之网络层(IP地址的格式、分类、报文格式)

数据报每经过一个路由器,路由器都要重新计算一下首部检验和,若首部未发生变化,则此结果必为 0,于是就保留这个数据报。对于网络号相的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。在首部的固定部分的后面是一些可选字段,其长度是可变的。IPv4 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。表示数据报在网络中的寿命,英文缩写是 TTL(Time To Live),功能是“跳数限制”。地址的网络号码字段用来标识一个网络,网络号码字段的前几位用来区分。

锦慈的技术博客 185

linux内核 内存回收函数do_try_to_free_pages源码解析

记录一下学习linux 内存回收关键函数do_try_to_free_pages的过程。源码版本:linux 5.10。

qq_41276711的博客 351

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

4个内核狂热分子今天又卷了一天

原先Patchset提出的设想是,在I/O等待的page fault retry路径上采用per-vma lock替换mmap_lock锁,以缓解rwsem锁的优先级翻转,而Matthew Wilcox提出这个方法可能没有修复Google的一个问题:memcg超载后,第一次page fault虽然给I/O申请了folio,但是retry PF近来的时候,folio已经被LRU回收,于是导致workload无法推进!建模,把复杂的问题能通过简单的模型说清楚,这是解决问题的最关键一步!

宋宝华 717

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OS23.【Linux】初识进程地址空间

深入探讨了进程地址空间的概念及其在操作系统中的重要作用。首先回顾了C/C++内存区域划分,通过实验验证了栈区向下增长、堆区向上增长的特性。重点阐述了进程地址空间的本质是内核数据结构,包含页表、CR3寄存器等关键组件,以及写时拷贝机制的工作原理。通过分析mm_struct结构体,详细说明了操作系统如何管理进程地址空间。文章还解释了进程地址空间存在的意义:保护物理内存、实现进程隔离,并指出进程地址空间不等于实际内存。最后介绍了操作系统的懒加载机制和缺页中断原理,更新了进程的组成公式为"内核数据

zhangcoder的博客 记录学习轨迹~ 1276

OS17.【Linux】进程基础知识(1)

介绍Linux进程的基本概念和管理方法。主要内容包括:1.进程的浅层定义 - 正在运行的程序;2.查看进程的多种方法(ps、top、/proc目录);3.进程管理实践(查看、终止进程);4.进程控制块(PCB)的组成和作用;5.Linux内核中task_struct结构体的详细解析。文章通过代码示例和命令演示,帮助读者理解进程标识符(PID)、工作目录、程序计数器等核心概念,并深入分析了操作系统如何通过PCB组织和管理进程。最后提供了Linux内核源代码中task_struct的完整定义,为后续学

zhangcoder的博客 记录学习轨迹~ 1032

Linux 6.18 内存管理:整体架构与地址映射

启动期分配器 memblock:内核启动早期、伙伴系统尚未建立时,用 memblock 管理物理内存的预留与分配。伙伴系统(Buddy Allocator):内核正常运行后的物理页框分配核心。物理内存按 node(NUMA 节点)→ zone(ZONE_DMA / ZONE_DMA32 / ZONE_NORMAL / ZONE_HIGHMEM 等)→ page(页框) 三级组织;每个 zone 内维护 0~10 阶的空闲页块链表,分配 2ⁿ 个连续页,合并/分裂对抗外部碎片。

weixin_43228946的博客 320

庖丁解vmCore · 第五篇 · 骨相之辨:内核内存的解剖学

前四篇建立的能力是读懂"事发瞬间"——panic header、寄存器转储、call trace 骨架。走完上述流程,通常能定位到崩溃发生在哪个函数、哪条指令、收到了什么参数。

深耕底层运维,沉淀实战干货,分享技术经验。 523

Redis深度实战:内存管理、主从同步与缓存失效防御

Redis作为高性能内存数据库,其本质是内存管理、网络I/O、单线程事件循环与持久化机制的复合体。理解used_memory与used_memory_rss的差异,是诊断内存碎片、连接缓冲区泄漏等生产问题的起点;掌握主从同步中repl_offset偏移量、lag指标及PSYNC2增量同步原理,才能构建高可用链路;而缓存穿透、击穿、雪崩并非孤立故障,而是访问模式、过期策略与系统协同失衡的结果。本文聚焦真实业务场景下的Redis深度使用,覆盖内存诊断、混合持久化调优、TCP内核参数协同及缓存失效防御工程实践,助

weixin_34348174的博客 248

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 332

Linux 磁盘满了怎么排查?df / du / find 三步定位大文件

Linux 磁盘满排查三步法:df -h 定位分区、du 逐层下钻、find 按大小和时间抓大文件,附 inode 耗尽、文件已删未释放、du 与 df 不一致等经典坑的解决方案。

weixin_38291577的博客 218

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 99

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 287

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 209

Linux rm 误删文件恢复实操教程

Linux使用rm删除文件时,并不会直接抹除磁盘上的数据,只是移除文件索引,让系统不再识别这块空间。只要没有写入新数据,原有扇区内容就会保留。新文件写入才有可能覆盖这些区域,一旦覆盖就很难找回。恢复的本质就是扫描磁盘,找到这些还存在、但索引丢失的数据条目,再把它们导出保存到其他分区。越早停止写入,恢复成功的概率越高。

海天数据恢复-winhex数据恢复教程 225
上一篇: Linux匿名映射
下一篇: Linux memcg lru lock提升锁性能
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值