GNU find에서 "활성화된 기능"은 무엇을 의미합니까?

GNU find에서 "활성화된 기능"은 무엇을 의미합니까?

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에 대한 정보를 찾을 수 없습니다 .FTSD_TYPECBO

답변1

이것은 Ketan과 Daniel Kullman의 답변과 내 연구의 완전한 답변입니다.

대부분의 "기능"은 쿼리 최적화입니다. find일반적으로 파일 시스템에서 (거의) 임의로 복잡한 쿼리를 실행할 수 있기 때문입니다.


D_유형

이 기능이 존재한다는 것은 이 필드가 Linux에서도 채택한 BSD 확장 D_TYPE이라는 것을 의미하며 find, andfriends에서 반환된 구조에 파일 유형(디렉토리, 파일, 파이프, 소켓, 문자/블록 장치 등)을 제공합니다. ). 최적화로서 이를 사용하면 필터 표현식으로 사용될 때 호출을 줄이거나 제거할 수 있습니다.d_typestruct direntreaddirfindlstat-type

readdird_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다음 페이지에 제공됩니다:infofind

9.2.1.1 O_NOFOLLOW

.....................

시스템이 O_NOFOLLOW 플래그(1)를 지원하는 경우 open(2)' system call,find'는 디렉토리를 변경하는 것이 안전할 때 이를 사용합니다. 먼저 대상 디렉터리를 열고 find' changes working directory with thefchdir()' 시스템 호출을 호출합니다. 이렇게 하면 심볼릭 링크를 따르지 않으므로 심볼릭 링크를 사용한 경쟁 조건 공격이 방지됩니다.

...

소스 트리를 보면 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에 대한 정보를 찾지 못했습니다. 소스 코드를 다운로드하고 해당 용어를 검색해 보세요.

관련 정보