본문 바로가기

CS+/리눅스

리눅스 파일 링크 - 하드 링크, 심벌릭 링크

파일 링크는 기존 파일에 새 이름을 붙이는 것을 말합니다. 복잡한 디렉터리 계층 구조에서는 파일명이 복잡하면, 간단한 다른 이름을 붙여서 사용하면 굉장히 편리합니다. 이러한 파일 링크는 하드링크와 심벌릭 링크 2가지로 나뉩니다. 

 

하드링크 - 기존 파일에 새로운 파일명을 추가로 생성한 것

심벌릭 링크 - 원본 파일을 가리키는 새 파일을 만드는 것. (like 윈도우에서의 바로가기 기능)

 

먼저, 리눅스의 파일 구성을 살펴보겠습니다. 

 

출처: https://jhnyang.tistory.com/269

 

리눅스의 파일 = '파일명(=디렉터리)' + inode 블록 + 데이터 블록

 

'파일명'

우리가 눈으로 GUI 상에서 보게 되는 아이콘과 같은 개체라고 보시면 됩니다. 위 구성표를 보면 '파일명'은 i-node 블록 공간을 가리키는데요. 

 

좀 더 자세히 설명하자면, 

 

파일명은 사용자가 파일을 구분하고 접근 및 조작하는데 필요한 요소입니다. 리눅스에서는 하드웨어 장치마저 파일로 관리 할만큼 모든 것을 파일이라는 단일 인터페이스를 통해 다뤄지기 때문에 사용자가 파일을 다루기 위해서는 파일명을 통해 구분할 수 있어야 되기 때문입니다. 또한 리눅스에서는 파일 확장자 개념이 존재하지 않습니다. 확장자를 붙인다 하더라고 윈도우처럼 의미를 두지는 않고 단지 하나의 파일명으로만 인식할 뿐입니다.

리눅스만의 특별한 파일명 규칙이 있다면 파일명이 '.' 으로 시작하는 파일은 숨김파일이며 ls -a 명령어를 통해서만 볼 수 있습니다. 또한 리눅스 시스템은 영어 대/소 문자를 구분하므로 같은 단어의 파일명이라 하더라도 대/소 문자 구분에 따라 다른 파일로 인식합니다. 또한 파일명으로 루트 디렉터리를 의미하는 '/'를 사용할 수 없습니다.

i-node

 

외부적으로 번호가 표시되고, 내부적으로는 파일의 종류와 크기, 소유자, 파일 변경 시간, 파일명 등 파일 상세 정보와 데이터 블록 주소가 저장되어 있습니다. 우리가 ls -l 명령으로 출력되는 정보들은 inode에 저장되어 있는 파일 상세 정보입니다. 

파일의 inode 번호는 ls -i 명령으로 확인이 됩니다. 

 

 

 

[i-node] 추가 설명 

 

i-node는 Index node 라고도 하며, 리눅스/유닉스 계열의 파일 시스템에서 사용하는 자료구조를 말하는데, 모든 파일 및 디렉터리는 각자 하나의 I-node를 가지고 있습니다. I-node는 파일을 기술하며, 다음의 정보들을 포함합니다. I-node는 일반적으로 전체 디스크 공간의 1% 정도를 차지하게 됩니다.

 

  • 데이터 블록에서의 실제 파일 데이터 위치(주소)
  • 파일의 종류
  • 파일의 허가권
  • 파일의 액세스 모드
  • 파일의 타임스탬프(마지막 수정일)

일반적으로 파일이 생성될 때 하나의 I-node가 생성되고 I-node 번호가 부여되는데, 이 번호는 고유한 식별 번호이며 각 파티션마다 0부터 시작하게 됩니다.

I-node는 link의 수가 0인 위치에 생성되는데 정보를 저장한 뒤에는 link를 1로 변경합니다.
이러한 I-node는 I-node 블록에 저장되어 있으며, I-node 번호화 link 수를 확인하고 싶은 경우 ls -il 명령어를 사용하면 됩니다.

 

 

데이터 블록

 

데이터 블록은 실제 파일의 내용이 저장되는 공간입니다.

디스크에 파일이 저장될 때 데이터는 특별한 구분없이 차례대로 저장되며 데이터 블록에 쌓이게 됩니다. 이 공간에는 파일 데이터가 저장될 때 특별한 구분을 하지 않기 때문에 어떤 부분이 어느 파일인지 구분이 필요하며, 그에 대한 정보가 I-node에 담기게 되는 것입니다.


하드 링크

하드 링크 파일은 원본파일의 I-node를 참조하는 파일입니다.
하드 링크 파일은 파일의 정보를 담고 있는 원본 파일의 I-node를 공유하기 때문에 사실상 파일명만 다를 뿐 같은 파일을 가리킨다고 볼 수 있습니다.

따라서 하드 링크 파일의 내용을 수정하게 되면 원본 파일의 내용도 수정되며(정확히는 어느쪽을 수정해도 하나의 파일을 수정한 것), 반대로 원본 파일을 수정해도 하드 링크 파일의 내용이 수정된 것을 볼 수 있습니다.

또한, 리눅스에서는 파일에 여러 개의 이름을 붙일 수 있는데 이 때 붙이는 파일명이 '하드 링크' 입니다. 

 

ln 명령어를 이용해서 하드 링크를 만들어 보겠습니다.

아래 실습처럼 진행 해주시면 됩니다. 이 때 주목할 점은 

ln 으로 하드링크를 만든 뒤 ls -l 커맨드 다음 나오는 

data1 의 접근 권한(rw-r--r--) 다음에 나오는 숫자가 1에서 2로 바뀐 것을 볼 수 있습니다. 

이는 '하드 링크의 갯수'를 의미합니다. inode 와 연결된 파일명이 하나일 때는 1인데 ln 을 통해서 하나 생성되었으니 2로 바뀌는 겁니다. 

 

 

두 파일의 inode 값을 보겠습니다. 

ls -i 명령을 사용하시면 됩니다. 

cat 으로 읽어보면 동일한 내용이 나오는 것을 알 수 있습니다.

 

 

 

 

링크와 파일을 복사한 것을 비교해보겠습니다. 

 

하드 링크 - 같은 파일에 이름만 다르게 붙이는 것

복사 - 완전히 독립적인 파일을 만드는 것 

 

아래 실습은 cp 명령어로 파일을 복사하고 이에 대한 i-node 값을 비교하는 것입니다.

 

data1.cp  와 data1.ln  2가지는 i-node 값이 다른 것을 확인할 수 있습니다. 

data1 와 data1.ln 은 당연하게도 동일한 것을 볼 수 있습니다.

 

 

 

그리고 gedit 명령어로 편집을 해보시면 좀 더 선명하게 알 수 있습니다.

data1.ln 에서 편집을 한 것(내용을 추가하거나 삭제 등등)이 그대로 data1 이 반영이 다 됩니다.

 

 

심볼릭 링크

 

출처:https://dololak.tistory.com/289

 

심볼릭 링크는 소프트 링크라고도 하며, 원본 파일과 별개의 I-node를 갖습니다.
그 말은 엄밀히 별도의 데이터 라는 뜻입니다. 다만 심볼릭 링크가 가리키는 실제 파일은 일반 파일과는 다르게 포인터 역할을 하며, 원본 파일을 가리키고 있습니다.

이러한 개념은 마치 windows 운영체제의 바로가기 파일과 비슷합니다.
따라서 원본 파일이 삭제된 경우에는 심볼릭 링크 파일의 포인터가 가리키는 내용이 사라지게 됩니다.

심벌릭 링크의 커맨드도 ln 을 사용합니다. -s 옵션만 추가해주면 됩니다. 

 

특이사항 

 

1) 화살표

 -> 화살표가 나타나는 것을 볼 수 있습니다.

파일명 뒤에 원본 파일명을 가리키는 겁니다. 

 

2) inode 번호 

 

inode 번호가 원본 파일과 다릅니다. 즉, 원본 파일과 심벌릭 링크 파일은 별개임을 의미합니다. 심벌릭 링크의 파일 내용은 원본 파일의 경로를 가지고 있습니다.  이 관점에서 보면 크기가 5 로 나오는 것을 볼 수 있는데, 이는 원본 파일 경로의 길이를 의미하는 것입니다. 그런데, 심벌릭 링크를 cat 으로 읽으면 원본 파일의 내용이 출력됨을 아래에서 확인할 수 있습니다. 

 

하드 링크는 같은 파일 시스템에 있는 파일에만 생성할 수 있습니다. 디렉터리에는 하드 링크를 생성할 수 없고, 다른 파일 시스템에 있는 파일이나 디렉터리에도 생성할 수 없습니다. 심벌릭 링크가 하드 링크와 다른 장점은 디렉터리에도 생성할 수 있고, 파일 시스템이 달라도 생성할 수 있습니다. 

 

심벌릭 링크의 경우 원본 파일이 삭제되면 아무런 구실을 못하게 됩니다. 실제 프로그램이 삭제되면 바탕화면의 바로가기가 실행 안되는 것과 같습니다. 아래 그림처럼 이해하시면 될 것 같습니다.

 

[심벌릭 링크] (=소프트 링크) 

 

출처: https://jhnyang.tistory.com/269

[하드 링크] 

 

 

 

 

하드링크는 inode 값과 연결되어 있기에 원본 파일이나 또 다른 파일이 삭제되어도 데이터의 손실이 일어나지 않습니다. 엄밀히 말하면 우리 눈에 보이는 아이콘의 '파일명'은 일종의 실제 데이터 값과 연결하는 문이라고 볼 수 있는데, 하드 링크는 그 내부에 다른 통로로 연결하도록 해놓았기에 상관이 없는거죠. 즉, 표현상 원본 파일이 삭제되어도 라고 한 것은 '파일명'만 삭제됐다고 보면 될 것 같습니다. (오류가 있을 시 댓글로 지적해주세요!)

 

이번 포스팅에서는 아래 참고 포스팅들을 많이 참고했는데요.

해당 링크로 가셔서 설명을 읽어보시면 더 이해가 잘 될 거 같습니다!

 

 

 

 

** 참고  ** 

 

https://dololak.tistory.com/291

 

[Linux] 리눅스 파일을 이루는 구성요소. I-Node, 데이터 블록

리눅스에서 파일을 이루는 구성요소 리눅스에서는 모든 처리 과정을 파일 단위로 구성하며, 계층적인 구조의 특성을 지니고 있습니다. 리눅스에서의 파일이라 함은 파일명, I-node, 데이터 블록 �

dololak.tistory.com

 

https://dololak.tistory.com/289

 

[Linux] 리눅스 하드 링크, 심볼릭 링크 파일, ln 명령어

리눅스에서의 파일 구성 리눅스에서 하나의 파일은 다음과 같이 세 가지 요소로 이루어져 있습니다. 위 그림과 같이 파일을 세 개 생성했다고 가정했을 때 사용자가 볼 수 있는 파일 그 자체가 �

dololak.tistory.com

https://jhnyang.tistory.com/269

 

[리눅스, 유닉스] 파일링크 ln 명령어- 심볼릭 링크(소프트링크)와 하드링크 원리, I-node 아이노드

[리눅스/ 유닉스 완전정복 목차 모음] 안녕하세요! 주인장 양햄찌입니다. 오늘은 파일 링크에 대해서 알아보는 시간을 가질거예요. 목차 1. 파일 링크란 무엇인가? 2. 파일 링크 왜 쓰나? 필요한 ��

jhnyang.tistory.com