검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 시스템
참조 원문 : All About inodes, Hard Links and Soft Links

  터미널로 ls -i 를 실행하면 각 파일에 번호가 붙은 걸 볼 수 있습니다.
$ ls -i
807337 Ubuntu One        808148 다운로드  808154 비디오  808149 템플릿
807981 examples.desktop  808151 문서      808153 사진
808150 공개              808147 바탕화면  808152 음악
  • 이 번호는 무엇인가?
  • 파일을 지우면 무슨 일이 벌어지나?
  • 시스템은 파일의 주인이나 파일의 마지막 변경 시간을 어떻게 알고 있나?
  • 하드 링크는 무엇인가?
  • 하드 링크와 소프트 링크의 차이는 무엇인가?
  이 글에서는 위의 내용을 알아보겠습니다. 연결된 각종 장치와 디렉토리를 포함하여 리눅스에 있는 모든 것은 파일입니다. 파일시스템(여기서는 ext3/ext4로 가정)이 디스크에 생성되면 특수한 데이터 구조가 만들어집니다. 이것을 inode 테이블(기술적으로 말하자면 구조체의 배열)이라고 합니다. 이것은 1번부터 파일시스템의 inode 최대 개수까지 번호가 매겨있습니다. inode의 최대 개수는 일반적으로 파일시스템을 생성할 때 정합니다. df -i 명령어를 통해 현재 사용 중인 inode 개수와 남은 inode 개수를 볼 수 있습니다.

  파일이나 디렉토리를 만들면 사용 중이지 않은 inode 번호가 하나 할당되며 그 안에 그 파일이나 디렉토리에 대한 정보들이 저장됩니다. POSIX 표준은 inode에 최소한 다음과 같은 정보들이 있어야 한다고 정의하고 있습니다.
  • 파일의 크기(바이트 단위)
  • 디바이스 ID(파일을 담고 있는 디바이스를 식별하는데 사용)
  • 파일의 소유주의 User ID
  • 파일의 Group ID
  • 파일의 타입과 파일의 소유주, 소유 그룹, 그 외의 사용자가 그 파일에 접근할 수 있는지를 정하는 파일 모드
  • 파일을 보호하기 위한 추가적인 시스템과 유저 플래그(사용과 변경을 제한)
  • inode 자체가 마지막으로 변경된 시간(ctime, inode change time), 파일 내용이 마지막으로 변경된 시간(mtime, modification time), 마지막 접근 시간(atime, access time)의 타임스탬프
  • 얼마나 많은 하드 링크가 이 inode를 가리키고 있는지를 나타내는 링크 개수
  • 파일의 내용이 저장된 디스크 블록을 가리키는 포인터
  참고로 위를 보면 파일명이 없습니다. 사실 inode는 파일명을 전혀 다루지 않습니다. 그럼 대체 우리가 파일을 열 때 시스템이 그 파일의 inode를 어떻게 아는 걸까요? 이걸 이해하려면 디렉토리라는 게 정확히 무엇인지 알 필요가 있습니다. 처음에 앞서 말했듯 리눅스의 모든 것은 파일입니다. 심지어 디렉토리 조차도 다르지 않습니다. 모든 디렉토리는 데이터 구조체의 집합입니다. 각 구조체의 첫 번째 부분에는 inode 번호가, 두 번째 부분에는 파일명이 담겨있습니다. 그래서 우리가 파일에 어떤 작업을 하면 파일명에 해당하는 inode 번호를 찾는 일이 발생하며 이것이 inode를 얻는 방법입니다.

  inode에 있는 정보 중 링크 개수와 파일 크기는 지속적인 관리 대상에 속합니다. 파일을 삭제하면 링크 개수는 감소하며 이 숫자가 0이 되면 파일의 크기도 0이 됩니다.
$ ls -i abc
802017 abc

$ sudo istat /dev/mapper/ubuntu--vg-root 802017
(생략)
num of links: 1
(생략)

