🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

核心原理:文件系统 vs 归档格式
问题产生原因:
想将OSD_On-Screen_Button_Simulation目录下的所有内容拷贝到U盘下,再通过U盘拷贝到Linux系统其他路径下。我先查看当前路径下,文件夹下所有文件的属性,如下:

我将其拷贝到U盘下,再次查看U盘内,目录下的文件属性,如下:

可以看到U盘内存放的文件属性已经发生了变化!!!
于是我问了deepseek关于这个问题,给出了这样的解决方法:

但是我百思不得其解,在网上搜索后才知道本质原因,分享给大家!
1. 文件系统(FAT32/NTFS/exFAT)
- 设计目标:管理磁盘上的文件和目录结构
- 限制 :
- FAT32/NTFS是为Windows设计的
- 不支持Linux的完整元数据(metadata)
- 只保存基本属性:文件名、大小、时间戳
- 不保存:Linux权限(rwx)、所有者(UID)、组(GID)、特殊标志(如setuid)
2. 归档格式(tar/gzip)
- 设计目标 :完整打包文件和目录的所有信息
- tar格式会保存 :
- 文件内容(原始字节)
- 完整元数据 :
- 权限位(rwxrwxrwx)
- 所有者UID/GID
- 时间戳(atime/mtime/ctime)
- 链接信息(硬链接/软链接)
- 设备文件(如果包含)
- 目录结构
具体过程对比:
情况A:直接拷贝(会丢失权限)
text
源文件(Linux) → cp命令 → FAT32 U盘 → cp命令 → 目标(Linux)
↓ ↓ ↓
权限:rwxr-xr-x 权限:rw-r--r-- 权限:rw-r--r--
(保存在ext4) (FAT32丢弃x权限) (继承U盘的权限)
关键点:FAT32像一个"过滤器",只通过它能理解的信息。
情况B:tar打包拷贝(保留权限)
text
源文件(Linux) → tar打包 → FAT32 U盘 → tar解压 → 目标(Linux)
↓ ↓ ↓ ↓
权限:rwxr-xr-x → 打包进.tar文件 → .tar文件原样复制 → 从.tar恢复权限
(ext4文件系统) (二进制数据包) (只是复制字节) (tar读取元数据)
tar的工作机制:
打包时(tar czf backup.tar.gz)
bash
# tar会读取文件的:
1. 内容数据(文件的实际字节)
2. 元数据(权限、所有者、时间等)
3. 将这些信息一起编码到.tar文件中
# tar文件内部结构:
[文件头(116字节)] + [文件内容] + [文件头] + [文件内容] + ...
文件头包含:
- 文件名
- 权限模式 (mode)
- 所有者UID
- 所属组GID
- 文件大小
- 修改时间
- 文件类型
- ...等100多个字段
在U盘上
text
backup.tar.gz 只是一个普通的"文件"
FAT32看到的: "有一个叫backup.tar.gz的文件,大小XXX字节"
FAT32不需要理解tar的内部结构,就像不理解.zip文件内部一样
解压时(tar xzf backup.tar.gz)
bash
# tar会:
1. 读取.tar文件的二进制数据
2. 解析文件头信息
3. 根据文件头中的权限信息创建文件
4. 恢复原始权限和属性
技术类比:
类比1:搬家
- 直接拷贝 :像把家具一件件搬过去,但说明书丢了
- tar打包 :像把家具连同说明书一起装箱,到新家再按说明书组装
类比2:邮寄信件
- FAT32:只关心"信封"(文件名、大小),不关心"信的内容"
- tar:把整封信(内容+格式)封装好,接收方拆开得到完整信件
验证实验:
bash
# 1. 查看tar文件头信息
tar tvf backup.tar.gz
# 输出示例:
# -rwxr-xr-x tjf/tjf 943 2024-12-26 13:52 install_rules.sh
# ↑ 这里已经包含了权限信息!
# 2. 对比两种方式
# 方式1:直接cp
cp install_rules.sh /mnt/usb/
cp /mnt/usb/install_rules.sh ~/
ls -l ~/install_rules.sh # 显示 -rw-r--r--
# 方式2:tar方式
tar czf install.tar.gz install_rules.sh
cp install.tar.gz /mnt/usb/
cp /mnt/usb/install.tar.gz ~/
tar xzf ~/install.tar.gz
ls -l install_rules.sh # 显示 -rwxr-xr-x
为什么tar能绕过文件系统限制?
因为tar创建了一个自包含的格式:
text
tar文件 = [元数据] + [数据] + [元数据] + [数据] + ...
- FAT32只看到:一个名为
backup.tar的大文件 - 不知道也不关心里面有什么
- 当tar在Linux上解压时,它会用自己的元数据来创建文件
其他类似工具:
bash
# cpio - 也保存权限
find . -print | cpio -o > backup.cpio
# zip(需要参数)
zip -r backup.zip . # 默认不保存权限
zip -r --symlinks backup.zip . # 保存符号链接
# rsync(通过网络或ext4文件系统)
rsync -av source/ dest/ # 保存所有属性
打包后,重新解压缩已解决:

总结关键点:
- FAT32等Windows文件系统天生不支持Linux权限
- tar将"权限信息"编码到文件内容中,而FAT32只看到"文件内容"
- 解压时,tar根据自己保存的元数据重建文件
- 这就像用相机拍下家具摆放位置(tar打包),然后按照片恢复(tar解压)
所以,tar不是"不改变属性",而是它把属性作为数据的一部分保存和恢复,绕过了文件系统的限制。