Linux에서 램 디스크 만들기


70

RAM이 62GB 인 머신과 7GB에 불과한 트렁크가 있으므로 RAM 디스크를 만들어 컴파일 할 것이라고 생각했습니다. 저는 Linux 전문가가 아닙니다. 인터넷에서 RAM 디스크를 만드는 지침을 찾았습니다.

mkfs -q /dev/ram1 8192

그러나 16GB의 램 디스크를 할당하기 위해 8192를 16777216으로 변경했습니다.

다음과 같은 오류가 발생했습니다.

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

그 시점에서 나는 겁에 질려 도망 쳤다.

sudo dmidecode --type 17 | grep Size

8x8192MB + 2048MB = 67584 MB

하지만 du/dev제공합니다 804K.

그게 문제 야? 그 /dev크기를 극복 할 수 있습니까 ?


15
tmpfs를 사용해 보셨습니까? ext2가 필요없는 RAM의 파일 시스템입니다. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

작동했습니다! 감사! 그러나 지금까지 속도가 크게 향상되지 않았습니다. 빌드에 사용하는 도구가 여전히 일반 디스크를 사용하고 있다고 생각합니다. 램 디스크에 더 많은 것을 넣을 것입니다.
Frank

3
커널이 램에 도구를 캐시하기 때문에 도구를 램 디스크에 넣는 것은 큰 차이가 없습니다.
t-8ch

1
@goldilocks 일화적인 증거이지만 Maven으로 Java 프로젝트를 컴파일 할 때 램 디스크를 사용할 때 속도 가 크게 향상됩니다. 나는 이것이 읽기 시간보다 탐색 시간 때문이라고 생각합니다.
철자

1
/ dev / shm, 실제로 / run / shm사용할 수 있습니다. 거의 항상 있습니다.
Camille Goudeseune

답변:


78

리눅스에서 램 디스크를 만드는 가장 좋은 방법은 tmpfs입니다. 램에있는 파일 시스템이므로 ext2가 필요하지 않습니다. 다음을 사용하여 16Gb 크기의 tmpfs를 작성할 수 있습니다.

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
내 시스템에는 / mnt에 아무것도 없으며 다음과 같이 표시됩니다. ls : / mnt / tmpfs에 액세스 할 수 없음 : 해당 파일 또는 디렉토리 마운트가 없습니다. 마운트 지점 / mnt / tmpfs가 없습니다. 그게 걱정이 될까? 내가 단순히 mkdir / mnt / tmpfs라면, 그 목적을 무너 뜨린다 (일반 디스크에 tmpfs를 만들어서 불길을 피하십시오, 저는 초보자입니다).
Frank

9
대상으로 마운트 지점 (디렉토리)이 필요하므로이 디렉토리를 작성한 후 (모든 디렉토리를 사용할 수 있고 기존 내용이 음영 처리됨) 응답의 명령으로 마운트 할 수 있습니다.
t-8ch

1
tmpfs순수한 RAM 디스크에서는 원하지 않는 스왑을 사용할 수 있습니다.
palswim

2
@RomanSusi tmpfs는 파일 유형입니다 (-t 뒤에 전달됨). "none"은 tmpfs에 존재하지 않는 백업 장치 ( "disk")입니다.
t-8ch

1
크기를 지정하는 것은 선택 사항입니다. 기본적으로 RAM의 절반입니다. 더 큰 크기를 지정하면 오버 헤드가 발생하지 않으며 실수로 모든 RAM을 사용하고 시스템을 종료하지 않도록 보호하기 위해 제한이 설정됩니다.
sourcejedi

20

Linux는 RAM을 사용하는 데 매우 효율적입니다. 와 속도가 향상되면 거의 볼 수 없다는 사실은 거의 놀랍지 않습니다 tmpfs. 메모리로 읽어서 처리 속도를 늦출 수있는 가장 큰 부분은 도구 (컴파일러, 어셈블러, 링커)이며, make시작시 메모리에로드되어 떠나지 않습니다. 남아있는 것은 소스에서 읽는 것입니다 (메모리를 많이 사용하지 않으면 결과를 쓰는 것이 느려지지 않습니다). 다시 말하지만 comon 헤더 파일은 그대로 유지되며 사용자의 소스 만 읽을 필요가 있습니다. 그리고 그것은 몇 메가 바이트 이상일 것 같지 않습니다. 큰 RAM 디스크를 만들거나을 많이 사용 tmpfs하면 빌드 메모리를 제한하여 RAMdisk 또는 파일을 tmpfs 만들 수 없습니다. 거기에서 직접 사용하십시오.


1
뭐! 거기에서 어떻게 직접 사용할 수 없습니까?
Kazark 2013

RAM에 있지만 직접 사용할 수있는 형식이 아닙니다.
vonbrand

