Profile picture

[Linux] 파일 링크 (하드 링크 / 심볼릭 링크 / inode)

JaehyoJJAng2023년 03월 15일

윈도우 바로가기 vs 리눅스 링크

윈도우에서는 어떤 파일을 실행할 때, 바로가기를 통해 특정 프로그램에 쉽게 접근할 수 있다. 리눅스 역시 윈도우의 바로가기와 비슷한 기능을 제공하는데, 이를 리눅스 링크 라고 부른다. 하지만 리눅스 링크는 윈도우의 바로가기와 조금 다르다.

리눅스에서는 **하드 링크(Hard Link)**와 심볼릭 링크(Symbolic Link) 두 가지로 나뉘어져 있다.


inode ?

리눅스에는 inode라는 개념이 존재한다. inode는 유닉스 계통의 파일 시스템에서 사용하는 자료 구조이다.

모든 파일과 디렉토리는 한개씩의 inode를 가지고 있다. 그리고 여기에는 해당 파일의 허가권, 소유권, 파일의 실제 위치 등 중요한 정보들이 들어있다.

우리가 파일안에 데이터가 들어있다고 생각한 것은, inode가 데이터를 담고 있는 메모리영역을 가리키는 주소이고 파일이 inode에 연결되어 있는 형태 인 것이다.


inode는 어떤 데이터를 가지고 있을까?

inode가 가지고 있는 정보 설명
inode 번호 inode의 고유 식별 번호
파일 모드 16비트의 플래그로 파일의 실행 권한 소유자의 권한, 소유자 그룹의 권한,기타 사용자의 권한, 파일 형식, 실행 플래그 등을 나타낸다.
링크 수 이 아이노드에 대한 참조 수
소유자 아이디 파일의 소유자 아이디.
그룹 아이디 파일 소유자의 그룹 아아디
파일 크기 파일의 크기(bytes)
파일 주소 실 데이터가 나오는 파일 주소
마지막 접근 마지막으로 파일에 접근한 시간
마지막 수정 마지막으로 파일을 수정한 시간
아이노드 수정 마지막으로 아이노드를 수정한 시간

inode는 실제 파일의 내용을 갖고 있지는 않다. inode는 데이터의 우편번호 역할을 한다고 볼 수 있다. 즉, 파일의 내용을 갖고 있는 주소를 포함할 뿐이다.

$ ls -li # inode 정보 확인
6291594 -rw-r--r-- 1 bandit bandit    0  83014:37 test
6291559 -rwxr--r-- 1 bandit bandit  178  83014:26 test.sh
6291500 drwxr-xr-x 2 bandit bandit 4096  82811:49 공개
6291498 drwxr-xr-x 2 bandit bandit 4096  82811:49 다운로드
6291501 drwxr-xr-x 2 bandit bandit 4096  82811:49 문서
6291497 drwxr-xr-x 2 bandit bandit 4096  82811:49 바탕화면
6291504 drwxr-xr-x 2 bandit bandit 4096  82811:49 비디오
6291503 drwxr-xr-x 2 bandit bandit 4096  82811:49 사진
6291499 drwxr-xr-x 2 bandit bandit 4096  82811:49 서식
6291502 drwxr-xr-x 2 bandit bandit 4096  82811:49 음악

inode의 값은 ls 명령어의 -i 옵션으로 확인할 수 있다. test.sh 라는 파일의 inode 주소값은 6291559 인 것을 확인할 수 있다.

실제 inode의 내용을 확인해보고 싶다면 stat 명령을 사용해서 확인 할 수 있다. 위의 표 내용 정보가 그대로 담겨 있다.


리눅스 파일 링크 종류

하드 링크

하드 링크 (Hard link) 하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리킨다. 따라서 원본 파일이 사라지더라도 데이터만 살아 있다면 원본 파일에 접근이 가능하다. (일반 변수 복사 개념. 밑에 후술)

  • 동일한 파일시스템 내에서만 하드링크 생성가능.
  • 디렉터리 링크 불가능
  • 대상파일과 동일한 inode 번호와 허가권 가짐.
  • 대상파일을 옮기거나 삭제하더라도 대상파일을 참조. (그냥 같은 inode를 가리켜 같은 파일데이터를 갖고있는 파일일 뿐이지 하드링크는 대상파일과 아무런 관련이 없다)
  • 소프트 링크는 원본이 삭제될 경우 링크를 사용할 수 없지만,

하드 링크는 원본이 삭제되어도 원본과 동일한 내용의 파일을 가지고 있으므로, 자원을 공유하면서도 데이터를 안전하게 관리하고자 할 때 주로 사용된다.


# 하드 링크 생성
$ ln [대상파일] [하드링크파일]
$ touch test_hard # 빈 파일 생성
$ ln test_hard test_hard_ln # test_hard_ln에 test_hard 파일을 연결하여 하드링크 생성

심볼릭 링크

심볼릭 링크(소프트 링크)의 경우는 만들게 되면 또 다른 inode를 생성해서 이를 바라본다. 복사 생성된 inode는 포인터를 카리키고, 포인터는 다시 원본 파일을 가리키는 것이다. (참조 변수 복사 개념. 밑에 후술)

  • 심볼릭 링크는 하드 링크의 단점을 보완하기 위해 탄생
  • 파일시스템과 대상파일이 존재하는 파일시스템이 달라도 생성가능.
  • 하드링크는 파일만 참조 가능하고, 디렉토리는 참조 불가

심볼릭 링크는 파일이나 디렉토리를 가리킬 텍스트 포인터를 가짐으로서 참조 가능

  • 대상파일과 심볼릭링크 파일은 서로 inode 번호와 파일허가권이 다름.
  • 대상 파일의 inode가 아닌 대상 파일의 데이터 경로만을 참조.
  • 원본 파일이 사라지면 해당 데이터에 접근할 수 없음.
  • 파일 종류 l로 시작

# 심볼릭 링크 생성하기
$ ln -s [대상파일] [심볼릭링크파일]
$ mkdir test_dir # 빈 폴더 생성
$ touch test_symbol # 빈 파일 생성

$ cd test_dir # test_dir 로 이동
$ cp /etc/passwd testfile # passwd 파일을 현재 경로(test_dir)에 testfile 파일명으로 복사

$ ln -s ./testfile /home/user/testfile-symbol # testfile 파일 링크 연결할 /home/user/ 경로에 testfile-symbol 심볼릭 링크 파일 생성

*심볼릭 링크에 대해 한 가지 기억해야 할 것은 대부분의 파일 작업이 링크 그 자체에서 실행되는 것이 아니라 링크가 가리키고 있는 원본 파일에서 이루어지는 것


Loading script...