Computer Security

#10 파일 구조,하드링크, 소프트링크 본문

리눅스 시스템 프로그래밍

#10 파일 구조,하드링크, 소프트링크

쿠리 Kuri 2022. 9. 15. 18:30
반응형

파일시스템(FileSystem)

 

파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제

 

ex) 윈도우 파일 탐색기

 

 

 

 

 


가상 파일시스템(VFS - Virtual FileSystem)

 

 

 

VFS

파일시스템 관련 인터페이스를 사용자 공간 어플리케이션에 제공하는 커널 서브시스템이다.

 

VFS는 다양한 파일시스템들이 공존할 수 있도록 공통된 인터페이스를 제공해준다.

 

open(), read(), write() 등의 시스템콜을 호출했을 때, 각 파일시스템이나 물리적 매체의 종류와 상관없이 동작하게 해주는 역할을 한다.

 

 

 

 


 

 

1. 사용자가 write() 시스템 콜을 호출한다.

 

2. VFS는 sys_write() 함수를 호출하여 실제 파일시스템의 쓰기 함수를 호출된다.

 

3. 실제 파일시스템의 쓰기 함수가 실행되고 물리적 장치에 쓰여진다.

 

 


위와 같은 순서로 VFS는 사용자가 write()라는 함수를 호출해도 자체적으로 파일시스템에 알맞는 함수를 호출하여 쓰기를 진행하기 때문에 사용자는 연결된 파일시스템이 어떤 것이냐를 신경쓰지 않고도 읽고 쓰기할 수 있다.

 

이러한 추상화 기능을 제공하는 계층을 파일시스템 추상화 계층이라고 한다.

 

 

 

 


 

파일 시스템을 추상화 하기 위한 구조

 

 

 


슈퍼블록(SuperBlock)

 

 

슈퍼블록 구조체는 linux-5.0.1/include/linux/fs.h 안에 정의되어 있다.

 

슈퍼블록은 각 파일시스템별로 구현하며, 본질적인 파일시스템 메타데이터이다.

 

 파일시스템의 유형과 크기, 상태, 다른 메타데이터 구조체(아이노드 등)의 정보가 들어있다. 

 

struct super_block

struct에 함수 포인터와 멤버변수를 넣어 객체처럼 동작하도록 구현한 것이다.

 

 

 

 


struct super_operation

super_operations : 슈퍼블록에 대한 모든 동작에 대한 함수포인터가 멤버로 존재한다.

 

 

 

 

 

 

 


아이노드(Inode)

 

 

정의 : Kernel이 관리하고 있는 파일을 위한 메타 데이터

 

사용자는 file 명을 가지고 파일을 액세스 하려고 하면, 내부적으로는 파일이름과 맵핑된 inode 번호로 맵핑된다.

 

- inode가 가진 정보

1) 파일 모드(퍼미션)

2) 링크 수

3) 소유자명

4) 그룹명

5) 파일크기

6) 마지막 접근 정보

7) 마지막 수정 정보

8) 아이노드 수정 정보 

 

 

 

 

 

 

 

 


하드링크

하드링크는 원본 파일의 inode의 위치를 가르킨다.

파일명만 다르지 사실상 하드링크, 원본파일을 구분할 수 없다.

(원본과 복사본의 차이가 없다)

 

왜냐하면 파일 시스템에 있는 데이터를 복사한 것이 아니라, inode 번호만 복사했기 때문이다. 따라서 실제 파일은 1개만 존재하는 셈이 된다.


소프트링크

윈도우 시스템에서 제공하는 바로가기 기능과 비슷하다.

원본 파일에 대한 정보가 포함되어 있지 않고, 원본 파일 위치에 대한 포인터만 포함한다.

새로운 inode를 가진 링크파일이 생성된다.

 

 

 

 

 

 


Hardlink vs Softlink

 

hard link 

- softlink에 비해 처리 속도가 빠르다.

- 다른 파일 시스템의 파일에 대해 생성 불가능하다.

- 다른 파티션의 파일에 대해 생성 불가능하다.

- 디렉터리에 대해 생성 불가능하다.

- 인지하기 어렵다.

 

 

 

 

 


Hardlink 생성

int link(const char *oldpath, const char *newpath);

 

파라미터

- oldpath : 원본 파일 경로

 

- newpath : 생성할 하드링크 경로

 

 

 

 

반환 값

- 성공시 0

 

- 실패시 -1

 

 

 

 

 


softlink  생성

int symlink(const char *target, const char *linkpath);

파라미터

- target : 원본 파일 경로

 

- linkpath : 생성할 소프트링크 경로

 

 

 

 

반환 값

- 성공 시 0

 

- 실패 시 -1

 

 

 

 

 

 


Link 삭제

int unlink(const char *pathname);

 

파라미터

- pathname : 삭제할 파일 경로

 

 

 

반환 값

- 성공 시 0

 

- 실패 시 -1

반응형
Comments