GNU find와 함께 사용 하면 find --version
다음과 같은 결과를 얻습니다.
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
이러한 "특성"은 무엇을 의미합니까? 에는 O_NOFOLLOW
보안 조치 가 언급되어 있으며 man find
리프 노드에 대한 LEAF_OPTIMISATION
일부 호출을 저장하는 최적화가 언급되어 있습니다. 하지만 , 또는 lstat
에 대한 정보를 찾을 수 없습니다 .FTS
D_TYPE
CBO
답변1
이것은 Ketan과 Daniel Kullman의 답변과 내 연구의 완전한 답변입니다.
대부분의 "기능"은 쿼리 최적화입니다. find
일반적으로 파일 시스템에서 (거의) 임의로 복잡한 쿼리를 실행할 수 있기 때문입니다.
D_유형
이 기능이 존재한다는 것은 이 필드가 Linux에서도 채택한 BSD 확장 D_TYPE
이라는 것을 의미하며 find
, andfriends에서 반환된 구조에 파일 유형(디렉토리, 파일, 파이프, 소켓, 문자/블록 장치 등)을 제공합니다. ). 최적화로서 이를 사용하면 필터 표현식으로 사용될 때 호출을 줄이거나 제거할 수 있습니다.d_type
struct dirent
readdir
find
lstat
-type
readdir
d_type
일부 파일 시스템에서는 항상 채워지지 않을 수 있으므로 lstat
여전히 필요한 경우가 있습니다.
공식 문서의 추가 정보:https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimization.html
O_NOFOLLOW
옵션은 (enabled)
또는 로 표시됩니다 (disabled)
. 존재하고 활성화된 경우 이 기능은 find
특정 TOCTTOU 경주 공격을 방지하는 보안 조치를 구현합니다 . 특히 find
파일 형식을 확인한 후 디렉토리에 들어가기 전에 디렉토리가 기호 링크로 대체되는 경우 발생할 수 있는 디렉토리 탐색을 수행할 때 기호 링크가 통과되는 것을 방지합니다 .
이 옵션을 활성화하면 실제 디렉토리만 열기가 디렉토리에서 사용된 다음 해당 디렉토리의 파일을 여는 데 사용 find
됩니다 .open(..., O_NOFOLLOW)
openat
LEAF_OPTIMISATION
약간 모호한 이 최적화를 find
사용하면 상위 디렉터리의 링크 수를 사용하여 상위 디렉터리의 어떤 하위 디렉터리가 디렉터리인지 추론할 수 있습니다. 하위 디렉터리는 (links를 통해 ..
) 상위 디렉터리의 링크 수에 영향을 미치기 때문입니다. 어떤 경우에는 호출을 find
생략 할 수 있습니다 stat
. 그러나 파일 시스템이나 운영 체제가 이를 잘못 표시하는 경우 잘못된 결과가 st_nlinks
발생할 수 있습니다 find
(다행히 그런 경우는 거의 없습니다).
자세한 내용은 공식 문서를 참조하세요.https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimization.html
FTS
활성화되면 이 FTS
기능을 find
사용하게 됩니다.fts
재귀를 직접 구현하는 대신 파일 계층 구조를 탐색하기 위한 API입니다.
장점이 무엇인지는 잘 모르겠지만 기본적으로 fts
지금까지 본 FTS
모든 기본 버전의 기본값 입니다.find
추가 정보:https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html,http://man7.org/linux/man-pages/man3/fts.3.html
의회예산처
find
( 다니엘 쿨만이 제안한 소스 코드를 읽은 후) "CBO"는 쿼리 최적화 수준("비용 기반 최적화 프로그램"을 나타냄)을 의미하는 것으로 나타났습니다 . 예를 들어, 이렇게 하면 다음과 같은 find -O9001 --version
결과를 얻습니다.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=9001)
-O
의 옵션을 보세요 man find
.
-Olevel Enables query optimisation. The find program reorders tests to speed up execution while preserving the overall effect; that is, predicates with side effects are not reordered relative to each other. The optimisations performed at each optimisation level are as follows. 0 Equivalent to optimisation level 1. 1 This is the default optimisation level and corresponds to the traditional behaviour. Expressions are reordered so that tests based only on the names of files (for example -name and -regex) are performed first. 2 Any -type or -xtype tests are performed after any tests based only on the names of files, but before any tests that require information from the inode. On many modern versions of Unix, file types are returned by readdir() and so these predicates are faster to evaluate than predicates which need to stat the file first. 3 At this optimisation level, the full cost-based query optimiser is enabled. The order of tests is modified so that cheap (i.e. fast) tests are performed first and more expensive ones are performed later, if neces- sary. Within each cost band, predicates are evaluated earlier or later according to whether they are likely to succeed or not. For -o, predicates which are likely to succeed are evaluated earlier, and for -a, predi- cates which are likely to fail are evaluated earlier. The cost-based optimiser has a fixed idea of how likely any given test is to succeed. In some cases the probability takes account of the specific nature of the test (for example, -type f is assumed to be more likely to succeed than -type c). The cost-based optimiser is currently being evaluated. If it does not actually improve the performance of find, it will be removed again. Conversely, optimisations that prove to be reliable, robust and effective may be enabled at lower optimisation levels over time. However, the default behaviour (i.e. optimisation level 1) will not be changed in the 4.3.x release series. The findutils test suite runs all the tests on find at each optimisation level and ensures that the result is the same.
수수께끼가 풀렸습니다! 옵션이 런타임 값이라는 점은 약간 이상합니다. 일반적으로 --version
출력에는 컴파일 타임 옵션만 반영될 것으로 예상됩니다.
답변2
정보는 O_NOFOLLOW
다음 페이지에 제공됩니다:info
find
9.2.1.1 O_NOFOLLOW
.....................
시스템이 O_NOFOLLOW 플래그(1)를 지원하는 경우
open(2)' system call,
find'는 디렉토리를 변경하는 것이 안전할 때 이를 사용합니다. 먼저 대상 디렉터리를 열고find' changes working directory with the
fchdir()' 시스템 호출을 호출합니다. 이렇게 하면 심볼릭 링크를 따르지 않으므로 심볼릭 링크를 사용한 경쟁 조건 공격이 방지됩니다....
소스 트리를 보면 CBO
파일에만 나타납니다 parser.c
.
printf("CBO(level=%d) ", (int)(options.optimisation_level));
비용 기반 최적화라고 제안합니다(내 추측으로는).
D_TYPE
소스 트리의 여러 위치에 나타나며 디렉토리 항목 유형과 관련된 것으로 나타납니다.
$ grep 'D_TYPE' */**
생산하다:
find/parser.c:#if defined USE_STRUCT_DIRENT_D_TYPE && defined HAVE_STRUCT_DIRENT_D_TYPE
lib/savedirinfo.c:#if defined HAVE_STRUCT_DIRENT_D_TYPE && defined USE_STRUCT_DIRENT_D_TYPE
그리고 더 많은 항목. 소스 코드를 찾을 수 있습니다여기.
답변3
findutils 소스 트리를 보면(http://git.savannah.gnu.org/cgit/findutils.git/tree/), 다음을 발견했습니다.
- configure.ac: --enable-d_type-optimization, struct dirent.d_type의 readdir()이 반환한 파일 형식 데이터 사용),
- m4/withfts.m4: --without-fts fts()를 사용하는 대신 이전 메커니즘을 사용하여 파일 시스템을 검색합니다.
CBO에 대한 정보를 찾지 못했습니다. 소스 코드를 다운로드하고 해당 용어를 검색해 보세요.