tar 失败,并显示“/rw/internal_apps/rainbow/filebrowser-xxx/proc/29826/exe:无法读取链接:没有这样的文件或目录

tar 失败,并显示“/rw/internal_apps/rainbow/filebrowser-xxx/proc/29826/exe:无法读取链接:没有这样的文件或目录

我正在尝试访问tar运行嵌入式 Linux 版本的设备的系统目录,但失败了。这是 stderr 的最后几行。

tar: /rw/internal_apps/rainbow/filebrowser-45905a3/proc/29826/task/29826/exe: cannot read link: No such file or directory
tar: /rw/internal_apps/rainbow/filebrowser-45905a3/proc/29826/exe: cannot read link: No such file or directory
tar: /rw/internal_apps/rainbow/filebrowser-45905a3/proc/32037/task/32037/exe: cannot read link: No such file or directory
tar: /rw/internal_apps/rainbow/filebrowser-45905a3/proc/32037/exe: cannot read link: No such file or directory
tar: /rw/0/var/run/samba/nmbd/unexpected: socket ignored
tar: /rw/0/var/run/samba/unexpected: socket ignored
tar: /rw/0/var/run/ntpd.sock: socket ignored
tar: /rw/0/var/run/dbus/system_bus_socket: socket ignored
tar: error exit delayed from previous errors

似乎有一堆相同的错误,那么为什么不tar放弃第一个错误或忽略它们呢?感觉就像tar接受某种类型的一些错误,但如果错误数量大于某个阈值,它就会放弃?

我更喜欢一个不会​​强迫我手动排除数千个文件的解决方案。

使用 Busybox 中的 tar。

更新:我运行的命令sudo tar -czf /tmp/1.tar / --exclude=tmp --exclude=shares --exclude=media --exclude sys --exclude kcore

答案1

您至少应该添加--exclude=proc到该排除列表中。

/proc文件系统是一个合成的系统,是在目录被写入和文件被读取时动态生成的,“归档”它是没有意义的。

特别是,/proc/<pid>/exe仅当进程<pid>仍在运行时才存在,并且该进程可能会在 tar 实际决定归档它和实际执行归档之间的时间内退出。此外, /proc(例如)下的大多数“常规”文件/proc/cmdline显示为具有零大小,并且将被存档为空文件,尽管直接读取时有内容。

为什么 tar 不放弃第一个或忽略它们?

您可以在出现第一个错误后轻松地缩短它,例如:

set -o pipefail  # optional, use it if you want to check the exit status
tar -cf ... 2>&1 | sed 5q

tar 接受某种类型的一些错误,但如果错误数量大于某个阈值,它就会放弃

tar没有这样的事情。至少不是 GNU 或 busybox tar (您正在使用的)。

tar: /rw/0/var/run/ntpd.sock: socket ignored

这只是一个警告,不会影响退出状态。但/var/run通常是 a tmpfs(完全驻留在内存中的文件系统),因此您也应该排除它,就像/dev.

答案2

您可以分析日志:大概“sbinm”消息具有不同的标签。 (我搜索了“sbinm”,但我只找到了有关汽车羡慕的参考。)

消除您认为不重要的消息。使用 重定向 tar stderr 到文件2> tar.errors,并通过 awk 运行它。

awkLog='
$(NF) ~ /socket ignored/ { next; }
$(NF-1) ~ /cannot read link/ { next; }
{ ++Bad [$(NF)]; }
END { for (k in Bad) printf ("%8d %s\n", Bad[k], k); }
'
awk '-F:' "${awkLog}" tar.errors

这应该打印所有错误的计数(除了那些特别忽略的错误)。

跟踪并调查每种类型的示例,并决定是否将它们添加到忽略列表中、修复根本问题、从存档中排除(请参阅 user414777 评论)或其他操作。这可能需要一些研究,但如果需要,您可以发布其他问题。

例如,您问题中的两种错误类型都是由于瞬态文件造成的:Samba 的套接字,以及有关当前正在运行的特定进程的详细信息的链接(事实上,无论如何,似乎都缓存在某些浏览器中)。 Tar 排除这些内容是绝对正确的:它们在大约两分钟内不会有任何用处,并且将它们恢复到已移动的系统中可能会破坏它。

另一个常见问题是对文件的持续更改。 Tar 不是实时快照:它创建要归档的文件列表,然后对其进行处理。因此,已更改大小或已删除的文件将生成错误,并且将错过最近添加的文件。

相关内容