Com ls -l
, encontrei uma série de dispositivos como ram0
, ram1
etc. Observei a saída de perto e (por exemplo)
brw------- 1 root root 1, 3 Jan 6 11:34 /dev/ram3
crw-rw-rw- 1 root root 1, 3 Jul 15 1970 /dev/null
Hmmm, eles diferem apenas pelo tipo de dispositivo (bloco e caractere). Tentei ler e gravar em ram3
, mas, para minha surpresa, consigo ler um bloco de 8 MiB de zero bytes dele e não consigo gravar mais de 8 MiB nele, pois pensei que poderia receber imediatamente um EOF ao ler e poderia escrever infinitamente para ele.
Em seguida, tentei outros ram
s, mas o mais surpreendente é que todos se comportam da mesma forma. /dev/ram8
não gera coisas aleatórias como /dev/random
faz, /dev/ram7
não informa "disco cheio" como /dev/full
...
Então eu tentei mknod
-ing tudo no meu diretório de trabalho (tipo de montagem: ext4), e os resultados são os mesmos: os dispositivos de caracteres se comportam da mesma forma /dev/null,full,zero,random
e os dispositivos de bloco são iguais aos/dev/ramX
Então comecei a me perguntar:
- Como é
/dev/ramX
diferente de/dev/<device>
com o mesmo número de dispositivo? - Como explicar o material vazio de 8 MiB (todos zero) quando lido e o limite de gravação de 8 MiB para esses dispositivos de bloco?
Acho que as respostas devem se aplicar a todos os sistemas de kernel Linux.
(Nota lateral: 8 MB = 8.000.000 bytes e 8 MiB = 8.388.608 bytes)
Os dispositivos de bloco são completamente separados dos dispositivos de caracteres. O fato de os números principais/secundários do dispositivo serem iguais não significa nada: você pode pensar no bit do dispositivo de bloco/caractere como um bit extra e mais significativo nos números do dispositivo.
Conceitualmente, os números dos dispositivos são índices na grande tabela de dispositivos do kernel. Historicamente, costumava haver uma tabela para dispositivos de caracteres e outra para dispositivos de blocos. Acho que Linus Torvalds considera essa divisão apenas como um artefato histórico e pode eventualmente querer tratar literalmente o bit do dispositivo de bloco/caractere como apenas um dígito binário extra para o número do dispositivo. Mas, por enquanto, alguns softwares antigos assumem que qualquer sistema semelhante ao Unix possui dispositivos de bloco e dispositivos de caractere e que suas naturezas são fundamentalmente diferentes e, portanto, alguma aparência desse design antigo permanecerá.
Os
/dev/ram*
dispositivos são definidos na configuração do kernel com asCONFIG_BLK_DEV_RAM*
opções de tempo de compilação:brd.ko
) ou completamente omitidos. O Debian 9 o possui como um módulo.Se o driver de disco RAM for compilado como um módulo do kernel, você poderá modificar o número e o tamanho dos
/dev/ram*
dispositivos usando os parâmetros do módulo.Os
/dev/ram*
dispositivos são geralmente usados por instaladores de Linux e tal, para permitir a configuração de algo razoavelmente semelhante a um sistema normal quando não há disco real disponível.Eles são dispositivos de bloco baseados em RAM, então eles geralmente se comportam como discos: eles têm um tamanho finito, você pode criar sistemas de arquivos neles. Você pode criar uma tabela de partição neles, mas não há números de dispositivo padrão alocados para partições de disco RAM. Se você precisar de um disco RAM particionado, poderá usar o
kpartx
comando para contornar isso facilmente: os dispositivos de partição resultantes/dev/ramX
normalmente seriam nomeados como/dev/mapper/ramXpY
. Obviamente, tudo o que você armazenar nos/dev/ram*
dispositivos será perdido na reinicialização ou perda de energia - ou quando você descarregar obrd.ko
módulo, se aplicável.Acho que algumas distribuições (costumavam?) usar os
/dev/ram*
dispositivos ao criar o arquivo initramfs/initrd. (Sempre que um novo pacote de kernel é instalado, um novo arquivo initramfs geralmente é criado para ele automaticamente. Ele não pode vir pré-empacotado, pois o arquivo initramfs precisa incluir várias configurações específicas para seu sistema.)