/var/lib/plocate/plocate.db: 버전 4294967295, 예상되는 값은 0 또는 1입니다. 다시 빌드하세요.

/var/lib/plocate/plocate.db: 버전 4294967295, 예상되는 값은 0 또는 1입니다. 다시 빌드하세요.

plocate 데이터베이스를 몇 번이나 재구축하더라도 다음과 같은 결과를 얻습니다.

/var/lib/plocate/plocate.db: has version 4294967295, expected 0 or 1; please rebuild it.

도대체 내가 어떻게 한 거지?

/sbin/updatedb.plocate:
    linux-vdso.so.1 (0x0000007f1c7d4000)
    libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000007f1c6c0000)
    libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000007f1c490000)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000007f1c3f0000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000007f1c3c0000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f1c210000)
    /lib/ld-linux-aarch64.so.1 (0x0000003000000000)
/bin/plocate:
    linux-vdso.so.1 (0x00000077e07be000)
    liburing.so.2 => /lib/aarch64-linux-gnu/liburing.so.2 (0x00000077e0760000)
    libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x00000077e0690000)
    libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x00000077e0460000)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x00000077e0430000)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x00000077e0280000)
    /lib/ld-linux-aarch64.so.1 (0x0000003000000000)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x00000077e01e0000)
plocate 1.1.15
Copyright 2020 Steinar H. Gunderson
License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

updatedb (plocate) 1.1.15
Copyright (C) 2007 Red Hat, Inc. All rights reserved.
This software is distributed under the GPL v.2.

This program is provided with NO WARRANTY, to the extent permitted by law.

답변1

TL;DR 이는 Android/termux/proroot하지만 이는 plocate의 코드 변경으로 해결될 수 있습니다.1.1.20풀어 주다.

4294967295(예 0xffffffff:) 네 (uint32_t)-1. 이는 plocate의 updateb가 불완전하게 작성된 데이터베이스 파일을 감지하기 위해 sentinel 버전 번호로 사용하는 값입니다.

plocate의 updateb가 데이터베이스를 생성할 때 먼저 더미 값(위의 잘못된 버전 번호 포함)을 사용하여 헤더 블록을 작성합니다.

데이터베이스의 나머지 부분을 작성한 후 이번에는 올바른 값(현재는 올바른 버전 값 포함 1)으로 재정의 헤더를 반환합니다.

데이터베이스 출력 스트림이 링크되지 않은 파일( 로 열림 O_TMPFILE)에 쓰고 있으므로 이제 파일을 실제 경로에 링크해야 합니다.

이것암호대충:

/* Open database */
fd = open(path.c_str(), O_WRONLY | O_TMPFILE, 0640);
outfp = fdopen(fd, "wb");
/* Write dummy header. */
...
/* Write database. */
...
/* Write real header */
fseek(outfp, 0, SEEK_SET);
fwrite(&hdr, sizeof(hdr), 1, outfp);
/* Link database path */
snprintf(procpath, sizeof(procpath), "/proc/self/fd/%d", fileno(outfp));
linkat(AT_FDCWD, procpath, AT_FDCWD, outfile.c_str(), AT_SYMLINK_FOLLOW);

fclose(outfp);

이는 권한이 없는 하드 링크 생성을 허용하지 않는 Android에서 수행되므로 위 작업은 linkat일반적으로 실패합니다.

그러나 시행되고 있다 proot, 시행되고 있다매니저예를 들어 linkat(..., "/proc/X/fd/Y", ..., AT_SYMLINK_FOLLOW), 이 경우 링크되지 않은 파일에 FD가 사용됩니다.

linkatproot의 핸들러로 인해 "작동 "콘텐츠 복사연결되지 않은 파일,linkat통화 중. 아무것도 없는 것보다는 낫겠지만 원본 파일 설명자에 대한 추가 쓰기는 파일 시스템의 파일에 기록되지 않습니다.

의 경우 더 이상 쓰기가 없지만 updatedb최종 쓰기와 호출 사이에는 쓰기가 없습니다. 그런 다음 출력 버퍼가 플러시되므로 누락은 일반적으로 문제가 되지 않습니다. 그러나 proot를 구현하면 이 모드로 인해 데이터가 손실될 수 있습니다.fflushfwritelinkatfflushfcloselinkat

공개 버그 추적기가 없는 것 같지만 이 문제를 ptrace plocate 작성자에게 보고했습니다. 이를 추가하면 fflush문제가 해결되지만 그 외에는 해롭지 않습니다.고쳐 쓰다:해결하다994819b.

관련 정보