Como posso alterar a quantidade e o tamanho dos ramdisks do Linux (/ dev / ram0 - / dev / ram15)?

27

No Linux, quando eu inicializo, automaticamente tenho 16 discos rígidos de 16 MB; no entanto, gostaria de criar um disco rígido realmente grande para testar algum software.

Descobri que posso ajustar o tamanho dos ramdisks já existentes no sistema com o parâmetro de inicialização do kernel ramdisk_size, no entanto, isso torna todos os 16 ramdisks (/ dev / ram0 - / dev / ram15) com o tamanho especificado. Então, se eu quiser criar um ramdisk de 1 GB, precisarei de 16 GB de memória.

Basicamente, quero criar um ramdisk de 10 GB que seria / dev / ram0. Como eu faria isso? Presumo que exista um parâmetro de inicialização do kernel, mas simplesmente não o encontrei.

Kevin S.
fonte

Respostas:

18

Tempo de compilação do kernel

Existem duas opções de configuração do kernel que você pode definir no seu .configarquivo:

CONFIG_BLK_DEV_RAM_COUNT=1
CONFIG_BLK_DEV_RAM_SIZE=10485760

Isso configurou meu kernel para criar um ramdisk de 10G no momento da inicialização.

Notas:

  • CONFIG_BLK_DEV_RAM_SIZE está em KB.
  • Não especifique mais memória do que você realmente possui RAM no seu computador.
  • Veja menuconfigem Drivers de dispositivos-> Bloquear dispositivos.

Tempo de inicialização

Você pode especificar o tamanho dos discos ram criados por meio do parâmetro de inicialização do kernel ramdisk_size. Por exemplo:

kernel /vmlinuz-2.6.32.24 ro root=LABEL=/ rhgb quiet ramdisk_size=10485760

Agora posso inicializar minha máquina e criar um sistema de arquivos, montá-la e usá-la exatamente como um dispositivo de bloco.

# mkfs.xfs /dev/ram0
# mount /dev/ram0 /mnt/ramdisk

Fontes:

  1. http://www.vanemery.com/Linux/Ramdisk/ramdisk.html [morto]
  2. https://www.kernel.org/doc/Documentation/blockdev/ramdisk.txt
Kevin S.
fonte
16

Você deve usar tmpfs para isso.

mount -t tmpfs -o size=10g none /mnt/point
Ignacio Vazquez-Abrams
fonte
Posso criar um sistema de arquivos em um tmpfs? Eu preciso de um dispositivo de bloco que resida na memória em que eu possa criar um sistema de arquivos. Posso fazer isso em um tmpfs?
Kevin S.
O tmpfs é um sistema de arquivos. Acontece que reside na memória.
Ignacio Vazquez-Abrams
3
Agradeço a resposta e normalmente um tmpfs faria o truque, mas preciso criar um sistema de arquivos xfs na parte da memória em que estou escrevendo.
Kevin S.
O problema com o tmpfs é que ele é suportado pelo swap. Se você começar a usar o swap, estará perdendo os benefícios de estar na RAM pura. Além disso, algumas pessoas preferem ter uma área que não é suportada por aplicativos de criptografia.
precisa saber é
As respostas e os detalhes relacionados estão aqui: unix.stackexchange.com/questions/66329/…
jocull 1/16
7

Para criar um grande disco ram após a inicialização sem mexer nos parâmetros do kernel. Use tmpfs, crie um arquivo, monte-o via loop e monte-o através de um sistema de arquivos:

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
cd ..
mount /dev/loop0 temp2/

Provavelmente um pouco de penalidade de desempenho passando por várias camadas diferentes ... mas pelo menos funciona.

user39725
fonte
6

Outra opção é usar os dispositivos de loop (em oposição ao recurso loobpack do mount, como mencionado anteriormente):

dd if=dev/zero of=myfs.img bs=1M count=1024
losetup /dev/loop0 myfs.img
mkfs.xfs /dev/loop0

Agora / dev / loop é um dispositivo de bloco legítimo no qual seu aplicativo atuaria como um dispositivo físico ou ramdisk, exceto que é feito com backup de arquivo. Você pode montar em algum lugar ou fazer com que o aplicativo atue no nó do dispositivo, que implementa o bloco padrão ioctls. Salva sua memória ram do sistema e útil para acompanhar casos de teste, etc.

(Você pode até fdisk myfs.img, criar partições nele e usar --offset e --sizelimit com losetup para apontar cada / dev / loopX para partições específicas da imagem, para que loop0, loop1 se tornem exatamente como sdc1, sdc2, etc. )

David Mirabito
fonte
Não um como este não precisa recompilar o kernel
m-ric
3

Você pode usar um arquivo de loop. Apenas crie um arquivo de loop do tamanho desejado (se você deseja colocá-lo em um ramdisk tmpfs, tudo bem) e, em seguida, formate o arquivo de loop e monte-o.

dd if=/dev/zero of=myfile bs=1G count=10
mkfs.xfs -d file myfile
mount -t xfs -o loop myfile mymntpoint
KFro
fonte
Na verdade, eu tentei isso antes de postar minha pergunta. É uma ótima solução, mas o software que estou testando age de maneira diferente quando se trata de um arquivo e não de um dispositivo de bloco, por isso estava olhando para a opção ramdisk. Obrigado.
Kevin S.
2
Dispositivos de loopback são dispositivos de bloco, então não tenho certeza de como isso é possível?
Pjc50
2

O objeto de uma ramdrive é a velocidade. Tmpfs não é uma unidade. Os dispositivos de loop não são unidades, mas você pode colocar uma imagem de unidade em um dispositivo de loop. Os discos ram "são" unidades e unidades muito rápidas. Tente executar:

hdparm -t /dev/sda 

e depois:

hdparm -t /dev/ram0

Você verá o que eu quero dizer! Mas o hdparm às vezes destrói o drive ram. Então, você precisa fazê-lo novamente.

Às vezes, não há dispositivos / dev / ram. Para fazer um:

mknod -m 0777 /dev/ram0 b 1 0 

mas não terá tamanho. Para dar tamanho:

dd if=/dev/zero of=/dev/ram0

e irá parar quando a unidade estiver cheia. O tamanho máximo é determinado pela configuração do kernel parm: CONFIG_BLK_DEV_RAM_SIZE.

Em seguida, apenas formate-o, ou seja,

mke2fs /dev/ram0

E monte-o:

mount /dev/ram0 /mnt/ramdrive

Um dos meus favoritos é o código de depuração armazenado em um ramdrive. As compilações têm pelo menos 10 vezes a velocidade do código armazenado no disco rígido. As tabelas de banco de dados armazenadas no ramdrive também voam, mas você deve ter um script que grave no disco rígido periodicamente. A maioria dos administradores não tem coragem de colocar dados em discos ram. E algumas tabelas são muito grandes.

Swansword
fonte
1

No farol 64 (puupy linux baseado em slackware) eu fiz isso;

mke2fs /dev/ram1 4096000 # nearly 4G ramdisk, choose the size of ramdisk less than actual ram!
mount /dev/ram1 /mnt/dvd # dvd on my laptop is unused choose your device from /mnt/

Lá você tem um ramdisk montado como um diretório /mnt/dvdonde você pode copiar e colar salvar, faça tudo como faria em um diretório hd, exceto no ram. lembre-se de salvar seus arquivos em hd antes do desligamento.

Marcos
fonte