Use / dev / ramX como seus dispositivos especiais correspondentes?

0

Com ls -l , encontrei uma série de dispositivos como ram0 , ram1 etc. Olhei 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). Eu tentei ler e escrever para ram3 , mas para minha surpresa, eu posso ler um bloco de 8 MiB de zero bytes a partir dele, e não posso escrever mais de 8 MiB nele, pois achei que poderia receber imediatamente um EOF quando lendo e poderia escrever infinitamente para ele.

Eu então tentei outros ram s, mas o mais surpreendente é que todos se comportam da mesma forma. /dev/ram8 não gera materiais aleatórios como /dev/random do, /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 caractere se comportam como /dev/null,full,zero,random e bloqueiam dispositivos iguais a /dev/ramX

Então comecei a pensar:

  • Como o /dev/ramX é diferente de /dev/<device> com o mesmo número de dispositivo?
  • Como explicar o material vazio de 8 MiB (todo zero) quando lido e o limite de gravação de 8 MiB para esses dispositivos de bloco?

Eu acho que as respostas devem se aplicar a todos os sistemas Linux-kernel.

(Nota lateral: 8 MB = 8.000.000 bytes e 8 MiB = 8.388.608 bytes)

    
por iBug 07.01.2018 / 04:53

1 resposta

1

Os dispositivos de bloco são completamente separados dos dispositivos de caracteres. O fato de os números maior / menor do dispositivo serem iguais significa nada: você pode pensar no bit de dispositivo de bloco / caractere como um bit extra e mais significativo nos números de dispositivos.

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 bloco. Eu acho que Linus Torvalds considera essa divisão apenas como um artefato histórico e pode querer literalmente tratar o bit de dispositivo de bloco / caractere como apenas um dígito binário extra para o número do dispositivo. Mas, por enquanto, alguns softwares antigos presumem que qualquer sistema semelhante ao Unix possui dispositivos de bloco e dispositivos de caracteres e que suas naturezas são fundamentalmente diferentes e, assim, alguma aparência deste design antigo permanecerá.

Os dispositivos /dev/ram* são definidos na configuração do kernel com as opções CONFIG_BLK_DEV_RAM* de tempo de compilação:

  • CONFIG_BLK_DEV_RAM determina se esses dispositivos são integrados ao kernel, compilados como um módulo ( brd.ko ) ou completamente omitidos. O Debian 9 tem isso como um módulo.
  • CONFIG_BLK_DEV_RAM_COUNT determina o número de dispositivos / dev / ram * a serem criados. Kernel "padrão de fábrica" é de 16 dispositivos.
  • CONFIG_BLK_DEV_RAM_SIZE definirá o tamanho de cada dispositivo / dev / ram *: o kernel "padrão de fábrica" é de 4 MiB por dispositivo, o Debian 9 usa 16 MiB. Sua distribuição aparentemente usa 8 MiB.

Se o driver de disco RAM for compilado como um módulo do kernel, você poderá modificar o número e o tamanho de /dev/ram* dispositivos usando os parâmetros do módulo.

Os dispositivos /dev/ram* são normalmente usados pelos instaladores do Linux e assim, 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 se comportam geralmente como discos: eles têm um tamanho finito, você pode criar sistemas de arquivos neles. Você poderia criar uma tabela de partições neles, mas não há números de dispositivos padrão alocados para partições de disco RAM. Se você precisar de um disco RAM particionado, poderá usar o comando kpartx para contornar isso facilmente: os dispositivos de partição resultantes para /dev/ramX normalmente receberão o nome /dev/mapper/ramXpY . Obviamente, tudo que você armazenar nos dispositivos /dev/ram* será perdido na reinicialização ou na perda de energia - ou quando você descarregar o módulo brd.ko , se aplicável.

Acho que algumas distribuições (usadas?) usam os dispositivos /dev/ram* ao criar o initramfs / initrd. (Sempre que um novo pacote do kernel é instalado, um novo arquivo initramfs é geralmente criado automaticamente. Ele não pode vir pré-empacotado, pois o arquivo initramfs precisa incluir várias configurações específicas para o seu sistema.)

    
por 07.01.2018 / 06:52