본문 바로가기

PROGRAMMING/유닉스 기초

파일 링크 : ln - 하드 링크(Hard Link), 소프트 링크(Soft Link)


유닉스 시스템을 사용할 때, 


디렉토리 계층 구조를 따라 들어가고 들어가고 들어가서 실행해야 하는.. 그것도 자주 사용하는 파일이라면 매 번 찾아가기 번거롭다.

마치 내가 물건 하나 찾으려면 여기 뒤지고 저기 뒤지고 하지만 엄마에게 물어보면 단 한번에 어디에 있는지 찾아주는 이치! :-)


어쨌거나 오늘은 내가 편하게 유닉스를 사용할 수 있게 도와주는 링크에 대해서 포스팅해보겠다.


우선 링크를 들어가기 전에 i-node에 대해서 알아볼까?


* i-node 란????

: 파일이 생성될 때 마다 고유의 번호가 주어지는데, 그 번호를 i-node라고 한다.

사람들이 각 각 주민번호를 갖는 것과 같이 생각하면 된다.


파일의 목록을 조회하는 ls 명령어에서 -i 옵션값을 주면 i-node를 확인할 수 있다.



1) vi 편집기를 통해 inode 라는 파일을 만들었다.

2) mkdir 명령어를 통해 haveinode라는 디렉토리를 만들어 주었다.

3) 목록을 조회해주는 ls 명령어에 일련의 정보를 보여주는 -l 옵션값과 i-node를 보여주는 -i 옵션값을 주어 파일의 목록과 각 파일의 i-node를 확인해보았다.


파일의 리스트에서 맨 좌측에 쓰여져 있는 8자리의 숫자가 i-node이다.

inode라는 이름의 파일은 65405716의 i-node를 가졌고, haveinode라는 디렉토리는 65405713의
i-node를 가졌다.



각 파일의 번호를 부여하는 i-node, 알겠는가?

그렇다면 이제 링크에 대해서 설명하겠다.


첫 번째, 하드링크(Hard Link)


하드링크는 한 파일의 복사본을 만든다고 생각하면 된다. 그렇다고 cp(복사) 명령어와 같은 것은 아니다. 그것은 조금 뒤에 설명하겠다.

어쨌거나 하드링크는 한 파일을 복사하고 원본과 하드링크 파일은 같은 i-node를 가져 어디에서 수정을 하던지에 상관 없이 수정이 함께 이루어진다. 소프트 링크와의 차이점은 원본을 지워도 하드 링크 파일은 실행이 되며, 내용이 보존된다는 것이다.


하드링크의 명령어는 [ln 원본 하드링크이름] 이다.



original이라는 이름의 원본파일과 원본의 하드링크인 hardlink1, hardlink2를 보자.

총 3개의 파일의 i-node가 65405715 라는 것을 알 수 있다.

이 그림처럼 i-node 하나를 세 파일이 가지고 있음으로써 Original 파일에서 수정하든, hardlink1에서 수정하든, hardlink2에서 수정하든 상관없이 3 파일 모두 수정이 되는 것이다.



여기서 잠깐!

아까 cp 명령어를 잠시 언급했었는데, 하드 링크가 복사의 개념이랑 cp와 다른게 뭘까.



original과 원본 카피 파일 copy_origin은 i-node도 다를뿐더러, 카피본을 복사해도 원본에는 영향을 안끼치는 점이 ln의 하드링크와 다른 점이다.



두 번쨰, 소프트 링크 or 심볼릭 링크(Soft Link or Symbolic Link)


심볼릭 링크도 하드 링크와 비슷한 개념이다. 쉽게 의미를 이해시키자면 바로가기 아이콘과 같은 것이다. 원본을 복사하고 어디에서 수정을 하든 함께 내용이 바뀌는 것은 하드링크와 같다. 허나 다른 점이 있다면 하드 링크는 원본을 지워도 상관이 없지만 소프트 링크는 원본을 삭제하게 되면 연결이 끊겨 무용지물의 파일이 되버린다. 또, 하드링크와 다르게 두번째 부분에 파일 권한부분에서 소프트 링크는 맨앞에 l을 표시한다.


소프트 링크의 명령어는 [ln -s 원본 소프트링크] 이다.



하드 링크와의 비교를 위해 하드링크 파일을 하나 남겨 놓고 소프트 링크를 만들었다.

하드 링크는 역시나 원본과 i-node가 같은데..어라? 소프트링크는 i-node가 다르다. 뭘까?

이렇게 이해하면 된다.

이렇게 i-node에 i-node가 연결되는 것이다. 따라서 원본파일이 사라지면 링크 연결이 끊겨 참조할 파일이 없어 무용지물이 되는 것이다.




이번 포스팅을 통해 방문하시는 분들이 ln(링크) 명령어가 쉽게 다가왔으면 좋겠다 :-)