컴퓨터 과학(CS)/리눅스

소프트 링크, 하드 링크

Bentist 2022. 1. 18. 16:36

링크(Link)

링크는 컴퓨터 상에서 어떤 대상으로의 연결이나 그와 연관한 복사본을 가리킨다. 우리가 윈도우에서 보는 모든 파일도 실제 파일에 대한 파일 시스템의 링크이다.

 

파일 시스템하드디스크 안의 실제 데이터에 쉽게 접근할 수 있도록 파일을 조직하고 관리하는 체제이다. 우리는 디스크에 기록된 실제 데이터를 직접 보는 게 아니라 파일 시스템에 기록된 파일의 정보(Inode)를 보고 있는 것이다. 파일 시스템 정보에는 파일에 대한 여러 정보와 함께 실제 파일이 저장된 디스크에 찾아갈 수 있는 링크 또한 저장되어 있다.

심볼릭 링크하드 링크를 이해하기 위해서는 Inode 개념을 먼저 이해해야 한다.


아이노드(Inode)

위키피디아

Inode는 유닉스 계통의 파일 시스템에서 사용하는 자료 구조다. Inode파일 시스템 내의 해당 파일에 관한 정보를 갖고 있는데 파일의 사용자, 권한(읽기, 쓰기, 실행)파일이 위치한 디스크 내의 물리적 주소파일의 링크 수, 크기, 아이노드 넘버, 만들어진 시간 등을 저장하고 있다.

 

I(Index) Node의 줄임말로,
Index(색인): 어떤 내용을 빨리 찾아보기 위해 일정한 순서로 정리한 목록
Node(데이터의 지점이나 장치): 데이터를 갖고 있는 디스크의 한 지점이나 휴대폰, 프린트 같은 장치도 노드

 

정리하자면,
Inode 데이터를 갖고 있는 파일을 빠르게 찾기 위해 순서대로 정리한 정보


리눅스 터미널에서 ls -l 명령어를 쳐보면, 아래와 같은 파일 정보가 나오는데, 이 파일들의 정보가 Inode다.

inode 맨 앞의 d는 '디렉토리', -는 '일반 파일'을 의미

리눅스의 모든 파일들은 각자 1개의 Inode를 가지고 있으며, Inode 번호로 파일 시스템 내의 파일들을 식별할 수 있다.

ls -li 명령어로 맨 왼쪽의 Inode 번호를 볼 수 있다.


소프트(심볼릭) 링크

 심볼릭 링크(symbolic link) 또는 기호화된 링크 원본 파일이나 디렉토리에 대한 위치를 포함한 특수 파일이다. 윈도우의 바로 가기 파일도 심볼릭 링크이며, 리눅스에서도 많이 사용하게 된다. 심볼릭 링크는 원본 파일이나 디렉터리에 대한 경로로서 운영 체제가 자동으로 해석하고 추적하는 텍스트 문자열을 포함한다.

  • ln -s [원본 파일명] [바로가기 파일명]

ls -li로 파일 정보 출력

ln -s 명령어로 fff_soft라는 심볼릭 링크를 만들었다. ls -li 명령어로 파일 정보를 보면 fff_soft는 원본인 fff와 다르게 파일 크기, Inode번호, 권한 등이 다 다르다. 그러나 생성된 시간은 원본이랑 연결되어 있기 때문에 같다고 나온다.

심볼릭 링크는 원본 파일의 Inode와 다른 새로운 Inode를 생성한 별개의 파일이므로 삭제해도 원본 파일에 영향을 주지 않으며, 원본을 삭제하면 심볼릭 링크는 사용할 수 없게 된다. 또한 별개의 파일이지만 원본 파일을 가리키고 있기 때문에 심볼릭 링크의 내용을 변경해 원본 파일의 내용을 수정할 수 있다.

 

하드 링크(동일한 파일에 두 개 이상의 이름을 짓는 것)

원본 파일을 가르키는 심볼릭 링크와 다르게 하드 링크 원본 파일과 동일한 Inode를 가리키는 파일이다. 하드 링크는 원본 파일과 파일명만 다를 뿐, 원본 파일과 같은 Inode를 참조하고 있기 때문에 원본 파일이 삭제 되더라도 여전히 원본과 같은 데이터를 가리킨다. 그리고 생성된 하드 링크는 원본 파일과 동일한 물리적 데이터를 가리키고 있으므로, 하드 링크 파일을 수정하면 원본 파일 또한 동일하게 수정된다.

  • ln [원본 파일명] [하드링크 파일명]

하드링크는 소프트링크와 달리 원본을 가리키는 화살표도 없고, 원본 파일명과 이름만 다를 뿐 원본 파일의 inode번호와 파일 크기 등 모든 것이 똑같다.  

하드링크는 단지 디스크에 있는 실제 데이터를 참조할 수 있는 디렉토리 엔트리를 하나 더 만든 것이다.

* 디렉토리 엔트리: 디렉토리를 표현하는 데에 쓰이는 자료구조로 파일 이름과 아이노드 번호를 갖고 있다.

 

그럼 원본 파일에는 영향을 주지 않는 독립된 복사 파일을 만들 수는 없을까? 바로 cp 명령어를 통해 가능하다.

  • cp [원본 파일명] [복사본 파일명]

만약 10MB의 용량을 차지하는 원본 A라는 파일을 B라는 이름으로 복사하면 결과적으로 원본 A파일 10MB, 복사하여 만든 B파일 10MB로 하드디스크에서는 총 20MB의 용량을 차지하게 된다. A 파일과 B 파일은 관계가 없는 독립적인 파일이 된 것이다. 따라서 어느 한쪽을 삭제하거나 변경을 가해도 다른 파일에는 전혀 영향이 없는 것이다.

하드링크는 동일한 Inode를 가리키기 때문에 전체 파일 용량은 달라지지 않고, 동일한 10MB의 용량을 갖는다.