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크기가 0인 것으로 표시되며 직접 읽을 때 내용이 있음에도 불구하고 빈 파일로 보관됩니다.

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일반적으로 이는 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는 이러한 항목을 제외하는 것이 절대적으로 옳습니다. 약 2분 동안은 아무 소용이 없으며 이동된 시스템으로 복원하면 문제가 발생할 수 있습니다.

또 다른 일반적인 문제는 파일이 지속적으로 변경되는 것입니다. Tar는 라이브 스냅샷이 아닙니다. 보관할 파일 목록을 생성한 다음 처리합니다. 따라서 크기가 변경되거나 삭제된 파일은 오류가 발생하며, 최근 추가된 파일은 누락됩니다.

관련 정보