十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux扩展属性xattr:文件系统里看不见的“便利贴”机制

Linux扩展属性xattr:文件系统里看不见的“便利贴”机制 干了十几年Linux我慢慢发现很多时候我们在排查莫名其妙的问题时比如“文件怎么突然多了个点开头的小文件”“Docker容器里的文件怎么删不掉”“ACL权限明明设置了却不生效”追根溯源基本都会撞上一个不起眼但又无处不在的底层机制——扩展属性Extension Property在Linux/Unix世界里它更常见的名字是xattr。这不是什么新的奇技淫巧它实打实地在你的系统里跑了好几十年。简单说扩展属性允许你把一堆自定义的元数据像便利贴一样黏在文件或目录上而不需要动文件本身的一个字节。我在实际工作中无论是调优备份软件、处理对象存储网关的兼容性问题还是排查生产环境里因为cp -a丢失了SELinux标签导致的服务启动失败都离不开对xattr的深入理解。这篇博文我不打算从枯燥的man手册讲起就纯粹从实战和踩坑的角度把这个隐藏在文件系统里的“便利贴系统”拆开揉碎讲讲它在现代Linux系统里到底是怎么运作的以及在真实场景里能帮我们解决什么大问题。注意这里的“扩展属性”不是Windows下的那个文件属性比如只读、隐藏它是POSIX和Linux VFS虚拟文件系统层面的通用机制用getfattr、setfattr这类命令操作。1. 内容整体设计与思路拆解1.1 一次诡异的生产事故引出的核心需求先讲个我亲历的案例。有次线上有个Java应用要读取一批上传的图片结果在生成缩略图的时候突然有一批图片怎么都读不进去。不是权限问题不是文件损坏ls -l看大小、权限都正常但应用就是报“Invalid argument”。查了一圈最后用getfattr -d -m- file.jpg一看发现这文件上被某个上传组件自动打了一个user.com.example.checksum的扩展属性。而那个Java应用的老版本图片处理库在读取文件头时因为不理解这个“多余”的信息处理不当直接抛错了。当时解决的办法很简单粗暴用setfattr -x user.com.example.checksum file.jpg删掉这个属性就好了。这个案例完美说明了扩展属性的核心场景在不改变文件主体数据的前提下给文件系统里的对象附加额外的、与业务相关的元数据。它解决了传统文件系统里“数据”与“元数据”分离的痛点让文件自己就能“携带”身份、校验值、分类标签甚至安全上下文。1.2 为什么传统属性不够用才催生了xattr传统文件系统里文件自带的信息其实非常有限文件名、inode节点号、权限位rwx、所有者UID/GID、时间戳atime/mtime/ctime、大小和链接数。在现代复杂的IT架构里这些完全不够用。安全模块如SELinux需要给每个文件打上“类型”标签这个标签放哪文件管理如桌面系统需要记录文件来源、作者、Tags怎么办备份恢复如Bacula、Borg需要保存原始权限和特殊标记存哪分布式存储如Ceph、GlusterFS需要标记对象的存储策略放哪如果都通过“新建一个同名配置文件”的方式来做不仅占用额外的目录项dentry还会破坏文件系统的原子性且在复制、同步时会非常麻烦。xattr的出现把信息“内嵌”到了inode里跟着文件走天然支持原子操作这就是它解决的核心痛点。它本质上是一种文件系统的能力扩展让元数据从“固定结构”走向“可编程、可扩展”。1.3 方案选型为什么是xattr而非其他机制在处理“给文件附加元数据”这类需求时方案其实不多。可能有人会想到用数据库专门存文件路径和标签的映射关系如MySQL、Redis也有人会想到用自定义的“文件名编码”来实现比如把信息塞到文件名里再用Base64编码读取。但和这两种方案对比xattr的优势是压倒性的原子性扩展属性的设置与文件系统操作如rename、create绑定可以在事务层面保持一致不会出现数据库记录和文件实体不同步的尴尬。生命周期xattr跟随文件的整个生命周期文件删除它自然消亡复制时使用cp -a或rsync -X能顺带搬走管理成本极低。性能访问xattr不需要像数据库那样进行网络请求或复杂查询直接跟inode走性能损耗极低。标准化POSIX规范定义Linux内核原生支持主流文件系统ext4、XFS、Btrfs、ZFS皆有实现。2. 核心细节解析与实操要点2.1 扩展属性的四大命名空间Linux xattr遵循一套严谨的“域名”规范防止不同应用互相污染。你使用getfattr -d查看时属性名前面会有一个前缀这个前缀就是“命名空间”常见有四个命名空间使用场景是否需要root权限设置user.*用户自定义数据比如文件标签、自定义校验值取决于文件系统挂载选项通常需要user_xattr支持trusted.*需要root权限才能读写内核/系统级服务使用是system.*内核自己使用如system.posix_acl_access、system.posix_acl_default由内核管理用户无法直接修改security.*SELinux安全上下文等安全标签存放处是具体怎么用呢假设我有个目录/data/share想给一个report.pdf打上“部门财务”的标签# 设置一个user命名空间的属性 setfattr -n user.department -v finance /data/share/report.pdf # 查看文件所有扩展属性 getfattr -d /data/share/report.pdf # 查看特定属性的值 getfattr -n user.department /data/share/report.pdf生产环境里我们设置属性前一定要想清楚该放在哪个命名空间。如果你只是给自己或应用打业务标签user空间就够了如果你要写需要root权限保护的内部标记比如备份软件的归档标记那就用trusted而涉及SELinux标签必须由操作系统通过security空间管理千万别手贱尝试直接通过setfattr去改SELinux上下文那样极大概率会把系统搞挂。2.2 底层数据结构与存储方式以及性能边界扩展属性在磁盘上是怎么存的这部分理解透了你才能明白为什么有的文件系统有大小限制。以ext4为例xattr数据优先考虑存放在inode本身的预留区块里i_file_acl和i_blocks附近这被称为“在inode内”。因为inode的大小在格式化时固定了默认128字节或256字节所以如果某个xattr很小它就能“免费”塞进去不会额外增加磁盘块。如果单个xattr特别大比如超过一个块的大小文件系统就会分配单独的磁盘块来存储称为External Block。因此这里就有个非常关键的经验绝大多数文件系统对单个xattr的value大小是有限制的通常是64KB但实际建议不要超过1KB。因为过大不仅浪费磁盘而且在每次进行open(2)操作时内核处理inode中的xattr会变慢。在实际开发中我遇到过有同事往xattr里塞一段几KB的Base64图片直接导致该目录下所有文件的操作延迟猛增。在涉及性能的系统上xattr更适合存短字符串或数字。2.3 文件系统支持度与挂载选项别踩ext3的坑不是所有文件系统默认就支持xattr或者默认就允许user命名空间。这块极容易踩坑。ext2/ext3需要挂载时显式加上user_xattr选项才能使用user.*属性。ext4默认开启user_xattr。XFS默认设计就包含了xattr且容量相对更大。Btrfs/ZFS原生支持且支持快照、校验和联动。NFS/TMPFSNFS能否使用xattr取决于服务端和客户端协议版本NFSv4支持tmpfs默认支持。如果你写了个脚本用setfattr给某文件打标签结果无响应或报Operation not supported大概率就是文件系统挂载选项出了问题。检查当前文件系统的挂载选项mount | grep -E ext4|xfs如果发现没有user_xattr你需要在/etc/fstab里加上。2.4 与文件ACL访问控制列表的爱恨情仇提到system.命名空间就不得不说说文件ACL。很多Linux运维对ACL不陌生它的实现底层正是借助扩展属性。你可能见过设置ACL的命令setfacl -m u:nginx:r-x /data/web/app这个操作背后实际上是内核帮你在这个文件身上写了一个system.posix_acl_access的扩展属性然后用它来控制访问权限。当你用getfacl读取ACL时其实就是在解析这个扩展属性。很多人在用rsync同步数据时发现ACL权限丢了大部分原因就是rsync默认没有加-X参数表示同步xattr导致system.posix_acl_access没被搬过去。理解这一层你就打通了ACL和xattr的壁垒ACL是xattr的一个上层应用但它是系统级的有专门的接口。3. 实操过程与核心环节实现3.1 命令行实战getfattr与setfattr的完整使用手册在实际操作层面我们打交道最多的是attr工具包包含getfattr、setfattr、tar/rsync等资源复制工具。场景一批量给文件打上来源标签比如我需要把一批上传到服务器/data/incoming/的图片标记为“来自移动端”#!/bin/bash # 批量设置属性 find /data/incoming/ -type f -name *.jpg -exec setfattr -n user.source -v mobile {} \; # 批量验证 find /data/incoming/ -type f -name *.jpg -exec getfattr -n user.source {} \;这个命令执行完每个文件身上就会带有user.sourcemobile的标签之后在业务代码里可以用os.getxattr之类的方式直接获取无需再去查询业务数据库。效率高且部署简单。场景二备份与恢复我们日常用tar打包时如果不加参数xattr是丢了的。为了保证备份完整性我通常使用# 打包并保留xattr tar --xattrs -czf app_backup.tar.gz /data/app/ # 解包并恢复xattr tar --xattrs -xzf app_backup.tar.gz -C /restore/path/注意tar --xattrs需要较新版本的tarGNU tar 1.27或在发行版里已默认支持。rsync同步时别漏了-Xrsync -avX /data/app/ userbackup-server:/data/app-backup/-X就是“保留扩展属性”的开关。我曾见过有同事用rsync -av同步了前后端代码线上SELinux上下文被重置导致502 Bad Gateway半个小时的惨案亏在了没加-X上。场景三查询并排查系统里的隐藏标签# 查看所有命名空间的属性 getfattr -d -m- /etc/passwd # 查看SELinux的标签 getfattr -n security.selinux /etc/passwd这个命令在你怀疑系统文件被错误标记时非常管用。3.2 编程实战Python与C语言接口命令行只是工具真正自动化还是要靠代码。Python 示例Python的os模块提供了setxattr、getxattr、removexattr、listxattr四个核心函数。import os FILE_PATH /tmp/test_xattr.txt with open(FILE_PATH, w) as f: f.write(hello) # 设置 os.setxattr(FILE_PATH, user.check_sum, ba1b2c3) # 获取 value os.getxattr(FILE_PATH, user.check_sum) print(value.decode()) # 输出 a1b2c3 # 列出所有属性 attrs os.listxattr(FILE_PATH) print(attrs) # [user.check_sum] # 删除 os.removexattr(FILE_PATH, user.check_sum)为什么Python的setxattr要求value是bytes类型因为它直接对接系统调用syscall内核层面的数据就是二进制流不做编码假设。如果你的数据是字符串务必.encode()一下。C语言示例核心片段#include sys/xattr.h #include stdio.h int main(void) { const char* path /tmp/test_c_xattr; char value[128] {0}; // 获取属性 ssize_t len getxattr(path, user.my_key, value, sizeof(value)); if (len -1) { perror(getxattr failed); return 1; } printf(value: %s (len%zd)\n, value, len); return 0; }编译命令gcc -o getattr_demo getattr_demo.c。C语言的优势是性能好可以直接在编写系统工具或驱动时使用Python适合业务快速迭代和脚本工具。实操心得在写自动化脚本设置大量文件的xattr时建议使用lsetxattr代替setxattr。因为setxattr会对符号链接本身进行操作而lsetxattr则直接作用在链接指向的目标文件上。同样读取时用lgetxattr。这能避免我们误操作符号链接把属性打到链接上而不是目标上。3.3 交互式工具attr更人性化地编辑属性attr包中除了getfattr/setfattr还有一个attr命令它提供了类似ls -l的交互式体验# 假设你已有 testfile 文件 attr -l testfile # 列出所有属性同 getfattr -d 效果 attr -s user.version -V v2.0 testfile # set version to v2.0 attr -g user.version testfile # get version attr -r user.version testfile # remove version这个命令在人工排查时更舒服因为输出格式比较友好。不过自动化脚本里还是建议用标准的setfattr灵活性和解析稳定性更高。4. 常见问题与排查技巧实录4.1 问题速查表这里整理了我多年积累的跟扩展属性相关的典型问题、判断依据和应对方案可以直接对照排查症状根本原因排查命令解决方案setfattr报Operation not supported文件系统未开启xattr支持或文件系统本身不支持如FATmount重新挂载文件系统加上user_xattr换用ext4/xfs/btrfscp -a后ACL失效服务无法启动目标文件系统不支持ACL或复制工具未保留xattrgetfacl file对比确保目标文件系统支持ACL挂载acl选项用cp -a或rsync -X应用设置xattr成功但重启后丢失逻辑卷或底层存储有快照/恢复机制回滚了inode一会getfattr -d -m- file确认快照策略或通过用户态数据库冗余保存关键标签通过NFS共享文件时客户端读不到xattrNFS协议版本太低或服务端/客户端配置关闭了xattrnfsstat -mMac、mount升级NFSv4检查export选项是否有no_xattr备份脚本同步后文件大小变化备份工具把xattr里的信息当普通数据写入了数据库文件对比源文件和目标文件的getfattr -d修改备份策略分离开处理xattr或备份时明确保留xattrtar解压时警告“Ignoring unknown extended attribute”tar版本过低不认识文件的xattr直接跳过tar --version升级GNU tar使用--xattrs选项解压4.2 独门排查心得用getfattr -d -m-揪出隐藏字符有一次我们有个对象存储网关总是报错说MD5校验不通过。查日志发现源文件在传到存储时上传组件会给对象打一个user.md5标签用来做校验。但有个奇怪的现象是同一批文件在A服务器上校验通过在B服务器上死活不过。后来我用getfattr -n user.md5 --only-values file把属性值打印出来再通过xxd看十六进制发现B服务器上的user.md5属性值末尾多了一个\n十六进制是0x0a。原因找到了不同版本的md5sum命令在计算时会多输出一个换行符组件的开发人员写脚本时直接用$(md5sum file)的方式取了整个输出然后就把结尾的换行符一起写进了xattr里。排查过程虽然折腾但用对了工具从“看不见”的元数据里把它揪出来的感觉非常爽。这里也分享一个生产经验如果你要存储的文件路径或标签含有中文或特殊字符在Python中用os.listxattr拿到的是bytes类型需要自己进行解码而且xattr的value大多建议保存为可打印字符方便日后排障遇到不可见字符直接用xxd查看是最稳的。4.3 内核里看门道如何快速查看一个文件究竟带了哪些“累赘”想快速看下系统里哪些文件带了一堆你意想不到的属性可以写个小脚本扫描。但生产环境最好不要全盘扫代价太大。我一般是这么操作的先通过du找出大文件再用attr -l查看。因为大文件被写入无用xattr的概率更高往往是那些网盘客户端或同步软件干的好事。还碰到一种情况getfattr看不到属性但是内核报错说属性冲突。这种情况往往是在Btrfs子卷或者Snap场景下文件被快照锁定了属性处于“冻结”状态。这时你需要先清理旧快照再对活动文件进行操作。5. 工具选型解析与平台差异5.1 Linux发行版工具链attr、rsync、tar、cp 的一体化配合在Linux下用好扩展属性工具链的配合是关键。我推荐的标准配置是安装attr包它提供了基础的getfattr/setfattr。日常备份用rsync -avX --delete既有删除同步能力又能保留xattr和ACL。打包用tar --xattrs --xattrs-include*。注意--xattrs-include*意思是包含所有命名空间的属性。默认tar只备份安全相关的属性可能漏掉user.*。拷贝单文件用cp --preserveall或cp -a-a等价于-dR --preserveall包含了s.c_uid, s.c_gid, S.ELACL等信息。我是这样配置tar别名来避免漏备份的alias tar_fulltar --xattrs --xattrs-include? --acls --selinux -czvf使用时直接tar_full backup.tar.gz /data/。实测下来这能完整保留绝大多数业务的标签和权限上下文。5.2 跨平台与网络文件系统的兼容性警告如果你有跨系统同步的需求比如从Linux同步到macOS或从Linux同步到某个NAS设备xattr的兼容性就要特别小心了。macOS支持xattr但命名上不区分user.前缀更多是com.apple.打头。你用rsync同步到Mac时Linux的user.*属性到了Mac上表现可能变成user.*有一定兼容但Apple自身的一些标志却不同所以经常出现同步后Mac显示“此文件来自另一台Mac”这种类似警告。Windows SMB/CIFSSMB 协议特别是Samba用xattr来模拟Windows的ADSAlternate Data Streams交替数据流。在Samba服务器上你可能会看到类似user.DosStream...的属性这是Samba在底层用xattr模拟的属于“恩赐”但如果你备份Samba目录时不加-XWindows用户以后可能无法正常打开这些文件的“备注”或“作者”信息。FAT/exFAT别想了技术实现决定其无法原生支持xattr。U盘上别指望这个。核心原则是跨平台同步时若要保证xattr不丢、不乱、不错唯一的保底方案就是走“压缩归档”的通道比如先tar --xattrs一把梭再将tar文件传输过去解压。这样能保证在支持xattr的文件系统上完整还原。5.3 容器与云原生环境里的xattr暗坑容器里xattr是个容易忽视的大坑。Docker镜像本身是基于overlayfs的而overlayfs对xattr的支持是有限制的。最常见的问题容器内非root用户尝试设置user.*属性会遇到Operation not permitted。原因是内核最近的安全策略如fs.protected_regular和fs.protected_fifos和overlayfs的权限管理限制。应对方案很简单设置属性放在构建镜像阶段来做或在启动容器时显式声明--cap-add SYS_ADMIN并挂载相关卷。另外Kubernetes里用emptyDir挂载的临时卷对应的tmpfs是支持xattr的这点倒是不用担心但如果是hostPath的NFS就另说了容易踩到NFS上xattr未开启的坑。6. 主流文件系统的xattr实现差异与容量规划你以为xattr在哪个文件系统上都是一样的大错特错。不同文件系统对xattr的存储上限、性能和语义有着非常大的差别。这块在设计存储架构时就要定义清楚。我整理了表格供参考文件系统单个xattr大小上限特性与注意事项ext4单属性value上限64KB实际受限于inode大小通常为256Binode空间碎片较多时会用单独块存储扩展属性过多会消耗块XFS单属性value上限64KB创作良好支持动态inode扩展动态分配老牌数据仓库文件系统Btrfs单属性value上限64KB依赖其COW机制元数据在快照中会占用更多空间ZFS单属性value上限为65536字节64KB全量通过ARC缓存优化性能影响可控NFSv4取决于服务端文件系统客户端看到的xattr是服务端“翻译”过来的需要服务端支持容量规划经验如果你的业务会大量使用xattr比如每文件存一个8KB的JSON建议选用XFS或ZFS作为底层inode空间更充裕动态扩展能力更强。避免在/tmptmpfs下持久化大量xattr重启就没了。监控xattr占用的块空间用df -iinode和df -h块配合观察。如果一个目录下文件很多且每个文件的xattr平均超过2KB那么文件系统可用的inode块区域会迅速消耗。极端情况下会出现“明明磁盘还有100G但就是无法写入新文件”的“No space left on device”奇观其实是被xattr撑爆了块。6.1 如何检测xattr是否吃光了文件系统空间说一个我遇到过的真实场景有个对象存储网关为了给每个对象存一个“标签元数据”往xattr里塞了平均4KB的数据。某天突然集群报“No space left on device”但df -h /data一看才用了60%。后来发现是文件系统的元数据区不够用了。解决方案是确认ext4的inode_ratio和块大小是否合适或者迁移到XFS。如果你遇到类似问题用df -i看inode使用率如果接近100%再配合dumpe2fs /dev/sdX | grep -i Inode size查看inode大小基本就能定位。6.2 大value的xattr与性能的量化评估假设你给每个文件都塞一个64KB的xattr。表面看一个64KB的写入不算什么但如果在频繁创建和删除文件的目录比如消息队列的持久化目录性能会成指数级下降。原因在于xattr操作往往涉及inode锁而大value会频繁触发额外的内存分配和块I/O。我的经验值生产环境xattr的值控制在256字节以内是最保险的就算有大量对象对系统整体性能的影响也可以忽略不计。你完全可以把大块的自定义语言放到文件里xattr只留个指针或哈希值。7. 常见问题与排查技巧实录进阶篇7.1 xattr在不同场景下的边界什么时候它帮不了你虽然xattr很强但它绝对不是万能的。有几种场景它无能为力或者不适合使用文件内容的关键部分如果你要存储一个关键的加密密钥千万别放xattr。虽然root可能能读到user.*但安全性和隐私性完全没有保障。密钥应放内存或硬件安全模块。跨平台通用性xattr的属性名不是所有系统通用。命名空间前缀在Windows上会失效SMB转移到另一台非Samba服务器时user.*可能直接丢失。高并发写同一文件的属性多个进程同时setfattr同一个文件的xattr会出现“last-writer-wins”的情况没有锁机制。如果需要保证一致性和原子性还得靠业务侧用乐观锁比如cas比对原值去处理。追查历史免疫性xattr不会记录谁在什么时间修改了它。如果你需要“审计日志”xattr不是你的菜它本身不具备版本记录能力。7.2 属性值里有玄机当二进制数据混进xattr前面提到xattr是不管内容编码的这就带来一个问题如果某个程序往里写入了包含空字符\0的value那么你用命令行getfattr -d查看时可能会看到截断甚至乱码。我曾经在分析一个恶意软件样本时就看到它把一份加密的shellcode放到user.X属性里。这种情况下要想拿到原始二进制数据标准工具会歇菜你必须用别的方式去读取# 直接用Python一次性读取原始字节 python3 -c import os,sys; sys.stdout.buffer.write(os.getxattr(bfile, buser.X))这个技巧在排查些“不明所以”的隐藏数据时非常有效。7.3 清理属性避免“脏数据”如果你想彻底“洗掉”文件的全部扩展属性采用-x参数一个个删效率太低。可以考虑用Python脚本批量清除# 清除指定文件的所有user.*属性遍历并删除 python3 -c import os for attr in os.listxattr(file): if attr.startswith(user.): os.removexattr(file, attr) 如果你只是想测试某个软件还原效果比如验证备份是否完整这个清属性方案很实用。7.4 从备份恢复的终极教训先比较xattr再上线最后分享个压箱底的操作习惯。每次做完迁移或恢复我不会只对比文件大小和md5而是强制对比整个扩展属性集# 生成源目录的属性清单 getfattr -R -d -m- /data/source/ source_attr.txt # 生成目标目录属性清单 getfattr -R -d -m- /data/backup/ backup_attr.txt # 对比 diff source_attr.txt backup_attr.txt有次我用这种方法发现一个配置文件在恢复过程中security.selinux属性丢失了虽然文件本身内容一模一样但因为没了SELinux标签服务在全功能模式下启动失败。幸好提前对比出来直接用restorecon -v /data/backup/config.conf恢复了标签避免了一次深夜紧急发布事故。8. 从运维到研发扩展属性的全景应用图谱8.1 在安全审计与策略控制中的四两拨千斤除了ACL和SELinux标签扩展属性还被我用作轻量级安全策略下发媒介。比如在一个内网文件服务器上我们通过脚本基于不同用户角色给目录打上user.project_code属性然后开发了一个FUSE文件系统“拦截层”在读取文件时校验当前用户的有效范围与文件的user.project_code是否匹配。这种方式比在数据库里维护权限表要快得多因为文件本身就是“数据库”。你不会想用xattr去替代专业的IAM系统但在边界不太复杂、文件数量可控的场景下它确实能大幅简化权限校验逻辑。8.2 超融合存储与智能数据分层在大规模分布式存储中xattr还被用于实现智能分层。我们有个Ceph集群后台会周期性地扫描对象读取对象上的user.tier属性如果为cold后台任务就把对象迁移到廉价存储池同时更新user.tierarchived。这里的核心逻辑就是读取xattr并做门控判断比维护外部数据库要简洁可靠。8.3 结合inotify实现动静分离的实时检测再分享一个让我印象深刻的场景内网日志分析系统。我们通过设置user.log_level属性来控制日志采集器的分级处理逻辑。系统启动时采集器会读这个属性如果运维想临时调整某台机器上的日志级别只需在对应目录的xattr上改一个值而不需要重启agent。inotify还能监听xattr的变化事件实现“属性变则动作起”的自动化运维效果。9. 最后的几个建议9.1 用xattr时心中要有“丢弃准备”任何元数据方案都有失效风险你可能在重装系统、格式化磁盘、迁移存储的瞬间丢失全部xattr。所以在把关键业务数据“押宝”在xattr上之前一定要问自己如果这些属性丢了业务会崩吗如果会你就必须要有冗余方案。我个人的经验是重要的标签或写进数据库或用xattr作为二级缓存而不是唯一数据源。9.2 永远保留一条“逃生通道”在自动化脚本里操作xattr时永远需要一个“临时工”系统中核心数据文件的user.*属性变动前先导出一份getfattr -R -d -m-的完整备份。这个备份文件虽然不起眼但在事后审计和处理诡异问题时真的能救命。9.3 多折腾多实验扩展属性是个小工具但它串联起了文件系统、安全模块、备份恢复、容器存储等多个领域。我建议你可以在自己的测试机上创建一个ext4的U盘挂载时加/不加user_xattr再用getfattr/setfattr对比一下体会一下“属性是否存在的差异”。多折腾几次踩几次坑你对Linux“一切皆文件”以及“文件也有丰富内心戏”的理解就会上一个台阶。
返回列表