DBA가 되고 싶은 병아리

Symbolic/Hard link의 비교 본문

OS관련/Linux Study

Symbolic/Hard link의 비교

미스틱스 2012. 2. 3. 09:21
CONTENTS:
0. Introduction
1. Hard link
   1) "link"의 개념:
   2) hard link란 ?
   3) hard link의 특성
2. Symbolic link

DESCRIPTION:
0. UNIX의 file type을 얘기할 때,
   ordinary, directory, special, socket, FIFOs와 함께
   symbolic link, hard link도 언급된다.
   symbolic/hard link를 file type으로 이해하려면 우선 개념과 특징을 이해해야 할 것 같다.

1. Hard link
   1) "link"의 개념:
      - "link"라는 개념을 이해하는 한 방법은
        filesystem의 directory가 어떻게 계층적으로 구조를 형성하고 있으며
        어떻게 "cd" command로 여러 directory를 이동할 수 있는가를 이해하는 것이다.
      - 각 directory는 기본적으로 최소한 두 개의 file을 가진다.
           ① directory 자신을 표현하는 dot(.)
           ② 자신의 parent directory를 표현하는  dot-dot(..)
      - 이 두 file이 directory들을 연결하여 filesystem의 계층적 구조를 형성한다.
        각 directory의 parent와 sub-directory를 dot(.)와 dot-dot(..) file로 연결 하는 것이다.
        즉 ① 'current directory의 dot-dot(..) file'의 inode
                = 'parent directory의 dot(.) file'의 inode
           ② 'current directory의 dot(.) file'의 inode
                = 'sub directory의 dot-dot(..) file'의 inode
      - sub directory가 여러 개인 directory의 경우
        sub directory들의 dot-dot(..) file의 inode는
        이들 parent directory의 dot(.) file의 inode와 같을 것이다.
        달리 표현하면, sub directory들의 각 'drectory entry'는
        current directory의 dot-dot(..) file 즉 parenet directory의 inode를 가리키는 것이다.
      - 이처럼 '하나의 inode'에 '여러 개의 (direcory) file'이 '연결(link)'되어 있을 수 있고,
        이 때 '연결(link)된 갯수'를 'link 갯수'라 한다.
        "ls -l"을 사용하면 directory들이 최소한 2개 이상의 'link 갯수'를 가지고 있음을
        확인할 수 있다.
   2) hard link란 ?
      - 위에서 directory를 들어 설명한 link의 개념서
        여러개의 (directory) file들이
        한 개의 inode number를 사용해 서로 연결될 수 있음을 보았다.
      - hard link란 이러한 link와 같은 개념이다.
        한 file의 inode에 여러 file들의 inode를 일치시킴으로써
        서로를 연결(link)시키는 방식인 것이다.
      - hard link는 'directory file'의 link 구조를 'ordinary file'로 확장시킨 것이다.
        즉 "ln"이라는 command를 사용하여
        실제 (hard) link된 file들을 생성함으로써 'link라는 내부적 표현'을
        'hard link file (type)'으로 바꾸어 주는 것이다.
      - hard link를 확인할 수 있는 방법은
        symbolic link처럼 filename에서 확인할 수 있는 것이 아니고,
        'link 갯수'가 2 이상인가를 확인하고
        inode number가 같은 file을 찾아야 하는 것이다.
   3) hard link의 특성
      - hard link는 file이 존재할 때만 만들어 질 수 있다.
        즉 inode가 미리 존재하고 있어야 '동일 inode'를 갖는 file을 만들 수 있는것.
      - filesystem을 cross하여 hard link를 형성할 수는 없다.
        A filesystem에서 B filesystem에 있는 file(inode number를 2577이라 한다면)로
        hard link를 시도한다 함은 B filesystem의 file inode number 2577과 같은 inode number를
        A filesystem의 hard link된 file이 가진다는 것.
        그러나 실제 A filesystem의 inode number 2577은 B filesystem의 2577과는 무관한 것이다.
      - super user만이 directory를 가리키는 새로운 (hard) link를 생성할 수 있다.
        이는 filesystem이 looping을 돌게끔 link될 수 있는 가능성이 있기 때문이다.
      - hard link된 file중 하나를 지웠다고 하여 실제 그 file을 지웠다고 할 수 있는 것은 아니다.
        hard link되어 있는 다른 file이 동일 inode를 사용하기 때문이다.
        file을 지웠다 함은 그 file이 사용하고 있는 indoe가 release됨을 의미한다.
  
2. Symbolic link
   * 한 file을 단순히 '다른 이름(pathname)'으로 지시하는 file type이다.
   * symbolic link는 file을 가리키는 'indirect pointer'이다.
     hard link는 file의 inode로의  'direct pointer'이다.
     hard link가 동일 inode에 대한 다수 file의 공유라면
     symbolic link는 file과 linkname이 각기 다른 inode를 가진다.
   * hard link의 제약 사항:
     ① 이미 존재하는 file만을 hard link할 수 있다.
     ② 동일한 filesystem에 있는 file만 hard link가 가능하다.
     ③ superuser만이 directory로 hard link할 수 있다. ( "-f" option을 사용해야 함)
   * 반면 symbolic link는 이상의 hard link 제약 사항에 무관토록 구현된 것.
     ① 현재 존재하지 않는 file이라도 (symbolic) link가 가능하다
     ② filesystem을 cross하여 symbolic link가 가능하다.
     ③ 일반 user도 directory로의 symbolic link가 가능하다.
   * symbolic link는 한 file/전체 directory hierarchy를
     system의 다른 곳으로 옮길 때 많이 사용된다.
   * symbolic link는 4.2 BSD에서 도입되었고 이어 SVR4에서 채택되었다.
     SVR4의 symbolic link는 '전통적인 System V filesystem'과
     'Unified File System(UFS)' 양자를 모두 지원한다.
   * 'symbolic link를 가지는 file(source 부분)'의 data block에는
     'symbolic link가 가리키는 file(destination 부분)'의 이름을 가지고 있다.
     예를 들어,
          lrwxrwxrwx  1  root   7 Aug 11:00   lib -> usr/lib
     'directory entry'의 filename에는 3 character string "lib"이 들어 있고
     file에는 7 byte의 data "usr/lib"가 있다.
     inode의 'file type'에 symbolic link라는 식별이 되어 있으므로
     kernel은 7 byte의 data "usr/lib"가 file "lib"에서 symbolic link되어 있음을 알게 된다.