개발/코딩자율학습단

[코딩자율학습단 13기] 6일차, 소프트 링크와 하드 링크

codesparkling 2025. 3. 15. 19:00

커리큘럼

소프트 링크와 하드 링크

아이노드와 덴트리

파일 시스템은 각각 파일에 대한 정보를 아이노드(inode, index node)라는 데이터 스트럭쳐에 저장한다. 아이노드에는 파일 내용이 아니라 접근 권한, 마지막 접근 시간, 파일 소유자, 그룹, 크기, 데이터 블록의 위치 같은 정보(메타데이터)를 저장한다.

그리고 파일의 실제 내용은 데이터 블록에 저장하며, 데이터 블록은 아이노드에 연결된다.
아이노드에는 각각을 식별할 수 있는 아이노드 번호라는 식별자가 존재한다.

아이노드에는 파일의 위치에 대한 정보가 저장되지 않는다. 이 경로에 대한 데이터는 덴트리(dentry, directory entry)라는 데이터 스트럭쳐로 표현한다. 덴트리는 파일 경로를 나타내고, 파일의 메타데이터를 저장하는 하나의 아이노드와 연결된다.
⇒ 덴트리는 파일의 경로와 파일의 실체를 연결하는 매개체로 볼 수 있다.

하나의 파일만 놓고 보면 위의 그림처럼 나타낼 수 있다. 그러면 계층화된 여러 파일을 나타내려면 어떻게 해야 할까?

예를 들어, /home/park 라는 디렉토리에 일반 파일 foo와 bar가 있다고 가정하자.

  • 루트 디렉토리도 하나의 덴트리와 아이노드로 구성된다.
    하위 디렉토리 목록은 루트 디렉토리의 덴트리로 관리된다.
  • 루트 디렉토리의 하위인 home 디렉토리도 마찬가지로 하나의 덴트리와 아이노드로 구성된다.
  • park 디렉토리는 home 디렉토리의 하위 디렉토리이며, foo와 bar 파일은 park 덴트리의 자식 목록으로 관리된다.

그림으로 나타내면 아래와 같다.

소프트 링크

소프트 링크의 개념은 윈도우의 바로 가기에 비유할 수 있다.
연결할 대상 파일의 경로를 저장해서, 소프트 링크를 조회하거나 실행하면 실제로는 연결된 대상 파일을 조회하거나 실행하게 된다.
소프트 링크를 심볼릭 링크(symbolic link) 혹은 심링크(symlink)라고 부르기도 한다.

소프트 링크는 그 자체로 하나의 파일이며, 아이노드와 덴트리가 존재한다.
그리고 데이터 블록에는 파일 내용 대신 타겟 파일/디렉토리의 경로가 일반 텍스트 문자열로 저장된다.

소프트 링크 실습

소프트 링크와 하드 링크 모두 ln 명령어로 생성한다.
소프트 링크를 생성할 때는 반드시 -s 옵션을 설정해야 한다. (-s가 없으면 하드 링크가 생성된다.)

ln -s \[-T\] <대상> <링크>

ln -s 대상

ln -s <대상1> <대상2> … 디렉토리
  • 첫 번째 형식이 가장 기본적인 형식이다. 대상에는 소프트 링크를 생성할 대상 파일의 경로를 입력하고, 링크에는 생성할 소프트 링크의 경로를 입력한다.
  • 두 번째 형식은 ln 명령어를 실행하는 현재 작업 디렉토리가 대상 파일의 위치와 다를 때만 사용한다. 이 형식은 소프트 링크를 현재 작업 디렉토리에 대상 파일과 같은 이름으로 생성한다.
  • 세 번째 형식은 여러 파일에 대한 소프트 링크를 한꺼번에 생성할 때 사용한다. 단, 소프트 링크는 지정한 디렉토리에 생성되고 대상 파일과 같은 이름을 가진다.
    1. linktest라는 실습용 디렉토리와 target이라는 파일을 그 디렉토리 내부에 생성한다.
      (echo와 리디렉션을 사용해서 만들어보자.)
    2. ln -s 명령으로 s-link라는 소프트 링크를 만들자. 그리고 ls -li 명령을 통해 아이노드 번호를 확인해보자.위의 사진에서 파일 권한 앞에 있는 숫자가 아이노드 번호이다.
    3. stat명령어는 파일의 상세 정보를 표시하는 명령어다. 파일의 변경시간을 알 수 있다.

      위에서 change와 modify는 모두 한글로 번역했을 때 수정, 변화, 변경의 의미를 가진다.
      무슨 차이가 있을까?
      ⇒ change는 메타데이터가 변경되는 것, modify는 파일 내용이 수정되는 것을 의미한다.
      앞서 배웠던 개념을 적용하면, change는 아이노드가 수정되는 것이고 modify는 데이터 블록이 수정되는 것을 의미한다.
    4. echo 명령어로 target의 파일 내용을 변경해보자.target은 modify(수정 시간) 값이 달라졌고 s-link는 그대로임을 확인할 수 있다.

      둘 모두 파일의 내용은 같다.
    5. s-link 파일을 변경해보자.target의 modify 값만 바뀐 것을 알 수 있다.
      왜냐하면 s-link의 데이터블록에는 target의 경로를 저장하고 있고 이 값은 그대로기 때문이다.

      그러면 원본 파일을 이동했을 때, s-link의 modfiy 값이 바뀌는지 확인해보자.자동으로 링크가 변경되는 것을 기대했지만, 파일이 없어져서 링크가 깨지는 것을 확인할 수 있었다.
      만약 링크를 수정하고 싶다면, ln -fs ./newDir/target s-link 명령을 통해서 기존의 s-link를 삭제하고 새로운 s-link를 생성해서 덮어 씌워야 한다.