2
정말! 어떻게 요? (느리게 용서
해주세요

8
@Kazark, 메모리에서 실행 파일을 처리하기 위해 특수 데이터 구조가 사용됩니다. RAMdisk tmpfs는 일반적으로 실행 파일을 저장하기 위해 사용되지 않기 때문에 (RAMdisk는 오래 전부터 느리게 플로피 디스크를 사용하는 등의 오래된 tmpfs것들이며, 임시 데이터는 엄격합니다), 필요한 추악한 해킹을 추가 할만큼 중요한 사람은 아무도 없습니다.
vonbrand

7
tmpfs (RAM) 파일 시스템에서 레일 코드를 실행하려고 시도했지만 전혀 차이가 없었습니다. 나는 눈에 띄는 차이를 기대하고 있었지만 멋진 리눅스가 얼마나 실망했는지 실망했습니다.
Khaja Minhajuddin

6

문제는 램 디스크의 최대 크기,보다 구체적으로 램 디스크 드라이버를 통해 액세스 할 수있는 메모리 크기가 컴파일 타임에 구성되고 부팅시 덮어 쓸 수 있지만 커널이 메모리에로드되면 고정 된 상태로 유지된다는 것입니다. 기본값은 아마도 메가 바이트로 측정됩니다. 드라이버를로드 할 때 램 디스크의 메모리가 올바르게 예약되어 있으면 모든 램 디스크의 크기가 동일하며 기본적으로 16 램 디스크가 있습니다. 따라서 16G의 램 디스크 크기도 원하지 않습니다 :-)

다른 답변에서 언급했듯이 tmpfs는 사용하려는 것입니다. 또한 전체 디스크를 ramdisk / tmpfs에 두어도 많은 승리를 거두지 못할 것입니다. builddir을 tmpfs에 복사하고 컴파일을 수행하십시오. 모든 임시 결과가 tmpfs의 위치에 기록되도록해야 할 수도 있습니다.


실제로 물건을 쓸 때까지 메모리를 사용하지 않습니다. 부팅 시간 제한은 제한입니다. 하나를 채운 후에도 메모리를 다시 확보 할 수 있습니다 blockdev --flushbufs.
psusi

@psusi : 더 자세한 정보를 제공해 주시겠습니까? 램 디스크 메모리에 의해 일단 주장 된 것은 결코 예를 들어 Documentation/blockdev/ramdisk.txt커널 소스에서 회수되지 않는다는 언급 만 찾을 수 있습니다. 그리고 내 대답 : 그 파일에는 메모리가 소비됨에 따라 램 디스크가 커지므로 한 번에 모두 할당되지는 않습니다.
Bananguin

어떤 종류의 정보? 명령을 실행하면 여전히 마운트되지 않았다고 가정하여 램을 해제합니다.
psusi

명령이하는 말이 명령에 의해 수행된다는 것을 어떻게 알 수 있습니까? 매뉴얼 페이지는이를 확인하지 않으며 커널 소스 트리의 문서는 정보와 모순되는 것으로 이해 될 수 있습니다.
Bananguin

6
소스 코드를 읽고 시도하여 확인했습니다.
psusi

3

부팅 후 큰 램 디스크를 만들려면 커널 매개 변수를 엉망으로 만들지 않는 것이 좋습니다. tmpfs를 사용하고 파일을 만들고 루프를 통해 마운트 한 다음 파일 시스템을 통해 마운트하십시오.

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

아마도 여러 다른 계층을 거치는 약간의 성능 저하가 있지만 적어도 작동합니다.


3

tmpfs및 이외에도 ramfs다른 옵션은 /dev/ram0블록 장치입니다. 최근 Ubuntu 버전에서는이 장치가 기본적으로 존재하지 않지만을 통해 만들 수 있습니다 modprobe brd.

이 접근 방식은 실제 ext4파일 시스템을 생성하고 사용자가 지정한 제한을 초과하지 않기 때문에 더 예측 가능 합니다. 그러나 설정하는 데 더 많은 단계가 필요하며 RAM을 덜 효율적으로 사용합니다.

brd 커널 모듈 (/ dev / ram0) 사용

4GB RAM 디스크를 만들고 초기화하려면 :

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nr매개 변수는 작성할 RAM 디스크 수를 지정합니다 (기본적으로 16 개를 작성 /dev/ram0합니다 /dev/ram15). rd_size매개 변수의 크기 킬로바이트 . $(( ... ))구문은 쉘에서 산술 연산을 수행 할 수 있습니다.

RAM 디스크를 할당 해제하려면 디스크를 마운트 해제하고 brd커널 모듈을 제거하십시오 .

umount /ramdisk
modprobe -r brd

내부에 블록 장치 만들기 ramfs

또는 내부에 블록 장치를 만들 수 있습니다 ramfs.

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncate명령은 온 디맨드가 초기화되도록 주어진 크기의 빈 파일 (즉, 소비하는 메모리)을 생성한다.

RAM 디스크를 할당 해제하려면 디스크를 마운트 해제하고 디스크 이미지를 삭제하십시오.

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

과의 비교 tmpfsramfs

비록 tmpfsramfs블럭 장치를 사용하는 것보다 더 효율적이며, 그 아래의 단점 중 일부이다.

