SKELETON

지난 글에서는 링크란 무엇인지 그 개념에 대해서 이야기를 해보았습니다. 그럼 이번 글에서는 실제로 링크를 만드는 방법과 함께 주의해야 할 점에 대해서 이야기를 해보도록 하겠습니다. 참고로 이 글에서 설명하는 내용들은 윈도우 비스타 이후 버전의 윈도우를 기준으로 하고 있으며, 윈도우 XP 이하 윈도우에서는 mklink 명령과 심볼 링크 기능을 제공하지 않습니다. [윈도우 XP 에선 하드 링크는 fsutil 로 정션은 따로 junction 이라는 프로그램을 통해 생성 가능합니다. 하지만 이번 글에서는 다루지 않겠습니다.] 


참고로 이러한 하드 링크, 심볼 링크, 정션은 오직 NTFS 파일 시스템으로 포맷된 드라이브에서만 생성이 가능합니다. [대상이 되는 원본 폴더는 상관 없음] 즉, NTFS 에 링크(정션)을 만들고 FAT32 로 포맷된 드라이브에 위치한 폴더로 연결하는 것은 가능하지만, 반대의 경우는 불가능합니다. 이 부분은 기억을 하시고 보시길 바랍니다.



mklink 를 통해 링크를 생성하고 확인하는 방법


글에서 작업의 대상이 될 원본 파일과 폴더



링크를 생성하는 것은 윈도우 비스타 이후 내장된 mklink 명령을 통해 작업할 수 있습니다. 일단 기본적인 mklink 명령의 구조는 아래와 같습니다. 이 때 링크는 생성할 사본을, 원본은 생성된 링크가 가르킬 파일/폴더를 의미합니다. [링크 => 원본]

1. 파일 심볼 링크 : mklink "링크" "원본"
2. 파일 하드 링크 : mklink /h "링크" "원본"
3. 폴더 심볼 링크 : mklink /d "링크" "원본"
4. 폴더 정션 링크 : mklink /j "링크" "원본"


명령의 구조는 위와 같이 매우 단순하며, 생성할 링크의 종류에 따라 무옵션 또는 /h, /d, /j 를 추가해주면 되는 겁니다.

참고로 이 때, 원본을 절대 경로로 지정하는 경우 최종적으로 사용되는 환경에서의 절대 경로를 입력해야 하며, 하드 링크를 제외한 심볼 링크와 정션은 작업시 원본 파일이나 폴더가 실제로 존재하는지 확인하지 않습니다. 심볼 링크와 정션은 실제로 해당 링크가 사용될 때, 지정한 경로에 해당 파일이나 폴더가 존재하기만 하면 되는 것이죠. 또한 심볼 링크에서는 절대 경로 외에도 상대 경로를 사용할 수 있습니다. 이러한 내용은 뒤에서 차차 이야기하도록 하겠습니다.

다음으로 파일 링크의 경우 링크 사본의 확장자 형식은 원본 파일의 확장자 형식과 달라도 상관이 없습니다. 하지만 이럴 경우 파일 형식이 맞지 않아 문제가 생길 수 있기 때문에, 확장자를 달리 지정하는 것은 좋지 않습니다.

그럼 실제로 링크를 생성해보도록 하겠습니다.



1. 파일에 대한 심볼 링크를 생성하고 확인하기

먼저 파일에 대한 심볼 링크는 mklink 를 통해 옵션 없이 생성하면 되며, 원본 파일의 경로는 드라이브 문자를 포함한 절대 경로 또는 드라이브 문자를 제외한 상대 경로를 모두 사용할 수 있습니다. 그리고 이렇게 생성한 링크 파일에 대한 확인은 Dir /AL 명령을 통해 확인할 수 있으며, 목록에서 <SYMLINK> 로 표시됩니다. 파일 뒤에 [] 에 표시되는 것은 해당 링크가 가르키는 원본 파일을 의미합니다.

mklink "D:\FiS-A.txt" "D:\CApple.txt"
dir D:\ /AL 







2. 파일에 대한 하드 링크를 생성하고 확인하기

