Diferentes módulos se comportam de maneira diferente quando você fornece a mesma opção várias vezes. Eu sei que você pode dizer console= várias vezes, e você recebe vários consoles (nós o usamos para máquinas com consoles principais em seus framebuffers e porta serial).
No entanto, você só pode ter uma partição raiz, então root= quase certamente substitui o valor anterior visto, quase certamente da esquerda para a direita. Isso é corroborado pela origem do kernel, em init/do_mounts.c , a função root_dev_setup() é responsável por atuar na opção root= e tudo o que faz é armazenar a chave de parâmetro em uma variável. O bootparam root=31:0 é substituído por root=/dev/mtdblock2 , ou pelo menos esse é o caso na árvore de código 2.6.25 que acabei de verificar.
A propósito, se você é competente em C, a função name_to_dev_t() no mesmo arquivo é responsável por analisar o valor de root= , e é muito esclarecedor!
A notação x:y é o Unixism padrão para major: minor, que é o modo como os Unices identificam os dispositivos. Tradicionalmente, major era um número de 8 bits identificando o driver para o hardware, e menor era um número de 8 bits identificando o próprio dispositivo. Existem dois namespaces para os números major : dispositivos de caractere e dispositivos de bloco. Você pode ver ambos digitando cat /proc/devices e você pode ver o que está ativo no momento dizendo ls -la /dev . Aqui está um exemplo:
ls -la /dev/zero /dev/sda
brw-rw---- 1 root disk 8, 0 Jan 12 22:01 /dev/sda
crw-rw-rw- 1 root root 1, 5 Jan 12 22:01 /dev/zero
A primeira coluna identifica o tipo de driver ( b para bloco, c para caractere). As duas colunas à esquerda de Jan são os números principal e secundário no formato major, minor .
Você pode dar root= de qualquer dispositivo de bloco independente de seu nome usando a notação major: minor.
A lista completa de números de dispositivos está em sua árvore de origem do kernel, em Documentation/devices.txt . 31: 0 parece se referir a / dev / rom0, o primeiro cartão ROM no sistema.