리눅스의 모든 파일은 Inode를 가지고 있다.
Inode
는 쉽게 말해, 실제 물리적 데이터에 대한 정보(메타데이터)를 저장하고, 해당 물리 데이터의 위치정보를 저장하는 데이터구조이다.
(C언어의 포인터를 생각하면 쉽다!)
Inode
의 메타 데이터에 저장되는 정보
실제 데이터에 대한 파일 모드, 링크개수, UID, GID, 파일 크기, 파일 관련 시간 등의 정보가 저장됨
데이터의 위치 정보
실제 파일내용(DATA)이 있는 위치 정보가 저장됨
이제 Inode
에 대해서 알았으니 1. 하드링크와 2. 소프트링크에 대해서 알아보자.
하드링크란?
원본파일(origin)이 접근하는 Inode
에 대해서 접근할 수 있는 방법을 하나 더 만드는 것.
쉽게말해 origin이 하나 더 생기는 것이다.
원본 파일에서 하드링크를 생성한다고 하여도, 물리적으로 데이터가 중복 저장되지는 않는다.
당연하게도 하드링크는 데이터로 접근하는 포인터(방법)를 하나 더 만들었을 뿐, 실제로 파일을 하나 더 만든 것은 아니기 때문이다.
또한, 둘 중 하나를 수정하면 다른 쪽의 내용또한 수정된다. 이 또한 실제로 데이터는 하나이기 때문이다.
aaa.txt
에 대한 bbb.txt
를 하드링크로 만들어보자.
➡️ 하드링크 생성
ln aaa.txt bbb.txt
잘 생성되었다. 이제 파일 상태를 확인해보자.
➡️ 파일 상태 확인
stat aaa.txt
stat bbb.txt
aaa.txt
와 bbb.txt
의 파일의 상세 정보를 확인해보자.
두 파일의 상태를 살펴보면 원본 파일 aaa.txt
과 하드링크로 생성한 파일 bbb.txt
가 완전히 동일한 Inode
번호를 가지고 있는 것을 확인할 수 있다.
즉, 동일한 데이터를 가르킨다는 의미이다.
또한, Links
의 수가 2로 늘어나 있는 것을 확인할 수 있다.
Links
는 해당 Inode
로 연결된 링크의 수(즉, 접근할 수 있는 방법)의 수를 의미한다.
현재 원본 aaa.txt
와 하드링크로 생성된 bbb.txt
두 가지 파일은 같은 파일을 가리키므로 Links
가 2이다.
하드링크는 원본 aaa.txt
를 삭제하더라도, 하드링크 bbb.txt
가 남아 있으므로 여전히 파일에 접근할 수 있다.
심볼릭링크라고도 불리며, 윈도우의 바로가기와 완전히 똑같다.
하나의 새로운 bbb.txt
파일로 생성되는 것은 하드링크와 같으나, 원본파일과 다른 Inode
를 새롭게 생성하고, 이 Inode
가 원본 파일을 가리키도록 한다.
아래와 같이 소프트링크 bbb.txt
파일을 생성해보자.
이후 stat
명령어를 입력해서 파일의 상세 정보를 열어 보았을 때, Links
의 수가 늘어나지 않는것을 확인할 수 있다.
(새로운 Inode
를 생성했기 때문)
만약 원본 파일
aaa.txt
를 삭제하면 어떻게 될까?
하드링크는 원본 aaa.txt
를 삭제하더라도, 하드링크 bbb.txt
가 남아 있으므로 여전히 파일에 접근할 수 있었다.
소프트 링크는 어떨까?
빨간색으로 나오는 것이 보이는가?
다음과 같이 더이상 원본 파일로 가는 링크가 없어졌으므로 접근할 수 없다.
그럼 다시 해당 파일명으로 파일을 생성한다면?
같은 파일이름을 가지고 있는 파일을 그대로 다시 가르키게 된다.
즉, 가르키는 Inode 번호는 다르게 되더라도 파일이름이 일치한다면, 해당 노드로의 링크(bbb.txt의 링크)가 다시 살아나게 된다.
소프트링크의 정책은 리눅스에서 전체가 기본으로 다 허용되어있다.
(29481 lrwxrwxrwx 1 vinca vinca 7 Nov)
리눅스에서 파일을 지우는 것은 실제로 데이터가 지워지는 것이 아닌 inode
와 데이터 블록이 해체되고, inode
번호로 가는 링크가 지워지는 것이다.
즉, 실제 데이터는 삭제되지 않으므로, 실제 데이터가 있는 위치가 다른 데이터로 덮어 씌워지지 않는 이상 포렌식 등으로 다시 복구가 가능하다.
이를 C언어로 개발된 wiper를 사용할 시, 리눅스 시스템 상에서 파일이 완전히 제거된다.