核心原理:文件系统 vs 归档格式

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,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/  # 保存所有属性

打包后,重新解压缩已解决:

总结关键点:

  1. FAT32等Windows文件系统天生不支持Linux权限
  2. tar将"权限信息"编码到文件内容中,而FAT32只看到"文件内容"
  3. 解压时,tar根据自己保存的元数据重建文件
  4. 这就像用相机拍下家具摆放位置(tar打包),然后按照片恢复(tar解压)

所以,tar不是"不改变属性",而是它把属性作为数据的一部分保存和恢复,绕过了文件系统的限制。

相关推荐
鸠摩智首席音效师2 小时前
如何在 Linux 中使用 fallocate 命令 ?
linux·运维·服务器
秋深枫叶红2 小时前
嵌入式第四十三篇——数据库
linux·数据库·学习·oracle
淡忘_cx2 小时前
Ubuntu 24 飞牛虚拟机 ens2 网卡自动获取 IP(DHCP)配置文档
linux·tcp/ip·ubuntu
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之split命令(实操篇)
linux·运维·服务器·网络·笔记
musk12122 小时前
在 Win11 PowerShell 中通过 SSH 密钥实现无密码访问 Linux 服务器,公钥使用 方法2 手动复制
linux·ssh·win11
松涛和鸣2 小时前
42、SQLite3 :字典入库与数据查询
linux·前端·网络·数据库·udp·sqlite
QT 小鲜肉2 小时前
【Linux命令大全】001.文件管理之rcp命令(实操篇)
linux·服务器·网络·chrome·笔记
Tipriest_2 小时前
Linux 下开发 C/C++ 程序为什么头文件引用路径这么多和复杂
linux·c语言·c++
oMcLin2 小时前
Linux 容器技术实战:从 Docker 到 Podman 的无 root 权限部署
linux·docker·podman