mklink
Vista 이후 Windows에서 발생하는 몇 가지 이상한 동작은 다음과 같습니다 . mklink
NTFS 파일 시스템 드라이버에 결함이 있거나 그 만큼 깊은 결함이 있을 수 있다고 생각 하지만 동작에 대한 설명이 필요할 수 있습니다. 이 동작은 각각 Windows 7 및 10에서 발생했습니다.
NTFS 볼륨에 디렉토리가 있다고 가정합니다(아니다이 유일한 목적으로 생성하는 볼륨과 bar.txt
그 안에 이름이 지정된 파일을 제외한 모든 항목에 이 작업을 시도해 보세요.
md F:\1
echo foo > F:\1\bar.txt
이제 다음 명령을 실행하십시오(특권 프롬프트를 통해):
mklink F:\1:bar F:\1\bar.txt
... 다음을 제공해야 합니다.
symbolic link created for F:\1:bar <<===>> F:\1\bar.txt
걱정하지 마세요.알다 이것은바보 같은. 하지만 대체 데이터 스트림(ADS)이 재분석 지점이 될 수 있는지 테스트한 결과였습니다. 대체 데이터 스트림에는 이름, 크기 및 내부 데이터만 있기 때문에 나는 그럴 수 없다고 생각했습니다. 파일이나 디렉터리와 달리 파일 속성이나 자체 타임스탬프가 없으므로 ADS를 재분석 지점으로 지정하는 속성이 없습니다(그렇지 않으면 파일 속성을 통해 발생함). 또는 다르게 말하면 재분석 지점은 참조만 가능합니다.에게디렉토리 항목( 을 통해 $Extend\$Reparse
)과 달리 ADS는 디렉토리 항목에 연결됩니다.
위 명령의 결과는 다음과 같습니다.
F:\>dir /r
Volume in drive F is TEST
Volume Serial Number is 24F3-8A7D
Directory of F:\
2018-04-03 20:47 <SYMLINKD> 1 [F:\1\bar.txt]
0 1:bar:$DATA
0 File(s) 0 bytes
1 Dir(s) 4,244,283,392 bytes free
당연히 이 디렉토리로 변경하려는 시도가 작동하지 않고 결과가 발생합니다.The directory name is invalid.
junction -d
마찬가지로 (Sysinternals Suite에서)을 사용하거나 사용하여 재분석 지점을 삭제하려고 하면 fsutil reparsepoint delete
동일한 오류가 발생하여 실패합니다. 재분석 지점 데이터를 검사하면 다음과 같은 사항을 확인할 수 있습니다.
F:\>fsutil reparsepoint query F:\1
Reparse Tag Value : 0xa000000c
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Symbolic Link
Reparse Data Length: 0x00000044
Reparse Data:
0000: 18 00 20 00 00 00 18 00 00 00 00 00 46 00 3a 00 .. .........F.:.
0010: 5c 00 31 00 5c 00 62 00 61 00 72 00 2e 00 74 00 \.1.\.b.a.r...t.
0020: 78 00 74 00 5c 00 3f 00 3f 00 5c 00 46 00 3a 00 x.t.\.?.?.\.F.:.
0030: 5c 00 31 00 5c 00 62 00 61 00 72 00 2e 00 74 00 \.1.\.b.a.r...t.
0040: 78 00 74 00 x.t.
이제 내 질문은 여기서 무슨 일이 일어났는지, 그리고 온보드 Windows 도구(또는 실패할 경우 외부 도구)를 사용하여 이러한 재분석 지점을 어떻게 다시 제거할 수 있습니까?폴더 내의 파일에 무슨 일이 일어났는지 답변 1
하고 방법론을 공개할 수 있다는 점에서 보너스 포인트입니다.
지금까지 내 작업 이론은 다음과 같습니다.
mklink
"파일"을 생성F:\1:bar
하고 성공합니다(아마도 를 통해CreateFile()
).mklink
REPARSE_DATA_BUFFER
디렉토리의 ADS이므로 작동할 수 없는 생성된 "파일"에 를 설정합니다 . 따라서 내부적으로 일어나는 일은 파일 시스템 드라이버가 디렉터리에 재분석 데이터 버퍼를 설정한다는 것입니다.
결과는 우리가 보는 것입니다. 여기서 나를 괴롭히는 것은 일반적으로 특정 플래그를 지정하지 않고는 디렉토리에 대한 핸들을 얻을 수 없다는 것입니다. 그래서 우리는 mklink
심볼릭 링크를 생성 했을 뿐만 아니라디렉토리에파일에 FILE_FLAG_BACKUP_SEMANTICS
.
FILE_FLAG_BACKUP_SEMANTICS
이하 의 문서CreateFile
읽는다:
디렉터리에 대한 핸들을 얻으려면 이 플래그를 설정해야 합니다. 일부 함수에는 파일 핸들 대신 디렉터리 핸들이 전달될 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.
재생산하려면 다음을 강력히 권합니다.~ 아니다기존 NTFS 드라이브에서 이 작업을 시도하고 대신 다음을 사용하여 새 드라이브를 생성하십시오.아임디스크RAM 디스크 드라이버 및 함께 제공되는 imdisk
명령줄 도구(권한 프롬프트를 통해):
imdisk -a -t vm -p "/fs:ntfs /q /y /v:TEST" -s 4G -m F:
(적절하다고 판단되는 대로 매개변수를 변경하십시오. -m
는 드라이브 문자와 -s
RAM 디스크의 크기를 나타냅니다.)