核心原理:文件系统 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不是"不改变属性",而是它把属性作为数据的一部分保存和恢复,绕过了文件系统的限制。

相关推荐
kaoa0004 分钟前
Linux入门攻坚——62、memcached使用入门
linux·运维·memcached
model20051 小时前
alibaba linux3 系统盘清理
linux·运维·服务器
WG_171 小时前
Linux:动态库加载总结_进程间通信+进程池 + 进程IPC(27/28/29/30/31/32)
linux·运维·服务器
小赵还有头发2 小时前
安装 RealSense SDK (驱动层)
linux
Root_Hacker3 小时前
include文件包含个人笔记及c底层调试
android·linux·服务器·c语言·笔记·安全·php
微学AI3 小时前
内网穿透的应用-告别局域网束缚!MonkeyCode+cpolar 解锁 AI 编程新体验
linux·服务器·网络
宴之敖者、6 小时前
Linux——权限
linux·运维·服务器
刘叨叨趣味运维6 小时前
Linux性能排查实战:从“系统慢”到精准定位
linux
欣然~7 小时前
法律案例 PDF 批量转 TXT 工具代码
linux·前端·python
阮松云7 小时前
a start job is running for Builds and install new kernel modules through DKMS
linux·centos