다음으로 파일에 대한 하드 링크는 mklink /h 를 통해 생성하며. 이 때 원본 파일은 작업 당시 실제로 존재하고 있어야 하며, 반드시 생성하려는 링크 사본과 동일 드라이브여야 합니다. 또한 다른 대상을 가르키는 나머지 세 가지의 링크와 달리, 하드 링크를 통해 생성된 파일은 그 자체로 완전한 하나의 파일이기 때문에 Dir 명령을 통해서는 구별을 할 수 없습니다. 하드 링크로 생성된 파일은 해당 파일과 연결된 실제 파일에 어떠한 다른 파일 파일들이 연결되어 있는지를 확인하는 fsutil hardlink list 명령을 통해 확인할 수 있습니다.

mklink /h "D:\FiH-A.txt" "D:\CApple.txt"
fsutil hardlink list "D:\FiH-A.txt"







3. 폴더에 대한 심볼 링크 생성하기

다음으로 폴더에 대한 심볼 링크의 생성은 mklink /d 를 통해 생성하며, 원본 폴더의 경로는 드라이브 문자를 포함한 절대 경로 또는 드라이브 문자를 제외한 상대 경로를 모두 사용할 수 있습니다. 그리고 이렇게 생성한 링크 폴더에 대한 확인은 파일과 마찬가지로 Dir /AL 명령을 통해 확인할 수 있으며, 목록에서 <SYMLINKD> 로 표시됩니다. 파일 뒤에 [] 에 표시되는 것은 해당 링크가 가르키는 원본 폴더를 의미합니다.

mklink /d "D:\FoS-A" "D:\Data"
dir D:\ /AL







4. 폴더에 대한 정션 링크 생성하기

다음으로 폴더에 대한 정션 링크의 생성은 mklink /j 를 통해 생성하며, 원본 폴더의 경로는 절대 경로로만 저장됩니다. 이렇게 생성한 링크 폴더에 대한 확인은 마찬가지로 Dir /AL 명령을 통해 확인할 수 있으며, 목록에서 <JUNCTION> 으로 표시됩니다. 폴더 뒤에 [] 에 표시되는 것은 해당 링크가 가르키는 원본 폴더를 의미합니다.

mklink /d "D:\FoJ-A" "D:\Data"
dir D:\ /AL










정션과 심볼 링크의 절대 경로에 대한 이해와 주의해야 할 점


* 하드 링크는 바로 가기의 개념이 아니기 때문에 이 단락의 내용과는 아무런 관련이 없습니다.

정션과 심볼 링크는 기본적으로 원본 대상에 대한 바로 가기 경로를 절대 경로(Absolute Path)로 지정하게 됩니다. 근데 여기에서 여러분들이 반드시 아셔야 할 점이 바로 정션이나 심볼 링크에 한 번 지정된 바로 가기 경로는 수정되지(변하지) 않는다는 것입니다. 정션이나 심볼릭 링크는 생성 당시 지정한 원본이 실제로 존재하는지 확인하지 않는 특성이 있죠. 그게 괜히 그러는 것이 아닙니다.

일단 먼저 이야기할 것은 윈도우에서 드라이브 문자라는 것은 고정된 경로가 아닌 언제든지 바뀔 수 있는 상당히 변화무쌍한 경로라는 겁니다. 간단한 예로 지금 당장 D: 드라이브이지만, 내가 만일 D: 드라이브를 내일 T: 드라이브로 바꾸면, 그 때 부터는 T: 드라이브라는 거죠. 이 뿐만이 아닙니다. 멀티 부팅 윈도우나 윈도우 PE 와 같은 다른 윈도우로 부팅하면 드라이브 문자가 바뀌기도 합니다.


정션이나 심볼 링크에 한 번 지정된 바로 가기 경로는 수정되지 않는다고 했죠. 그래서 정션이나 심볼 링크에서 지정한 원본의 드라이브의 문자가 바뀌면 기존의 정션과 심볼 링크들은 더미 링크, 즉 사용할 수 없는 링크가 되어 버리는 문제가 있습니다. 간단하게 아래를 보시죠.

