...
윈도우 바로가기 vs 리눅스 링크
윈도우를 사용하다 보면 어떤 파일을 실행할 때, 바로가기를 통해 접근해본 경험을 해 봤을 것이다. 리눅스 역시 윈도우의 바로가기와 비슷한 기능을 제공하는데, 이를 리눅스 링크 라고 한다. 하지만 리눅스에서 링크는 윈도우의 바로가기와 조금 다르다. 리눅스에서 링크는 하드링크(Hard Link) 와 심볼릭링크(Symbolic Link, 혹은 Soft Link) 두 가지로 나뉘어져 있다. 이번 포스팅에서 리눅스의 두 가지 링크에 대한 차이점과 생성 방법에 대해 알아보도록 하겠다.
inode 란?
먼저, 리눅스에는 inode 라는 개념이 있다. inode 는 유닉스 계통의 파일 시스템에서 사용하는 자료 구조이다.
모든 파일과 디렉토리는 한개씩 inode 를 가지고 있다. 그리고 여기에는 해당 파일의 허가권, 소유권, 파일의 실제 위치 등 중요한 정보들이 들어있다.
즉, 우리가 파일안에 데이터가 들어있다고 생각한 것은, inode가 데이터를 담고 있는 메모리영역을 가리키는 주소이고 파일이 inode에 연결되어 있는 형태 인 것이다.
inode는 어떤 정보를 갖고 있는지 보자
inode가 가지고 있는 정보 | 설명 |
inode 번호 | inode의 고유 식별 번호 |
파일 모드 | 16비트의 플래그로 파일의 실행 권한 소유자의 권한, 소유자 그룹의 권한, 기타 사용자의 권한, 파일 형식, 실행 플래그 등을 나타낸다. |
링크 수 | 이 아이노드에 대한 참조 수 |
소유자 아이디 | 파일의 소유자 아이디. |
그룹 아이디 | 파일 소유자의 그룹 아아디 |
파일 크기 | 파일의 크기(bytes) |
파일 주소 | 실 데이터가 나오는 파일 주소 |
마지막 접근 | 마지막으로 파일에 접근한 시간 |
마지막 수정 | 마지막으로 파일을 수정한 시간 |
아이노드 수정 | 마지막으로 아이노드를 수정한 시간 |
inode는 실제 파일의 내용을 갖고 있지는 않다. inode는 데이터의 우편번호 역할을 한다고 볼 수 있다. 즉, 파일의 내용을 갖고 있는 주소를 포함할 뿐이다.
$ ls -li # inode 정보 확인
inode의 값은 ls 명령어의 -i 옵션으로 확인할 수 있다. home 라는 파일의 inode 주소값은 262145 인 것을 확인할 수 있다.
실제 inode의 내용을 확인해보고 싶다면 stat 명령을 사용해서 확인 할 수 있다. 위의 표 내용 정보가 그대로 담겨 있다.
$ stat [파일명]
리눅스 파일 링크 종류
하드 링크 (Hard link)
하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리킨다. 따라서 원본 파일이 사라지더라도 데이터만 살아 있다면 원본 파일에 접근이 가능하다. (일반 변수 복사 개념. 밑에 후술)
- 동일한 파일시스템 내에서만 하드링크 생성가능.
- 디렉터리 링크 불가능
- 대상파일과 동일한 inode 번호와 허가권 가짐.
- 대상파일을 옮기거나 삭제하더라도 대상파일을 참조. (그냥 같은 inode를 가리켜 같은 파일데이터를 갖고있는 파일일 뿐이지 하드링크는 대상파일과 아무런 관련이 없다)
- 소프트 링크는 원본이 삭제될 경우 링크를 사용할 수 없지만,
하드 링크는 원본이 삭제되어도 원본과 동일한 내용의 파일을 가지고 있으므로,
자원을 공유하면서도 데이터를 안전하게 관리하고자 할 때 주로 사용된다.
# 하드링크 생성
$ ln [대상파일] [하드링크파일]
$ touch hard_link # 빈 파일 생성
$ ln hard_link hard_ln # hard_ln에 hard_link파일을 연결하여 하드링크 생성
$ ls -li
위 두개의 파일이 완전히 같은 것을 알 수 있다. 위의 첫 필드에 67279636을 보면 같은 아이노드 번호가 있다. 즉. 두 파일이 같은 아이노드 번호를 공유하고 있고 둘은 동일한 파일이라는 것을 알 수 있다. 결국 각 하드 링크가 파일 내용을 담고 있는 각각의 아이노드를 참조하게 되는 것 이다.
심볼릭 링크(Symbolic link), 소프트 링크(Soft link)
심볼릭 링크(소프트 링크)의 경우는 만들게 되면 또 다른 inode를 생성해서 이를 바라본다. 복사 생성된 inode는 포인터를 카리키고, 포인터는 다시 원본 파일을 가리키는 것이다. (참조 변수 복사 개념. 밑에 후술)
- 심볼릭 링크는 하드 링크의 단점을 보완하기 위해 탄생
- 파일시스템과 대상파일이 존재하는 파일시스템이 달라도 생성가능.
- 하드링크는 파일만 참조 가능하고, 디렉토리는 참조 불가
심볼릭 링크는 파일이나 디렉토리를 가리킬 텍스트 포인터를 가짐으로서 참조 가능 - 대상파일과 심볼릭링크 파일은 서로 inode 번호와 파일허가권이 다름.
- 대상 파일의 inode가 아닌 대상 파일의 데이터 경로만을 참조.
- 원본 파일이 사라지면 해당 데이터에 접근할 수 없음.
- 파일 종류 l로 시작
# 심볼릭 링크 생성
$ ln -s [대상파일] [심볼릭링크파일]
[user1@localhost ~]$ touch playground # playground 라는 파일 생성
[user1@localhost ~]$ cd playgroun # playground로 이동
[user1@localhost playground]$ cp /etc/passwd . # 현재 디렉토리에 passwd파일 복붙
[user1@localhost playground]$ mv ./passwd testfile # passwd파일을 testfile로 이름변경
[user1@localhost playground]$ ln -s ./testfile ./dir1/testfile-sym # testfile를 링크 연결할 dir1경로에 testfile-sym 심볼릭 링크 파일 생성
/dir1 경로의 파일 속성 앞글자 l 을 보면 심볼릭 링크라는 것을 알 수 있다. 그리고 이 심볼릭 링크가 ./testfile을 정확히 가리킨다는 것도 알 수 있다
*심볼릭 링크에 대해 한 가지 기억해야 할 것은 대부분의 파일 작업이 링크 그 자체에서 실행되는 것이 아니라 링크가 가리키고 있는 원본 파일에서 이루어지는 것
아래 그림을 자세히 보면 확실하게 이해 할 수 있을 것이다.
원본 파일로 하드 링크를 만들면, 하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리킨다. 따라서 원본 파일이 사라지더라도 데이터만 살아 있다면 원본 파일에 접근이 가능하다.
심볼릭 링크(소프트 링크)의 경우는 만들게 되면 또 다른 inode를 생성해서 이를 바라본다. 복사 생성된 inode는 포인터를 카리키고, 포인터는 다시 원본 파일을 가리킨다. 따라서 특정 데이터에 접근할 때, 심볼릭 링크를 통해 접근할 경우 다시 원본 파일을 거치게 된다. 때문에 원본 파일이 사라질 경우 해당 데이터에 접근할 수 없다
리눅스 파일 링크는 결국 포인터
지금까지 리눅스의 신박한 하드 링크와 심볼릭 링크에 대해서 알아보았다. 그런데 한번 C언어 프로그래밍을 해본 사람이라면 이러한 연결 구성에 대해 마치 C언어의 포인트와 비슷하다고 느낄수 있을 것이다.
사실 거의 비슷하다고 보면 된다. 따라서 리눅스 파일 링크 원리를 일반 변수와 참조 변수 개념 이라고 생각하면 된다. C언어 포인터로 예시를 들면 이렇다. 메모리의 데이터들이 리눅스의 폴더 내용이라 하고, 데이터의 주소값이 inode라고 가정한다면,
일반 변수의 값 복사 (하드 링크)
int aa = 1000; // aa라는 파일이 inode 1000을 가리키고 있음
int bb = aa; // bb 하드링크라는 파일도 같이 inode 1000을 가리키도록 지정함
aa = null; // aa파일이 파괴됨
printf(bb); // 1000; bb 하드링크는 아무런 영향 없음
참조 변수의 값 복사 (심볼릭 링크)
int aa = 1000; // aa라는 파일이 1000 값을 가리키고 있음
int *bb = &aa; // bb 심볼릭 링크도 똑같이 1000값을 가리키도록 함
aa = null; // 대상파일 aa가 파괴됨
printf(bb) // null; bb 심볼릭 링크 값도 파괴되어 있음
# 참고자료
https://www.leafcats.com/141
http://www.metalpen.net/blog/?p=439
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.