오늘은 리눅스 파일 시스템에서 하드링크를 만드는 방법인 ln과 소프트 링크(심볼릭 링크)를 만드는 ln -s 옵션에 대해 알아보고자 한다.
목차
- inode 소개
- 리눅스에서 링크란?
- 하드링크 소개
- 소프트링크 소개
- 마무리
1. inode 소개
먼저 들어가기 앞서 inode에 대해 사전 지식이 필요하다. inode는 유닉스 파일 시스템에서 사용하는 자료구조로 파일, 디렉토리 등 파일 시스템에 관한 정보를 가지고 있다. 즉, 파일의 메타데이터라고 생각하면 되며 inode의 구조는 아래처럼 되어있다.
그림과 같이 inode는 파일의 권한 정보, 소유자 정보, 크기, 생성 및 수정 시간, 블록크기 등을 가지고 있다. 이때는 direct blocks은 파일의 데이터 블록을 직접 가리키는 주소가 저장되어 있으면 direct blocks만으로 부족할때는 single indirect로 다른 inode를 한번 거쳐 데이터 블록을 찾고 더 부족할 때는 double, triple 순으로 블록 포인터를 사용하게 된다. 즉, inode는 해당 파일에 대한 데이터가 있는 주소를 블록 포인터를 이용해서 갖고 있게된다.
그러면 내 바탕화면에 있는 파일이나 디렉토리의 inode 번호는 어떻게 알 수 있을까?
리눅스에서는 아래 명령어를 통해 나의 파일이나 디렉토리에 대한 inode 번호를 찾을 수 있으며 맨 앞에 위치한 숫자가 나의 바탕화면에 있는 파일과 디렉토리에 대한 inode 번호가 된다.
ls -il
리눅스에서는 친절하게도 해당 파일에 대한 정보를 볼 수 있도록 `stat -s file_name`이라는 명령어가 있다. 간단하게 예전에 발표했던 자료의 파일 정보를 확인해보았다. 자세한 내용이 궁금하다면 `man stat`을 통해 해당 커맨드에 대한 정보를 살펴보거나 다음 링크를 참고하길 바란다.
2. 리눅스에서 링크란?
이제까지 inode에 대해 간략히 살펴보았는데 왜 소프트 링크와 하드 링크를 설명하기 전에 inode에 대해 설명했는지 이야기하고자 한다.
먼저, 소프트 링크와 하드 링크는 윈도우에 있는 바로가기 기능이라고 생각하면 쉽게 이해할 수 있다.(윈도우에서 해당 링크처럼 다들 바로가기를 만들어 본 경험이 있을 것이라고 생각한다.) 해당 역할을 하는게 리눅스에서는 소프트 링크와 하드 링크로 구분되며 둘은 다른 방식으로 해당 파일에 대한 링크를 생성하게 되고 다른 방식으로 inode를 갖게 된다. 그러기 때문에 둘을 이해하기 앞서 먼저 inode가 무엇인지에 대해 살펴보았다.
그럼 이제 각각은 어떤게 다르고 어떻게 링크를 만드는지 알아보고자 한다.
3. 하드 링크 소개
하드 링크는 원본 파일과 동일한 inode를 직접적으로 가리키기 때문에 특정 파일에 대한 하드 링크를 설정해서 하드 링크 파일을 만들어내면 원본 파일과 동일한 inode값을 가지게 된다는 특징을 가지고 있다.
하드 링크를 생성하는 방법은 생각보다 쉬우며 이미 리눅스에서는 ln이라는 명령어를 제공해주고 있다. 자세한 내용이 궁금하다면 `man ln`을 통해 해당 커맨드에 대한 정보를 살펴보거나 다음 링크를 참고하길 바란다.
먼저 하드 링크 파일을 만들기 앞서 base 파일을 먼저 하나 간단히 생성을 하였다.
그 다음 `ln base hard`라는 명령어를 통해 하드 링크 파일 하나를 생성하였으며 둘의 inode 번호를 비교해보았다.
위와 같이 하드 링크를 한 파일은 원본 파일과 동일한 inode, 권한, 소유자, timestamp를 가지게 된다는 것을 알 수 있다.
stat 명령어로 살펴봐도 두개의 파일이 완전 똑같은 정보를 가지고 있다는 것을 알 수 있다. 그러면 하드 링크가 copy랑 다른게 없는게 아닌가..?라는 생각이 들었고 이를 확인하기 위해 cp 명령어를 사용해서 copy 본을 만들어보고 각각의 파일 정보를 비교해보았다.
위처럼 copy는 하드 링크 방식과 다르게 inode 번호도 다르고 timestamp 값이랑 link의 개수도 다르다는 것을 알 수 있다. 즉, copy는 안에 들어있는 데이터만 복사를 하는 것 같다.
그럼 해당 원본 파일을 삭제해도 하드 링크가 유지가 되는지 살펴보자.
위처럼 rm 명령어를 통해 원본 파일을 지워보고 하드 링크를 했던 파일의 정보와 안에 들어있는 데이터를 cat으로 살펴봤을 때 기존 원본 파일의 내용이 문제없이 계속 유지되고 있다는 것을 알 수 있으며 기존에는 link가 2개였지만 1개가 되었다는 사실을 알 수 있다.
정리하자면 하드 링크는 원본 파일과 똑같은 파일 정보(inode, timestamp 등 모두 일치)와 파일 데이터로 링크가 되며 원본 파일이 삭제돼도 계속 유지된다는 특징이 있다는 것을 알 수 있다.
4. 소프트 링크 소개
그러면 소프트 링크는 하드 링크와 어떻게 다를까?
소프트 링크는 심폴릭 링크라고도 불리며 ln 명령어에 -s 옵션을 달아서 소프트 링크 파일을 생성해줄 수 있다. 소프트 링크 방식은 앞서 살펴봤던 하드 링크 방식과 다르게 원본 파일과 동일한 inode를 갖지 않고 새로운 inode를 만들어서 포인터로 원본 파일의 inode를 가르키게 된다.
하드 링크 방식과 동일하게 먼저 원본 파일을 생성하고 `ln -s 원본파일 링크파일`를 통해 하나의 소프트 링크 파일을 생성하도록 한다.
위의 그림과 같이 하드 링크와는 다르게 소프트 링크 파일은 다른 inode값과 timestamp, mode 값 등이 다르다는 것을 알 수 있다.(소프트 링크는 mode가 012로 시작하고 일반 파일은 010으로 시작하며 nlink는 하드 링크의 개수를 나타내기 때문에 하드 링크 때와 값이 다르다.)
소프트 링크 파일의 포인터가 원본 파일의 inode를 가르킨다면 만약 원본 파일이 삭제되면 링크된 파일은 어떻게 되는지 알아보자.
위의 그림과 같이 기존에 있는 원본 파일을 삭제하게 되면 소프트 링크 파일은 남아있긴 하지만 포인터로 가르키던 원본 파일이 사라졌기 때문에 파일을 찾을 수 없다는 에러 문구가 뜨게 된다.
하드 링크와 소프트 링크 모두 테스트 했을 때는 파일로 링크를 해서 알아봤는데 이젠 디렉토리도 링크가 되는지 알아보고자 한다.
소프트 링크와 다르게 하드 링크 방식으론 디렉토리는 링크할 수 없고 파일만 링크가 된다는 사실을 알 수 있다.
정리하자면 소프트 링크는 원본 파일과 다른 파일 정보와 같은 파일 데이터로 링크가 되며 원본 파일이 삭제되면 링크가 깨지게 된다는 특징이 있다는 것을 알 수 있다. 또한, 디렉토리는 소프트 링크 방식만 가능하다는 사실도 알 수 있다.
5. 마무리
앞서 살펴봤던 내용을 표로 정리하면 다음과 같다.
하드 링크 | 소프트 링크 | |
명령어 | ln 원본파일 링크파일 | ln -s 원본파일 링크파일 |
특징 | - 원본 파일과 동일한 inode를 가지며 동일한 파일 정보를 가지게 된다. - 원본 파일이 삭제돼도 유지가 된다. - 파일만 링크할 수 있다. |
- 원본 파일과 다른 inode를 생성하게 되며 다른 파일 정보를 가지게 된다. - 원본 파일이 사라지면 링크가 깨지게 되어 데이터를 찾을 수가 없게 된다. - 파일 뿐만 아니라 디렉토리도 링크가 가능하다. |
참고문헌
- https://velog.io/@minjung0067/%EB%A6%AC%EB%88%85%EC%8A%A4-%ED%8C%8C%EC%9D%BC
- https://www.slashroot.in/inode-and-its-structure-linux
- https://linux.die.net/man/1/ln
- https://linux.die.net/man/2/stat
- https://inpa.tistory.com/entry/LINUX-%F0%9F%93%9A-%ED%95%98%EB%93%9C-%EB%A7%81%ED%81%AChard-link-%EC%8B%AC%EB%B3%BC%EB%A6%AD-%EB%A7%81%ED%81%ACsymbolic-link-%EC%95%84%EC%9D%B4%EB%85%B8%EB%93%9Cinode
'기타' 카테고리의 다른 글
tcpdump와 wireshark를 이용한 패킷 분석하기 (0) | 2024.05.18 |
---|---|
CI / CD 에 대해서.. (0) | 2023.06.04 |
QUIC HTTP/3 내용 정리 (0) | 2022.12.08 |
WebRTC 내용 정리 (0) | 2022.12.08 |
HTTP2 정리 내용 (0) | 2022.12.08 |