현재 아래와 같이 D: 드라이브의 파일과 폴더들을 원본으로 하는 정션과 심볼 링크들이 생성되어 있습니다.





이 상태에서 D: 드라이브를 T: 드라이브로 바꿔봤습니다.




대상(원본)의 드라이브 문자가 바뀌었지만 기존 정션과 심볼 링크에 설정되어 있는 원본의 바로 가기 경로는 수정되지 않고, 그대로 D: 드라이브를 가르키고 있는 것을 확인할 수 있습니다.




결론적으로 바로 가기로 D: 드라이브를 가리키고 있던 시스템 내 모든 정션과 심볼 링크는 더미 링크가 되어 더이상 사용할 수 없습니다.



문제는 한 번 설정된 정션이나 심볼 링크의 경로는 다시 수정할 수 없다는 겁니다. 그래서 이러한 경우 문제를 해결하는 방법은 기존의 D: 드라이브로 연결된 모든 정션과 심볼 링크를 새로 생성하는 겁니다. 한두 개라면 상관없지만 여기저기 다른 드라이브에까지 아주 거미줄처럼 정션과 심볼 링크들이 치렁치렁 연결되어 있다면 심란해질 수 밖에 없죠. 그러니 정션과 심볼 링크를 사용하는 경우 드라이브 문자를 바꾸려는 경우 이점을 반드시 생각하시길 바랍니다.






정션과 심볼 링크를 생성할 때 주의해야 할 점


* 하드 링크는 바로 가기의 개념이 아니기 때문에 이 단락의 내용과는 아무런 관련이 없습니다.

기본적인 내용은 앞의 단락과 동일한 내용입니다. 다시 이야기 하지만 정션과 심볼 링크에서 원본의 절대 경로는 생성 당시 지정한 경로로 이후 변하지 않고 쭈욱 사용됩니다. 그리고 작업 환경에 따라 이러한 원본의 드라이브 문자는 바뀔 수 있습니다. 그래서 정션과 심볼 링크를 생성할 때 반드시 기억해야 할 것은 생성할 링크는 현재 작업 중인 윈도우를 기준으로 지정하며, 원본 대상은 최종적으로 사용할 윈도우에서의 드라이브 문자를 지정해줘야 합니다.

mklink [/d] [/j] "링크 - 현재 윈도우의 경로를 기준으로" "원본 - 최종적으로 사용될 윈도우의 경로를 기준으로"



간단하게 최종적으로 사용할 윈도우에서 D: 볼륨에 위치해 있는 \Data 폴더에 대한 동일 볼륨에 \Test 로 심볼 링크를 생성하는 것을 기준으로 해보도록 하겠습니다. 이것을 현재 윈도우에서 곧바로 작업할 때와 윈도우 PE 로 부팅하여 작업할 때(드라이브 문자가 바뀔 때)를 기준으로 어떻게 다른지 보도록 하죠.




일단 이것을 현재 윈도우에서 작업한다면 아래와 같이 작업하면 됩니다.



하지만 멀티 부팅 중인 다른 윈도우나 윈도우 PE 로 부팅하여 작업을 하면 볼륨들의 드라이브 문자가 바뀔 수 있습니다. 실제로 제 작업 환경에선 대상 볼륨이 D: -> E: 드라이브로 바뀌었네요. 그러면 아래와 같이 작업하면 됩니다.



간단하죠? 정션과 심볼 링크를 윈도우 PE 와 같은 환경에서 작성하는 경우도 많으니 반드시 이 부분을 생각하면서 작업하시길 바랍니다.






심볼 링크에서 상대 경로가 필요한 이유


* 하드 링크는 바로 가기의 개념이 아니기 때문에 이 단락의 내용과는 관련이 없습니다.
* 정션은 상대 경로를 사용하지 못합니다.


