2012년 2월 7일 화요일

RAMDISK, ramfs, 그리고 tmpfs사이에 생기는 혼동!

이후의 글은 다음 링크를 참조하였다.
http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introducing-initramfs-a-new-model-for-initial-RAM-disks/
ramdisk와 ramfs의 차이

initrd같은 ramdisk는 ram 기반 block device이다. 이건 disk같이 mount되고 포멧된 고정된 크기의 메모리 공간을 의미한다. 이것은 ramdisk의 내용들은 일정한 형식을 갖는 형태로 되어 있어야 하고 특별한 도구(mke2fs, losetup)로 준비되어야한다. 그리고 모든 block device들과 같이 실행시 데이터를 해석하기 위해서 filesystem 드라이버가 필요하다. 이건 또한 낭비되는 공간(ramdisk가 꽉차지 않으면, 나머지메모리는 어떠한 것으로 사용될 수 없다.)이나 공간 제한(ramdisk가 꽉 채워졌지만 나머지 메모리 공간이 여유가 있더라도, 포멧없이 ramdisk의 확장은 불가능하다.)인위적인 크기 제한을 의미한다.

그러나 ramdisk들은 실제로 caching 때문에 많은 공간을 낭비한다. Linux는 block device를 쓰거나 읽기 위한 모든 파일과 디렉토리 entry를 cache로 처리하도록 고안되어져 있다. 그레서 Linux는 ramdisk에 쓰거나 읽게된 데이터를 "page cache"나 "dentry cache"로 복사한다. ramdisk의 아랫쪽 부분은 block device처럼 다루어 진다.

몇년 후 Linus Torvalds는 잘정리된 아이디어를 가졌다. 리눅스의 cache시스템이 filesystem처럼 mount되어 진다면 어떨까?하는... cache에 파일을 유지하고 시스템이 재시동하거나 지워질때까지 절대 지우지 안으면 어떨까? Linus는 "ramfs"이라 불리는 cache 시스템을 둘러싸는 작은 껍데기를 작성하였다. 다른 커널 개발자들은 "tmpfs"이라 불리는 개선된 버전을 만들었다. (이것은 데이터를 swap 공간에 저장할 수 있고 모든 가용 메모리를 다 소비하기 전에 공간이 다 채워지는 mount 지점의 크기를  제한한다. tmpfs의 예는 Initramfs이다.

이러한 ram 기반 filesystem들은 자동적으로 그들이 가지고 있는 데이터의 크기에 맞게 작아지거나 커진다. ramfs에 파일을 추가하거나 있는 파일의 용량을 키우는 작업은 자동적으로 더 많은 메모리를 할당한다. 그리고 파일을 지우거나 줄이는 작업은 그 메모리를 되돌려준다. 현시점에서 block device가 없기 때문에 block device와 cache사이에 어떠한 복사도 없다. cache에서의 복사는 데이터의 단순한 복사이다. 모든 훌룡한 부분들은 새로운 코드들이 아니다. 그러나 기존의 Linux caching 코드들을 위한 새로운 응용프로그램은 매우 단순하고 극도록 잘 검증된 기반구조에 기초한다.

root file system으로 initramfs을 사용하는 시스템은 filesystem으로 해석될 block device가 없기 때문에 하나의 filesystem 드라이버만으로 구현된 커널이면 안된다. 그져 메모리에 파일이 존재하게된다.

이 둘의 차이는  가상적인 disk와 filesystem의 차이이다. 서로 다른 차원에서 형성된 개념으로 비교가 불가능하다. 예를 들어 이야기 하자면 시스템의 RAM의 한부분을 RAMDISK로 사용하고 파일 시스템을 ramfs으로 포멧한다라고 하면 이해가 되려나?

이후의 내용은 다음 링크의 내용을 참조 하였음

http://www.thegeekstuff.com/2008/11/overview-of-ramfs-and-tmpfs-on-linux/

ramfs과 tmpfs의 차이

기본적으로 tmpfs과 ramfs는 몇가지 세세한 사항을 제외하고 거의 동일하다.

ramdisk는 동적으로 공간을 할당한다. 그레서 ramfs에 데이터를 쓰는 작업은 시스템에서 사용가능한 메모리의 크기를 넘어가지 않도록 해야한다. 이야기 해보자면 여러분이 시스템에 2G의  RAM을 가지고 있고 1G의 ramfs을 생성하고 /tmp/ram의 지점에 mount되어 있다고 하자. /tmp/ram의 전체 크기가 1G를 상회할 때도 여전히 데이터를 저장할 수 있다. 시스템은 1G를 넘는 데이터 저장 행위를 멈추지 못한다. 그러나 시스템의  RAM의 전체 크기 2G를 넘는 데이터 저장을 하게 되면 시스템은 멈추고 RAM에는 더이상 데이터를 저장할 공간이 없어지게 된다.

tmpfs은 동적으로 공간을 할당하지 않는다. tmpfs을 mount할 때 설정한 용량을 넘어서서 데이터 저장을 허용하지 않는다. 그레서 데이터를 쓰는 작업이 용량이 넘지 않도록 신경쓰지 않아도 된다. 하지만, 용량을 넘어서는 작업을 하게되면 “No space left on device”라는 메시지를 내보낸다.

tmpfs은 swap을 사용한다. (swap은 파일 시스템의 swap 디스크를 일컷는다.)

ramfs은 swap을 사용하지 않는다.

ramfs과 tmpfs의 단점

ramfs과 tmpfs의 단점은 시스템이 재시동하거나 멈추게 될 때 다 지워지게 된다. 그레서 주기적으로 disk에 저장하는 작업을 해주어야 한다. 시스템이 재시동할 때 ramfs과 tmpfs의 데이터를 disk에 저장하는 작업을 할 수 있지만 시스템이 멈출때는 이러한 추가적인 도움을 받을 수 없다.

Table: Comparison of ramfs and tmpfs


Experimentation                   Tmpfs              Ramfs
허용량이상의 데이터 쓰기    에러 메시지      쓰기 작업 허용
고정된 총 용량                    고정된 총크기   변동적인 총 크기
Swap 디스크 사용                사용                무사용
휘발성 저장                         예                   예


여러분이 데이터를 쓰는 작업을 좀 더 빠르게 하자고 한다면, 시스템 주의사항을 제공하는 tmpfs이 좀더 낳다.


댓글 1개: