当前位置: 首页 > news >正文

Whiteout

AUFS / Overlay2(联合文件系统)的语境下,Whiteout(白化文件 / 遮蔽标记)是一个极其聪明的“障眼法”。

既然我们前面说了,底层的那些图层是绝对只读、不能修改、也不能删除的,那就会引发一个悖论:

“如果我在容器里,把底层自带的一个文件给『删了』,AUFS 该怎么表现出来?”

底层的物理文件根本删不掉,但用户在容器里执行了rm -rf file.txt,再次输入ls时,这个文件确实消失了。

这个让文件“凭空消失”的魔术,就是靠Whiteout来实现的。


1. 大白话原理:涂改液与小贴纸

继续用 PS 图层或者透明胶片的比喻:

底层系统(只读层)上画了一个大苹果(file.txt)。因为底层不能动,你没办法拿橡皮擦把这个苹果擦掉。

这时候,如果你在容器里执行了“删除”操作,AUFS 就会在最上面的顶层(你的透明胶片上),在对应大苹果的那个位置,啪叽贴上一张不透明的白色小贴纸(这个贴纸就叫 Whiteout 文件)

当用户从上往下看(也就是在容器里执行ls)时,因为视线被最上层的白色贴纸挡住了,底层的那个大苹果就被“遮蔽”了。对用户来说,这个文件就像是被彻底删除了。


2. 内核视角:Whiteout 到底长啥样?

在底层的 Linux 文件系统里,这个“白色小贴纸”可不是闹着玩的,它有具体的存在形式:

  • 在 AUFS 中:如果你删除了一个叫foo的文件,AUFS 会在可写层创建一个隐藏文件,名字叫.wh.foo(前缀了.wh.)。当 AUFS 驱动扫描到有.wh.开头的文件时,就会明白:“哦,这个文件被用户咔嚓了,对用户隐藏它。”
  • 在 Overlay2 中(现代 Docker 的标配):它的实现更底层,会创建一个主次设备号为 0:0 的字符设备(Character Device)。内核一看到这个特殊的设备节点,就会自动在虚拟目录里把对应的底层文件给隐藏掉。

3. 为什么我们要关心 Whiteout?(避坑指南)

这个机制虽然精妙,但它带来了一个非常反直觉的“大坑”,这也是为什么很多初学者打包 Docker 镜像时,镜像体积会莫名其妙爆掉的原因:

❌ 错误的减肥姿势:

你在写 Dockerfile 的时候:

  • 第一步(第一层):下载了一个1 GB1\text{ GB}1GB的压缩包并解压安装。
  • 第二步(第二层):顺手执行了rm -rf big_file.tar.gz

你以为你把镜像体积缩减了1 GB1\text{ GB}1GB完全没有!
因为第一步的1 GB1\text{ GB}1GB已经写死在只读层了。你第二步的删除动作,只是在可写层建了一个几字节的Whiteout 贴纸把拉链包遮住了。这个1 GB1\text{ GB}1GB的死权重依然结结实实地躺在你的硬盘里,并随着镜像一起被传输。

正确的减肥姿势:

必须在同一步(同一个RUN指令)里,把下载、解压、删除一气呵成:

RUN wget http://example.com/big.tar.gz && tar -xvf big.tar.gz && rm big.tar.gz

因为在同一个 Layer 内部,文件还没沉淀到下层的“只读层”,这时候删除是真的物理删除,不会产生 Whiteout 贴纸。


总结

Whiteout 就是联合文件系统里的“掩耳盗铃”。因为底层删不掉,所以内核选择在最上层糊一层“白漆”(Whiteout),骗过用户的眼睛。

http://www.rkmt.cn/news/1501490.html

相关文章:

  • AD7606多通道数据采集实战:基于STM32 HAL库的SPI DMA+双缓冲实现指南
  • 如何三步备份QQ空间历史说说:开源工具的完整指南
  • Python工程师在AI工程化方向的具体技术栈和工具链有哪些?
  • 喜马拉雅FM音频下载器:跨平台开源工具终极指南,3步轻松下载有声读物
  • Assistant-UI:一站式高效构建AI聊天界面的终极React组件库
  • 论文双检难题破解:告别降重、去AI痕迹二选一困境
  • 射电AGN中H I吸收现象的研究与MeerKAT观测
  • 在Steam Deck上搭建你的怀旧游戏博物馆:EmuDeck配置指南
  • 2026年 工程勘察资质代办机构推荐榜:专业实力与高效服务深度解析 - 品牌发掘
  • 告别手动梳理!用Python脚本自动生成Verilog模块依赖关系图(附源码)
  • SciDownl终极指南:如何快速批量下载学术文献,提升500%研究效率
  • Vue.js从零到精通系列(三):组件化基础——Props、Emits、插槽与生命周期
  • 高架桥304不锈钢防护护栏厂家选择分析:基于区域服务能力与工程适配性的多维度考察 - 优质品牌商家
  • 保姆级教程:在CW32L083开发板上手把手移植FreeRTOS V9.0.0(附完整源码)
  • 终极指南:如何快速优化腾讯游戏性能的ACE-Guard资源限制器
  • 深入解析MC9S12G Flash命令集:从寄存器操作到可靠嵌入式存储实践
  • 已认证微信服务号可用的三级分销H5商城PHP源码,带加粉裂变+后台一键部署指南
  • 大模型辅助的数据库 Schema 设计:从业务需求到表结构的智能生成
  • 深入解析MCU端口集成模块:引脚复用、路由配置与嵌入式开发实战
  • 别再死记硬背了!图解贪心算法:从排会议室到装轮船,一看就懂的思路解析
  • 数据的加密与解密(03:15)
  • 如何永久保存微信聊天记录?WeChatMsg完整指南帮你轻松搞定
  • FanControl:重新定义Windows散热控制的交响乐指挥家
  • 终极RetroArch音频优化指南:告别延迟,享受零延迟游戏体验
  • 用Python给通达信财务数据做个‘自动管家’:增量更新、断点续传与多线程下载实战
  • 农产品电商全栈项目源码:SpringBoot后端+Vue前端+MySQL数据库+部署文档+界面截图
  • 2026年杭州小程序搭建服务商选择指南:靠谱主体分析与行业观察 - 优质品牌商家
  • Go语言为何成为TVA的“血液循环系统”(4)
  • 不止于几何:实战解析如何用CAD Exchanger SDK提取CATIA模型的设计属性与BOM信息
  • 终极开源游戏串流方案:Sunshine自托管服务器完整指南