티스토리 뷰
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의 내용을 살펴보면 된다. 나같은 경우는 다음과 같이 나온다.
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에서 제공하는 기능을 써먹을 수 있게 된다.
'Study > Linux' 카테고리의 다른 글
[Linux][Tip] Share the terminal with screen (0) | 2020.06.17 |
---|---|
[Linux] Processes (1) (0) | 2016.07.28 |
[Linux] 보드에 연결된 serial port의 상태 확인 (14) | 2016.07.21 |
[Linux] buildroot 관련 잡담 (0) | 2016.06.02 |
[Linux] hardfloat compile과 softfloat compile시 차이 (0) | 2016.05.31 |
[Linux] floating point 관련 삽질중 (0) | 2016.05.25 |
[Linux] ARM gcc-4.7 cross compiler 설치 (0) | 2016.05.18 |
- Total
- Today
- Yesterday
- DepthStream
- 파이썬
- Off-policy
- ColorStream
- Pipeline
- arduino
- reward
- TensorFlow Lite
- RL
- 딥러닝
- 한빛미디어
- Windows Phone 7
- Kinect
- bias
- Expression Blend 4
- Kinect SDK
- ai
- PowerPoint
- SketchFlow
- Variance
- windows 8
- 강화학습
- Distribution
- Gan
- Policy Gradient
- End-To-End
- dynamic programming
- processing
- Offline RL
- Kinect for windows
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |