리눅스에서의 파일 구성
리눅스에서 하나의 파일은 다음과 같이 세 가지 요소로 이루어져 있습니다.
위 그림과 같이 파일을 세 개 생성했다고 가정했을 때 사용자가 볼 수 있는 파일 그 자체가 있고, 그 파일은 실제 데이터가 아닌 I-node 블록이라는 공간에 있는 I-node를 가리키고 있습니다.
실제 파일의 내용은 데이터 블록이라는 공간에 차례대로 저장되며, I-node는 해당 데이터 블록의 위치에 대한 정보와 소유권, 허가권과 같은 파일의 정보에 대한것들을 담고 있습니다.
실제 파일의 데이터는 아무런 구분없이 데이터 블록에 저장만 하며, I-node가 그에 대한 정보를 가지고 있음으로써 파일을 구분할 수 있는 것입니다. 또한 사용자가 그 I-node를 구분하기 위해 파일명이 필요합니다.
I-node와 링크 파일
앞서 말했듯이 파일들은 각각 하나의 I-node를 갖게 됩니다. I-node에는 실제 파일에 대한 여러가지 정보들을 담고 있으며, I-node는 자신을 구분할 수 있는 고유 식별 번호가 부여됩니다. 또한 자신(I-node)를 참조하는 파일의 수 또한 가지고 있습니다.
I-node 정보를 보고싶은 경우 ls -il 옵션을 사용합니다.
다음의 이미지에서 첫번째 68305745가 I-node 번호이며 뒤의 1이 해당 I-node를 참조하는 파일의 수 입니다.
리눅스에는 윈도우즈 운영체제와는 다른 개념인 링크 파일 개념이 있는데, 링크란 웹 환경의 하이퍼 링크와 같이 여기서는 파일들과 데이터 I-node 간의 연결을 의미합니다. 링크 파일에는 하드 링크와 심볼릭 링크 가 있으며, 두 링크의 차이점은 다음과 같습니다.
하드 링크
하드 링크 파일은 원본파일의 I-node를 참조하는 파일입니다.
하드 링크 파일은 파일의 정보를 담고 있는 원본 파일의 I-node를 공유하기 때문에 사실상 파일명만 다를 뿐 같은 파일을 가리킨다고 볼 수 있습니다.
따라서 하드 링크 파일의 내용을 수정하게 되면 원본 파일의 내용도 수정되며(정확히는 어느쪽을 수정해도 하나의 파일을 수정한 것), 반대로 원본 파일을 수정해도 하드 링크 파일의 내용이 수정된 것을 볼 수 있습니다.
하드 링크를 생성하는 방법은 다음과 같습니다.
ln [원본 파일] [생성할 하드 링크 파일]
다음과 같이 testFile 이라는 원본파일이 있습니다.
hardTestFile 이라는 이름의 하드링크 파일을 생성합니다.
당연히 같은 I-node를 공유하므로 실제 내부적으로는 하나의 파일을 가리키며, I-node 식별 번호와 소유권, 허가권등의 정보 또한 같은것을 알 수 있습니다. 즉 hardTestFile과 testFile은 파일명만 다를 뿐 내부적으로는 하나의 파일이며, 둘 중 하나의 파일을 vi 에디터 등으로 수정하더라도 같은 결과가 나타나게 됩니다.
하드링크 파일에 내용을 추가하고 원본 파일의 내용을 확인했더니 내용이 추가되어 있는 모습입니다.
또한 둘 중 어느 하나의 파일을 삭제 하더라도 나머지 하나의 파일이 I-node 참조를 가지므로 실제 파일 데이터에는 영향이 없습니다.
심볼릭 링크
심볼릭 링크는 소프트 링크라고도 하며, 원본 파일과 별개의 I-node를 갖습니다.
그 말은 엄밀히 별도의 데이터 라는 뜻입니다. 다만 심볼릭 링크가 가리키는 실제 파일은 일반 파일과는 다르게 포인터 역할을 하며, 원본 파일을 가리키고 있습니다.
이러한 개념은 마치 윈도우즈 운영체제의 바로가기 파일과 비슷합니다.
따라서 원본 파일이 삭제된 경우에는 심볼릭 링크 파일의 포인터가 가리키는 내용이 사라지게 됩니다.
심볼릭 링크를 생성하는 방법은 다음과 같습니다.
ln -s [원본파일] [생성할 심볼릭 링크 파일명]
testFile이라는 원본파일에 대한 심볼릭 링크 파일 softFileTest 를 생성해 보았습니다.
원본 파일을 가리키고 있다는 의미에서 softFileTest -> testFile과 같이 표기 됩니다.
또한 각 파일의 I-node가 다르며 파일 정보도 다른 것을 볼 수 있습니다.
원본 파일을 다른 장소로 이동한다면 어떻게 될까요?
원본 파일을 testDir이라는 디렉터리로 이동시켰더니 링크가 깨졌습니다.
다시 원본 파일을 되돌려 놓으니 링크가 살아난 것을 볼 수 있습니다.
참고글
'리눅스[Linux]' 카테고리의 다른 글
[Linux] 리눅스 chown 명령어 - 파일 소유자 변경 (0) | 2018.04.16 |
---|---|
[Linux] 리눅스 chmod 명령어 - 파일 허가권 변경 (0) | 2018.04.16 |
[Linux] 리눅스 파일을 이루는 구성요소. I-Node, 데이터 블록 (0) | 2018.04.13 |
[Linux] 리눅스 파일 종류 (0) | 2018.04.13 |
[Linux] 리눅스 파일 및 디렉터리 소유권, 허가권, 파일 유형 (0) | 2018.04.13 |