티스토리 뷰

Study/Linux

[Linux] Linux File System and the VFS

생각많은 소심남 2016. 7. 14. 20:38

User가 주로 이용하는 Program은 보통 file을 읽고 쓰는 기능을 수행한다. 이 file은 보통 HDD라고 불리는 secondary storage에 저장되어 있는데, 각각의 file들이 저장되어 있는 위치는 physical memory처럼 뭔가의 일관적인 형태로 되어 있다. 우리야 OS가 올라가 있는 상태에서 file에 접근하니, file의 위치나 그 file이 가진 property를 text 등으로 확인할 수 있지만, 실제로는 이와 같은 정보는 physical I/O layer가 추상화된 형태이고 실제로는 0,1로 이뤄진 정보로 되어 있다. 우리가 0과 1을 이용해서 file을 쓰지 않는 것처럼 중간에 있는 filesystem layer가 사이를 중개해주며, 0과 1을 이용해서 r/w가 이뤄지는 작업은 앞에서 소개했던 user application이 아닌 low-level application(or kernel application) 등에 의해 수행된다.

 

 이 포스트가 있는 섹션에서 주로 다루는 Linux의 File system은 tree기반의 계층적 구조를 가지며, root(/) directory에서 가지치기를 하는 방식으로 하위 계층으로 내려온다. 계층을 구성하는 요소는 앞에서 언급했던 file이나 directory의 형식이 될 수도 있고, 또다른 file system도 될 수 있다. 참고로 다른 file system이 현재 file system의 요소로 삽입되는 과정을 mount라고 한다. 예를 들어 usb같은 file system도 현재 우리가 쓰고 있는 host PC에서 /mnt/ 라는 폴더 밑에 mount 될 수 있는 것처럼 말이다.

 

 추가로 Virtual pseudo FileSystem(VFS)이라는 개념도 있다. 말에서도 나온것처럼 실제로 physical 하게 존재하는 것이 아니라 memory에만 존재하는 추상적 요소이다. 가장 대표적인게 /proc 같은 것이다. /proc을 살펴보면 수많은 숫자로 된 폴더들이 존재하는데 그 폴더 하나하나가 실제 secondary storage에 존재하는 것이 아니라 memory에 존재하고 있는 process의 property를 담고 있는 집합인 것이다. 이밖에도 /dev, /sys, /tmp도 memory상에서만 상주하고 있는 VFS의 대표적인 예시들이다. 아무튼 이런 각 요소들이 전체 시스템의 가장 상위에 있는 /root에 mount 되어 있음으로써 하나의 계층적 구조를 형성하게 된다.

 

 여기서 VFS에 대해서 조금더 부연 설명을 하자면 User level에서 동작하는 application이 뭔가 I/O와 관련한 system call을 사용하고 싶은 경우에는 이 VFS를 거치게 된다. 맨 앞에서도 소개했다시피 실질적으로 파일에 접근하는 것은 User application 자체가 아닌 I/O 역할을 하는 low-level application인데, 그 정보를 중개하는 역할을 하는 것이 VFS이다. 이에 대한 예시를 살펴보고 싶은 사람이라면 tldp의 내용을 참고해보면 좋을거 같다.

 

리눅스에서 지원하는 File system은 다음과 같다.

 

Name Description
 ext2      Native Linux filesystem
 minix  Predecessor to ext2
 proc  Used for /proc/
 msdos  MSDOS
 umsdos  Extensions to MSDOS    
 vfat