$ ln abc def
$ sudo istat /dev/mapper/ubuntu--vg-root 802017
(생략)
num of links: 2
(생략)

$ rm abc
$ sudo istat /dev/mapper/ubuntu--vg-root 802017
(생략)
num of links: 1
(생략)
  위 결과를 보면 ln 명령어로 하드 링크를 만들었을 때 "num of links"가 1 증가하는 것을 알 수 있습니다. rm 명령어로 파일을 삭제하면 반대로 값이 1 감소합니다. 만약 def 파일도 삭제한다면 링크 개수와 파일 크기가 모두 0이 됩니다.
$ rm def
$ sudo istat /dev/mapper/ubuntu--vg-root 802017
inode: 802017
Not Allocated
Group: 97
Generation Id: 1113877821
uid / gid: 1000 / 1000
mode: rrw-rw-r--
Flags:
size: 0
num of links: 0

Inode Times:
Accessed:    Wed Jul 10 20:25:24 2013
File Modified:    Wed Jul 10 20:31:49 2013
Inode Modified:    Wed Jul 10 20:31:49 2013
Deleted:    Wed Jul 10 20:31:49 2013

Direct Blocks:
  다만 파일을 삭제해도 가끔 "num of links" 값이 0이 되지 않을 때가 있는데 이것은 보통 그 파일을 잡고 있는 프로세스가 있을 때 발생합니다. 서비스가 작동하고 있는 상태에서 그 서비스의 로그 파일을 삭제했을 때 자주 볼 수 있는 현상입니다.

  그렇다면 하드 링크는 무엇이며 소프트 링크는 무엇일까요? 어떤 파일의 하드 링크는 그 파일의 inode 값을 가지고 있는 반면 어떤 파일의 소프트 링크는 그냥 그 파일을 가리키기만 합니다. 만약 원본 파일을 지웠더라도 그 파일에 대한 하드 링크가 있었다면 그 하드 링크를 이용해 파일의 내용에 여전히 접근하는 것이 가능합니다. 하지만 소프트 링크의 경우 inode를 담고 있는 원래 파일을 가리키는 것이 전부이기 때문에 원본 파일을 삭제하면 아무 쓸모가 없어집니다. 이를 간단히 나타내면 아래와 같습니다. "원본명"과 "하드 링크"는 모두 inode를 가리키지만 "소프트 링크"는 그렇지 않은 것을 확인할 수 있습니다.
원본명 ---------> inode <--------- 하드 링크
소프트 링크 ----------> 원본명 -----------> inode
  하지만 소프트 링크도 소프트 링크만의 장점이 있습니다. 하드 링크는 다른 파일시스템에 있는 파일을 가리킬 수 없지만 소프트 링크는 가능합니다. 또한 여러 버전의 파일들을 하나의 이름으로 관리할 때도 아주 좋습니다. 아래는 /usr/bin/python 파일이 사실은 다른 바이너리 파일을 가리키고 있다는 것을 보여주고 있습니다.
$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 9  6월 17 14:10 /usr/bin/python -> python2.7
  또 다른 활용법은 실행한 파일의 이름을 담고 있는 변수를 이용하는 것입니다. 하나의 파일에 여러 소프트 링크를 만들고 어떤 소프트 링크를 통해 실행했는지 판단하여 그에 맞는 처리를 하는 방법입니다. 아래의 소프트 링크 파일들이 그 예입니다.
$ ls -al /sbin/mkfs.ext*
lrwxrwxrwx 1 root root 6  6월 17 14:10 /sbin/mkfs.ext2 -> mke2fs
lrwxrwxrwx 1 root root 6  6월 17 14:10 /sbin/mkfs.ext3 -> mke2fs
lrwxrwxrwx 1 root root 6  6월 17 14:10 /sbin/mkfs.ext4 -> mke2fs
lrwxrwxrwx 1 root root 6  6월 17 14:10 /sbin/mkfs.ext4dev -> mke2fs






2013/07/10 20:57 2013/07/10 20:57