一、问题描述
在ARM的ubuntu 24.04系统,插入u盘,在GNOME桌面打开u盘时提示you do not have the permissions necessary to view the contents of "0E53-644F",我的u盘是"0E53-644F"。
ARM系统是经过一次刷机的,我先备份了原本的系统,然后进行了刷机。目前原本系统U盘是只读状态,刷机的系统(在另一台机器上)则完全无法打开U盘。
二、问题成因分析
我的用户名是pi,运行:
bash
ls -ld /media /media/pi
发现在刷过机的系统中输出如下:
bash
pi@NanoPC-T6-LTS:~$ ls -ld /media /media/pi/
drwxr-xr-x 1 root root 4096 Aug 8 15:56 /media
drwxr-x--- 1 root root 4096 Oct 29 14:29 /media/pi/
在没有刷过机的系统中输出如下:
bash
pi@NanoPC-T6-LTS:~$ ls -ld /media /media/pi
drwxr-xr-x 1 root root 4096 Aug 8 15:56 /media
drwxr-x---+ 2 root root 4096 Oct 29 14:37 /media/pi
所有者是 root:root:和原系统一样。
权限是 drwxr-x---:和原系统一样。
关键点:没有 + 号!:这说明,这个目录上没有任何ACL(访问控制列表)。
这意味着什么? 在新系统上,由于没有那张"特别通行证"(ACL),系统只能严格遵守基本权限 drwxr-x---。当 pi 用户(属于"其他人")尝试访问时,系统一看权限是 ---,就直接拒绝了你的访问。
原系统镜像经过了特殊的配置,通过ACLs为默认用户 pi 提供了访问 /media/pi 的便利;而新刷机的系统镜像在备份中丢失了ACL,它没有包含这个针对性的ACL配置。
为什么备份会丢失ACL?
ACL是"扩展属性":在Linux文件系统中,我们常用的 rwx 权限(读、写、执行)被称为基本权限(Basic Permissions)。而ACL(访问控制列表)是一种扩展属性(Extended Attributes)。它们是独立于基本权限之外的、更精细的补充规则。
备份工具的默认行为:大多数标准的备份工具(如 tar, cp, rsync)在默认情况下,只会备份文件的内容和基本权限。它们会忽略ACL、SELinux上下文等所有扩展属性,因为这需要额外的处理,而且并非所有目标文件系统都支持这些属性。
三、正确的备份命令
以rsync为例
bash
rsync -aAXHSPz --numeric-ids \
-e "ssh" \
--info=progress2 \
--rsync-path="sudo rsync" \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
pi@<你的ARM机器IP地址>:/ \
~/backups/my_arm_system/
-aAXHSPz: 这是我们的"全家桶"选项,特别为网络传输优化:
-aAXHS 等:和你之前看到的一样,保留归档属性、ACL、扩展属性、硬链接、稀疏文件等,确保100%的完整性。
-P:允许断点续传。在公网环境下,如果网络中断,下次运行时它会从断掉的地方继续,而不是从头再来,这一点至关重要。
-z (compress): 为SSH传输新增的关键选项。它会在传输前压缩文件数据,在传输到目标后再解压。对于公网这种带宽有限的环境,可以极大减少传输的数据量,显著提升备份速度。
-e "ssh": 明确告诉 rsync 使用SSH作为传输通道。数据在公网上将是完全加密的,非常安全。
--rsync-path="sudo rsync": 这是实现远程root权限备份的魔法。当你连接到远程机器时,rsync 默认以 pi 用户身份运行,但 pi 用户没有权限读取系统中的所有文件。这个选项告诉SSH,在远程机器上不要直接运行 rsync,而是运行 sudo rsync。这样,远程的备份进程就拥有了读取一切文件的root权限,从而确保备份的完整性。
--exclude={...}: 我们之前讨论过的,排除所有动态的、虚拟的和临时的文件系统。这完全符合你想要的"静态快照"概念。
pi@<你的ARM机器IP地址>:/: 这是备份的源头。
pi@...: 指定以 pi 用户身份登录SSH。
:: 分隔符。
/: 指定要备份的是远程机器的整个根目录。
~/backups/my_arm_system/: 这是备份的目的地,也就是你本地电脑上的那个文件夹。