벌써 세 번째이지만 그래도 한 번 더 이야기하죠. 링크의 원본 바로 가기 경로는 한 번 설정되면 수정되지 않습니다. 그래서 원본의 드라이브 문자가 바뀌면 절대 경로로 지정된 정션과 심볼 링크는 더미가 됩니다. 그러면 생각해봅시다. USB 외장 드라이브는? 드라이브 문자가 고정되어 있지 않죠. 어떤 컴퓨터에선 F: 드라이브로 인식될 수도 있고, 어떤 컴퓨터에선 G: 로 인식될 수도 있는 겁니다. 그렇다면 이와 같은 외장형 저장 장치들에서는 링크를 전혀 사용할 수 없는 걸까요?

먼저 정션은 절대 경로만 지정이 가능하기 때문에 외장형 저장 장치 내부에서는 사용이 힘들고, 그래서 논외로 치도록 하겠습니다.


일단 심볼 링크가 다른 드라이브에 위치한 원본을 연결하는 경우도 많지만, 동일 드라이브의 원본을 가르키는 경우도 많습니다. 즉, 링크와 원본이 동일 드라이브에 존재하는 경우도 많다는 것이죠. 이렇게 링크와 원본이 동일 드라이브에 위치하는 경우에는 원본의 위치를 상대 경로(Relative Path)로 지정할 수 있습니다. 이러한 상대 경로는 드라이브 문자의 영향을 받지 않기 때문에 결론적으로 드라이브 문자가 바뀌더라도 심볼 링크가 더미가 되지 않고 올바로 작동하는 장점이 있습니다. 대신 동일 드라이브 내에서만 지정이 가능하다는 단점이 있죠.

참고로 이 때 상대 경로라는 것은 원본의 전체 경로에서 드라이브 문자만 제거하면 그게 바로 상대 경로가 됩니다. 즉, 상대 경로는 현재 생성할 링크 사본의 경로를 기준으로 하는 게 아니라, 볼륨 전체를 대상으로 하는 경로라는 이야기입니다. 어째 이걸 먼저 정리했어야 한 것 같은 느낌이 강하게 들지만 아무튼, 정리하면 아래와 같습니다.

절대 경로 : 드라이브 문자를 포함한 파일/폴더의 전체 경로
상대 경로 : 절대 경로에서 드라이브 문자만 제외한 나머지 경로



아래는 실제로 상대 경로를 통해 심볼 링크를 생성하고 이를 확인해본 예제입니다.

mklink /d "D:\FoS-R" "\Data"
dir D:\ /AL




이렇게 생성된 상대 경로로 생성된 심볼 링크는 이후 절대 경로로 지정된 정션이나 심볼 링크와는 다르게 해당 드라이브의 문자가 바뀌더라도 상관없이 정상적으로 작동합니다.




참고로 한 가지 더 첨언하자면 %SystemDrive% 와 같은 시스템 변수 경로는 상대 경로가 아닙니다. set 명령을 통해 시스템 변수들을 확인해보면 절대 경로가 표시되죠. 그래서 만약 mklink 작업에 시스템 변수를 통해 경로를 지정하면 해당 변수에 맞는 절대 경로가 지정됩니다.








윈도우 드라이브와 링크들


윈도우는 수많은 하드 링크와 정션과 심볼 링크들이 산재해있는 굉장히 복잡한 녀석입니다. 예로 WinSxS 폴더에는 버전 관리를 위한 수많은 하드 링크 파일들이 위치해 있고, 기존 윈도우용으로 제작된 프로그램들과의 호환 및 기타 관리를 위해 굉장히 많은 정션과 심볼 링크들이 존재하고 있습니다.



그래서 윈도우 비스타 이후의 윈도우들을 백업하고 복원할 때는 이러한 하드 링크와 정션과 심볼 링크들이 정상적으로 잘 처리가 되어야 합니다. 윈도우 XP 까지는 이러한 하드 링크나, 정션, 심볼 링크가 없었기 때문에, 여차하면 별다른 백업 프로그램 없이 XCopy 명령으로 윈도우를 통채로 옮기는 것이 가능했습니다. 하지만 윈도우 비스타 이후의 윈도우들은 그러한 방식으로 처리가 힘들어진 것이죠.[하드 링크가 풀어져 버린다거나 하는 문제가 발생합니다.]


원본 글 - http://cappleblog.co.kr/539


댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다