지난 글에서는 링크란 무엇인지 그 개념에 대해서 이야기를 해보았습니다. 그럼 이번 글에서는 실제로 링크를 만드는 방법과 함께 주의해야 할 점에 대해서 이야기를 해보도록 하겠습니다. 참고로 이 글에서 설명하는 내용들은 윈도우 비스타 이후 버전의 윈도우를 기준으로 하고 있으며, 윈도우 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 명령으로 윈도우를 통채로 옮기는 것이 가능했습니다. 하지만 윈도우 비스타 이후의 윈도우들은 그러한 방식으로 처리가 힘들어진 것이죠. [하드 링크가 풀어져 버린다거나 하는 문제가 발생합니다.]

아무튼, 뭐 그렇습니다. 윈도우에서의 링크에 대한 것은 대충 오늘의 글까지 하여 충분히 이야기했다고 생각합니다. 정리해놓으니까 속은 시원하네요. 이상입니다. ^^

 

 

신고
캐플 블로그에 공개된 글은 반드시 원본 글의 링크를 포함시키는 조건으로 자유롭게 이용하실 수 있습니다.
하지만 블로그의 발전을 위하여 되도록이면 링크로 글을 소개해주시길 부탁드립니다. ^^

- 상업적인 용도의 사이트는 대상에서 제외됩니다. -
- 글에는 오류가 있을 수 있고, 추후 수정 또는 재발행될 수 있습니다. -
  1. BlogIcon 다송송 2013.01.07 14:46 신고  댓글주소  수정/삭제  댓글쓰기
    심볼릭 링크에 대해서 속 시원히 긇어 주셨네요 감사합니다 캐플님.^^
  2. BEARPiG 2013.01.07 18:32 신고  댓글주소  수정/삭제  댓글쓰기
    스누피님의 http://www.snoopybox.co.kr/1400 강좌에서 처음 접했는데, 좋은 정보 감사드립니다.
  3. 돌산 2013.01.09 10:25 신고  댓글주소  수정/삭제  댓글쓰기
    윈도우에는 정말 않은 정션,심볼링크 등이 존재하는군요.내부적으로 이렇게 처리되고 있다는 것을 알게 되었습니다.
  4. BlogIcon ECO-NOTE 2013.03.28 13:59 신고  댓글주소  수정/삭제  댓글쓰기
    안녕하세요 캐플님. 이번에 vhd에 입문을 하였는데요, vhd로 os를 운영하면서 일반 데이타는 물리디스크에 저장하면 되서 아~ 좋다 했었는데요, 바탕화면 및 내문서의 경우에는 vhd 내에 저장되어서 이것을 물리디스크쪽으로 빼내고 싶어서 mklink를 알게되어 들어와서 읽어보았습니다. 그런데 제가 user\administrator\
    안에 있는 Desktop 폴더를 빼내고 싶었는데 통으로 옮기고 싶어도 삭제도 안되고 mklink /d Desktop d:\Desktop 라고 했더니 이미 있는 폴더라며 안됩니다. 윈도우상에서는 지워졌으나 dos 상에서는 폴더가 남아있어서요. 방법을 잘 모르겠습니다. 시간이 되신다면 좀 알려주실수 있으실까요? vhd도 하나의 파일이라 깨지면 큰일날꺼 같아서 꼭 옮기고 싶습니다.
    • BlogIcon CApple 2013.03.29 02:08 신고  댓글주소  수정/삭제
      사용자 폴더는 그렇게 옮기지 않아도 됩니다. ^^;; [link]http://cappleblog.co.kr/77[/link] 글을 참고하세요. 아참 혹시 윈도우 8 이시라면 C:\Users\사용자 폴더에서 직접 잘라내야 합니다.
  5. 정주행 2013.07.26 00:17 신고  댓글주소  수정/삭제  댓글쓰기

    아 이런 것도 있네요^^

    그럼 디스크관리에서 윈도우가 설치된 드라이브명은 함부로 바꿔주면 안되는 건가요?

    반대로 링크를 설정을 잘못 했을 시 드라이브명을 바꿔 줌으로 간단히 해결 될 수 있나요?(링크가 F로 잡혀 있으면 드라이브명을 F로 변경을 해버리면)
  6. 크리스탈 2014.05.08 21:34 신고  댓글주소  수정/삭제  댓글쓰기
    멋지네요. 짝짝짝
    가려운 곳을 모두 해결했습니다.
    감사합니다.
  7. Thisplus 2014.11.05 18:41 신고  댓글주소  수정/삭제  댓글쓰기
    좋은 정보 감사합니다.
    많은 도움이 됐습니다. ^^
  8. 도와주세요 2014.11.21 16:46 신고  댓글주소  수정/삭제  댓글쓰기
    해제하려면 어떻게 해야하나요? 심볼릭 링크 만들고 맘해버렸습니다. ㅠㅠ
  9. 아재 2016.12.25 12:31 신고  댓글주소  수정/삭제  댓글쓰기
    "파일이 이미 있으므로 만들 수 없습니다."
    그동안 여러 차례의 시행착오를 거쳐 여기까지 왔는데, 결국 모두에서와 같이 성공하지 못했습니다.
    최종적으로 cmd에 나타난 화면을 보면 이렇습니다.

    C:\>mklink /d "D:\0링크실습" "D:\1군주론_김경희"
    파일이 이미 있으므로 만들 수 없습니다.

    해결 방안이 없을까요? 고견을 기다립니다.
  10. 지니 2017.07.08 09:56 신고  댓글주소  수정/삭제  댓글쓰기
    좋은글 감사합니다. ^_^
    그동안 약간 모호하던 개념을 확실히 정리할 수 있었네요.

    글을 읽다보니 오타가 하나 있는것 같아요.
    제가 제대로 이해했다면

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

    상단의 그림 속 내용중에

    mklink /d "E:Test" "D:\Data"
    mklink /d "E:Test" "E:\Data" 가 되어야 할듯 하네요.

댓글을 달아 주세요

- 댓글에선 예의를 지켜주시기 바라며, 블로그지기는 댓글에서 따로 활동하지 않습니다.

* 티스토리 사용자는 여기를 클릭하시면 로그인 됩니다.

BBCode 안내   굵게 밑줄 기울임 취소선   취소선 취소선 취소선 취소선   왼쪽 정렬 가운데 정렬 오른쪽 정렬   코드박스 인용구 이미지   이미지 업로드-Imgur.com