하드 링크

하드 링크는 파일을 연결하는 것보다, 복제본(clone)를 만든다고 생각하면 된다.
소프트웨어에서 복제본과 복사본은 조금 다르다.
파일을 복사하면 파일 이름이 다르지만 파일 내용이 같은 새로운 파일이 만들어진다.
그래서 덴트리, 아이노드, 데이터 블록이 새로 생성되어 새로운 파일과 기존 파일에 대한 관리가 별개로 이루어진다.

반면 하드 링크는 대상 파일의 아이노드와 데이터 블록을 공유하고 덴트리만 따로 관리된다. 하드 링크는 대상 파일에 대한 별칭(alias)을 부여하는 것으로 볼수도 있다.

데이터 블록을 공유하기 때문에파일 복제본을 수정해도 두 파일 모두에 반영된다.

그러면 하드 링크가 생성되었을 때, 파일을 삭제한다면 어떻게 될까?
대상 파일에 연결된 덴트리는 삭제될 것이지만, 연결된 하드 링크가 있어서 아이노드와 데이터 블록은 삭제되지 않는다.
다만, 아이노드는 자신에게 연결된 덴트리의 개수를 알고 있고 덴트리가 삭제되며 이 값이 하나 줄어들 것이다. (이 내용은 ls -li 명령으로 알 수 있다.)

하드 링크 실습

소프트 링크와 마찬가지로 ln 명령어를 통해서 생성한다.

  1. echo와 리디렉션을 통해서 new-target 파일을 생성한다.

  2. h-link 하드 링크를 생성해보자.

  3. stat으로 두 파일을 확인해보자.두 파일이 같은 아이노드를 공유하고 있음을 확인할 수 있다. 그리고 하드 링크의 숫자 또한 Links 값을 통해 확인할 수 있다.

  4. new-target의 파일 내용을 변경해보자.h-link와 new-target 모두 modify 값이 변경되었음을 확인할 수 있다.

  5. 원본 파일을 삭제해도, h-link가 살아있기 때문에 아이노드와 데이터 블록이 유지된다.

소프트 링크와 하드 링크 비교하기

두 파일 유형의 차이점을 비교해보자.

  1. 대상 파일 확인
  2. 소프트 링크는 파일권한의 시작이 l 로 시작하고, 어떤 파일에 링크되어 있는지 화살표로 출력된다.
    반면 하드 링크는 아이노드를 공유하고 있다는 사실을 확인할 수는 있으나 어떤 파일과 공유하고 있는지 알기는 어렵다.
  3. 대상 파일 범위
  4. 소프트 링크는 일반 파일, 디렉토리, 다른 파일 시스템이나 다른 파티션의 파일도 연결할 수 있다.
    하드 링크는 디렉토리나 다른 파일 시스템, 다른 파티션의 파일을 연결할 수 없다.(아이노드를 공유하는 방식을 사용하기 때문)
  5. 대상 파일과 링크 파일의 결합도
  6. 소프트 링크는 대상 파일이 삭제되거나 다른 경로로 이동되면 깨진(broken) 상태가 된다.
    그러나 하드 링크는 아이노드와 데이터 블록이 남아 있어서 내용에 접근할 수 있다.