Home [Linux System Programming] Ch08 파일과 디렉터리 관리
Post
Cancel

[Linux System Programming] Ch08 파일과 디렉터리 관리

[Ch08 파일과 디렉터리 관리]

File Discripter VS Inode

  • 같은 파일을 open() 으로 두번 열었을 때의 구조
    • 프로세스에서 파일 입출력은 open 함수로 연 작업을 구분하는 것이며, 실제 물리적인 파일이 같은지는 구분하지 않음.
    • 각각의 fd를 부여하고 커널에서도 각각의 파일의 상태와 현재 작업 위치를 별도로 갖음
  • inode는 파일 시스템에 저장됨
    • 모든 파일 혹은 디렉토리는 유니크한 inode 값을 가지고 있다.
  • fd는 파일 시스템 안에 저장되지 않음
    • 커널에 의해 만들어지고 커널 안 메모리에 있는 fd 테이블에 저장됨.

8.1 파일과 메타데이터

  • inode 번호는 파일시스템에서 유일한 숫자 값인데 파일은 inode를 참조한다.
1
2
3
4
5
$ ls -i
1689459 Kconfig    1689461 main.c     1680144 process.c  1689464 swsusp.c
1680137 Makefile   1680141 pm.c       1680145 smp.c      1680149 user.c
1680138 console.c  1689462 power.h    1689463 snapshot.c
1689460 disk.c     1680143 poweroff.c 1680147 swap.c
  • inode는 파일의 접근 권한, 마지막 접근 시간, 소유자, 그룹, 크기 그리고 파일의 데이터 위치와 같은 메타데이터를 저장함.

8.1.1. stat 함수

1
2
3
4
5
6
7
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat (const char *path, struct stat *buf);
int fstat (int fd, struct stat *buf);
int lstat (const char *path, struct stat *buf);
  • 메타데이터를 얻을 수 있음.
  • stat
    • path로 지정한 파일의 정보 반환
  • fstat
    • fd로 지정한 파일의 정보 반환
  • lstat
    • stat과 동일한데 심벌릭 링크일 경우 링크가 가리키고 있는 파일이 아닌 링크 그 자체의 정보를 반환한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct stat {
        dev_t st_dev;         /* ID of device containing file */
        ino_t st_ino;         /* inode number */
        mode_t st_mode;       /* permissions */
        nlink_t st_nlink;     /* number of hard links */
        uid_t st_uid;         /* user ID of owner */
        gid_t st_gid;         /* group ID of owner */
        dev_t st_rdev;        /* device ID (if special file) */
        off_t st_size;        /* total size in bytes */
        blksize_t st_blksize; /* blocksize for filesystem I/O */
        blkcnt_t st_blocks;   /* number of blocks allocated */
        time_t st_atime;      /* last access time */
        time_t st_mtime;      /* last modification time */
        time_t st_ctime;      /* last status change time */
};
  • 정보는 stat 구조체에 저장됨.

8.1.2 권한

  • 주어진 파일의 권한 값을 변경
1
2
3
4
5
#include <sys/types.h>
#include <sys/stat.h>

int chmod (const char *path, mode_t mode);
int fchmod (int fd, mode_t mode);
  • 불투명한 mode_t 정수타입으로 표현되는 mode의 유효한 값은 stat 구조체의 st_mode 필드에서 반환하는 값과 동일
  • 파일 권한을 변경하려면 chmod() 나 fchmod() 를 호출하는 프로세스의 유효 ID가 파일의 소유자와 일치하거나 해당 프로세스에 CAP_FOWNER 기능을 사용할 수 있어야 함.

8.1.3. 소유권

1
2
3
4
5
6
#include <sys/types.h>
#include <unistd.h>

int chown (const char *path, uid_t owner, gid_t group);
int lchown (const char *path, uid_t owner, gid_t group);
int fchown (int fd, uid_t owner, gid_t group);
  • lchown 은 심벌릭 링크를 따라가지 않고 그 자체의 소유권을 변경함.
  • 호출이 성공하면 파일 소유자를 owner로, 그룹을 group으로 변경한 다음 0을 반환.
  • CAP_CHOWN 기능이 있는 프로세스 (보통은 Root 프로세스임.) 만이 파일의 소유자를 변경할 수 있다.
  • uid, gid 가 모두 0 이면 root 를 뜻함.
  • -1 을 넘기면 바뀌지 않음.

8.1.4 확장 속성

  • xattrs 라고 불리기도 하는 확장 속성은 파일과 관련한 키/값을 연권짓는 메커니즘을 제공한다.
  • 확장 속성은 보안을 위한 필수 접근 제어처럼 원래 설계에는 포함되지 않은 새로운 기능을 지원함.
  • 사용자 영역 애플리케이션이 임의로 키/값을 생성하고 읽고 쓸 수 있다는 점

키와 값

  • 확장 속성은 유일한 키로 구분된다.
  • 키는 ‘namespace.attrb’ 형태를 취함.

확장 속성 네임스페이스

  • 커널은 네임스페이스에 따라 접근 정책을 다르게 적용한다.
  • 리눅스는 현재 4가지 확장 속성 네임스페이스를 정의하고 있음.
  • system
  • security
  • trusted
  • user

8.1.5 확장 속성 연산

This post is licensed under CC BY 4.0 by the author.