![tar 失败,并显示“/rw/internal_apps/rainbow/filebrowser-xxx/proc/29826/exe:无法读取链接:没有这样的文件或目录](https://linux22.com/image/182279/tar%20%E5%A4%B1%E8%B4%A5%EF%BC%8C%E5%B9%B6%E6%98%BE%E7%A4%BA%E2%80%9C%2Frw%2Finternal_apps%2Frainbow%2Ffilebrowser-xxx%2Fproc%2F29826%2Fexe%EF%BC%9A%E6%97%A0%E6%B3%95%E8%AF%BB%E5%8F%96%E9%93%BE%E6%8E%A5%EF%BC%9A%E6%B2%A1%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95.png)
我正在尝试访问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 不是实时快照:它创建要归档的文件列表,然后对其进行处理。因此,已更改大小或已删除的文件将生成错误,并且将错过最近添加的文件。