tmpfs디스크로 교체 될 수 있습니다. 이 방법이 더 효율적이지만 순수한 RAM 디스크를 원하는 경우가 있습니다.

  • 작업중인 파일은 중요합니다 (예 : 암호화 된 파티션의 파일).
  • 성능 테스트를 수행하고 있으며 디스크 I / O가 요인이되기를 원하지 않습니다 (SSD 쓰기 시간은 크게 다를 수 있음).
  • 큰 파일의 압축을 풀고 SSD를 닳고 싶지 않습니다.

ramfs파일을 삭제하면 공간을 확보하고 RAM을보다 효율적으로 사용할 수 있습니다 (시스템은 파일이 RAM에 있다는 것을 알고 있기 때문에 파일을 버퍼링하지 않습니다). 그러나 자체 단점과 놀라움이 있습니다.

  • df유틸리티는 공간 사용량을보고하지 않습니다.

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • 크기 제한 매개 변수가 없습니다. 램 디스크를 너무 많이 넣으면 시스템이 중단됩니다.

  • 스파 스 파일은 최소한 기대할 때 스파 스되지 않을 수 있습니다. 오늘 아침에 VM 이미지 (150G, 49G 디스크에 사용됨)를 ramfs(128G의 RAM이 있음)에 복사했습니다 . 효과가있었습니다. 내가 복사 할 때 부터ramfs 대상으로, 내 시스템이 응답하지되었다. cp유틸리티는 분명히에 구멍을 채워 읽기 가 아니라 쓰기에.

모두 tmpfsramfs실제와 다르게 작동 할 수 있습니다 ext4파일 시스템. RAM으로 블록 장치를 생성하고 초기화 ext4하면 이것을 피할 수 있습니다.

보다 심도있는 비교를 위해 : https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP RAM의 양은 MB로 표시됩니다. 따라서 입력해야 할 것은 16384입니다.


1
아니. "fs 크기에 접미사가없는 경우 2KB의 힘으로 해석됩니다." -남자mkfs.ext2
sourcejedi

1

ramfs파일 시스템을 마운트하고 프로젝트를 파일 시스템에 복사 한 다음 거기서 작업 할 수 있습니다. 이렇게하면 입력 파일이 RAM에로드되고 훨씬 느린 디스크 드라이브에서 다시 읽지 않습니다. 그러나 당신이 발견 한 것처럼, 이것은 일반적으로 유용한 전략이 아닙니다. 이미 동일한 혜택을 누리고 있습니다.

Ramfs는 Linux의 디스크 캐싱 메커니즘 (페이지 캐시 및 dentry 캐시)을 동적으로 크기를 조정할 수있는 RAM 기반 파일 시스템으로 내보내는 매우 간단한 파일 시스템입니다.

-https : //github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

입력 파일을 처음 읽을 때 RAM에 캐시되어 있다는 것을 이미 신뢰할 수 있습니다. 출력 파일도 캐시되므로 디스크에 기록 될 때까지 기다리지 않습니다.

캐시 할 수있는 양, 캐시 된 기간 등에 대한 인위적인 제한은 없습니다. RAM을 채우면 캐시가 삭제되기 시작합니다. 어떤 캐시가 먼저 삭제되는지는 매우 정교한 알고리즘에 의해 선택됩니다. 첫 번째 근사값은 최근 사용 된 것으로 표시합니다. 참조 OS 파일 캐시를위한 리눅스 커널에 사용되는 어떤 페이지 교체 알고리즘?

텍스트 편집기는 fsync()파일을 디스크에 명시 적으로 저장합니다.

를 포함하는 프로그램의 테스트를 실행 fsync()하는 경우 파일 시스템에서 테스트를 실행하면 ramfs속도가 빨라질 수 있습니다. 또 다른 전략은 / 로 시도하고 비활성화 fsync()하는 것 입니다.eatmydatanosync.so

다른 운영 체제에는 램 디스크를 사용하여 무시할 수있는 특정 제한이있을 수 있습니다. 한쪽 끝에서의 부족 어떤 램 디스크에 인기가 왜 파일 캐싱은 DOS .

tmpfs

tmpfsramfs스왑 공간이있는 경우이를 사용할 수 있다는 점을 제외하고 와 동일하게 작동합니다 . 즉, 다른 용도로 RAM이 필요한 경우 가장 최근에 사용한 알고리즘이 tmpfs에서 데이터 블록을 선택하여 디스크로 교체 할 수 있습니다.

대부분의 사람들 tmpfs은 총 크기를 제한 할 수 있고 예를 들어 df명령 에서 올바르게 사용 된 공간을 보여주기 때문에를 사용합니다 . 이 차이가 왜 존재하는지 잘 모르겠습니다. 크기 제한 tmpfs은 실수로 전체 RAM을 채우고 기본적으로 시스템을 종료하지 못하게합니다. 기본적으로 RAM의 절반입니다.

쓰기가 느려지는 다른 이유

위의 내용은 귀하의 경우에 맞게 단순화되었습니다. 귀하의 경우 파일에 대한 쓰기는 디스크를 기다릴 필요가 없습니다. 그러나 일부 쓰기 작업이 있습니다. 버퍼링 된 쓰기가 때때로 정지되는 이유 는 훌륭한 블로그 게시물을 참조하십시오 . 가장 놀라운 사례는 최근 "안정적인 페이지 쓰기"라는 Linux 변경입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.