Windows VFAT (includes FAT32, FAT, etc.)

 ntfs  Windows NT NTFS (read-only)
 sysv  SystemV/Xenit/Coherent FS
 hpfs  OS/2 HPFS
 ufs  Sun
 udf  CD R/W, DVD
 hfs

 Apple MacIntosh Filesystem (HFS)

 hfs+          Apple MacIntosh Extended HFS
 befs      BeOS filesystem
 jffs, jffs2  Journalling Flash Filesystem
 iso9660

 cdrom etc., including Joliet extensions

 cramfs

 Compressed read-only filesystem

 romfs  Small read-only filesystem
 tmpfs  Ram disk that is swappable
 ramfs

 Ram disk, for example of a filesystem

 gfs2

 Clustering filesystem from Red Hat

 nfs

 Network Filesystem (through version 4)

 smb  Samba networking
 ncp

 Novell Netware FS using NCP Protocol

 coda

 Experimental distributed filesystem

 afs

 Andrew distributed filesystem, from Carnegie Mellon

 ocfs2  Extent-based, disk cluster filesystem from Oracle

 

 여기에 보면 신기한 점도 있다. NTFS나 VFAT같은 경우는 windows에서 지원하는 file system인데, 이를 Linux에서도 지원하는 것이다. 사실 완벽하게 지원하는 게 아니라 일부 기능에 대해서만 지원한다. 특히 NTFS의 경우는 Read Operation에 대해서만 지원하고 쓰고 수정하는 작업까지 하려면 별도의 프로그램을 설치해야 한다. (NTFS-3G) 이같은 경우도 native로 지원하는 것이 아니기 때문에 성능이 저하된다.

 

 File을 다루는 입장이라면 가장 중요하게 생각되는 요소가 뭘까? 물론 읽고 쓰는 performance 도 하나가 있겠지만, 또다른 하나로는 파일의 보존성도 있지 않을까 싶다. 만약 system에 crash가 발생한다면? 갑자기 shutdown이되면 현재 쓰고 파일은 어떻게 될것인지... 이런 문제를 해결하기 위한 file system도 있는데 바로 Journalling File System(JFS)이다. IBM에서 만들어진 이 시스템은 file의 data structure를 journal이라고 하는 일종의 circular buffer 방식으로 관리함으로써 파일의 변화를 계속 tracking해준다. 물론 이를 tracking하는데 필요한 file I/O가 부가적으로 들긴하지만, 그런 것을 감안하더라도 이점이 충분한 file system이기도 하다. 궁금한 사람은 이 File System이 관리되는 개념인 transaction에 대해서도 보면 좋을것 같다.

 아무튼 Journalling 은 많은 file system에 적용되어 사용되고 있다. Linux에서 주로 쓰이는 규격인 ext에서도 ext4에 포함되어 있으며, 앞에서 소개한 JFS, XFS, 그리고 Oracle에서 개발되고 있는 b-tree file system(btrfs)도 journalling이 적용된 file system이다.

 

 참고로 자기가 사용하고 있는 file system을 알고 싶으면 /proc내에 있는 filesystem의 내용을 살펴보면 된다. 나같은 경우는 다음과 같이 나온다.

 

chanseok.kang@handel:/proc$ cat filesystems
nodev   sysfs
nodev   rootfs
nodev   ramfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   pipefs
nodev   anon_inodefs
nodev   devpts
           ext3
           ext2
           ext4
nodev   hugetlbfs
           vfat
nodev   ecryptfs
           fuseblk
nodev   fuse
nodev   fusectl
nodev   pstore
nodev   mqueue
nodev   rpc_pipefs
nodev   nfs
nodev   nfs4
nodev   nfsd
nodev   binfmt_misc
nodev   autofs

 

 

그런데 위에서 보면 몇가지 흔하게 보지 못한 special filesystem들이 있다. 이중 몇개는 표로 소개해본다.

 

 Filesystem

 

 Mount Point          Purpose
 rootfs  None

 During kernel load, provides an empty root directory.

 hugetlbfs  Anywhere  Provides extended page access (2 or 4 MB on X86).
 bdev  None  Used for block devices.
 proc  /proc  Pseudo filesystem access to many kernel structures and  subsystems.
 sockfs  None  Used by BSD Sockets.
 tmpfs  Anywhere  RAM disk with swapping, re-sizing.
 shm  None  Used by System V IPC Shared Memory.
 pipefs  None  Used for pipes.
 binfmt_misc  Anywhere  Used by various executable formats.
 devpts  /dev/pts  Used by Unix98 pseudo-terminals.
 usbfs  /proc/bus/usb  Used by USB sub-system for dynamical devices.
 sysfs  /sys (or elsewhere)  Used as a device tree.
 debugfs

 /sys/kernel/debug

 (or elsewhere)

 Used for simple debugging file access.

 

여기서 참고할 사항은 몇개의 filesystem은 mount point가 없다. 즉, 우리가 접속해있는 terminal을 통해서는 해당 file system에 접근할 수 없고, 더불어 User application도 해당 file system을 사용할 수 없다. 반면 kernel은 볼수 있기 때문에 해당 file system에서 제공하는 기능을 써먹을 수 있게 된다.

 

댓글