inconsistências mdadm ao executar programaticamente

2

Atualização 1:

Acabei de dar uma camada extra de testes, escrevendo um script de shell (.sh, #! / bin / bash) e um script php para ser executado pelo cli do php.

Bash funciona.

Parece que não é o contexto HTTP do Apache, mas o próprio PHP está causando os problemas. Porque um simples php raider.php executado a partir do shell do root tem os mesmos 2 problemas mencionados originalmente.

Estou criando um appliance que tenha um WebOS no topo. O WebOS está sendo hospedado com o Apache sendo executado como http:http . Como o WebOS precisa de acesso ao sistema operacional (raiz), os sudoers são configurados - para permitir http ALL com NOPASSWD.

Por favor, não informe sobre os processos que estão sendo executados como root - o ambiente é controlado e está funcionando há 2 anos com mais de 40 unidades vendidas e sem problemas relatados.

Os comandos são executados por php (mod_php5 para Apache) com proc_open de um contexto de solicitação HTTP.

Todo comando parece estar funcionando bem, exceto por mdadm --create . Quando tento criar um array, há resultados aleatórios dependendo do nível do RAID que escolhi fazer.

Anteriormente, eu tive um , mas isso não é mais o caso. O problema começou a aparecer depois de algumas atualizações do sistema operacional (não sei quando exatamente, esta é a versão antiga do WebOS que não está funcionando e teve que ser trazida até recentemente e, aparentemente, precisa ser corrigido - há também uma nova versão que funciona bem (tem um ciclo de execução de comando diferente)).

Estou usando o gancho mdadm_udev initramfs para montar o RAID ao iniciar. Deixei /etc/mdadm.conf empty, porque mdadm_udev parece montar o RAID corretamente com base em seus metadados. O único problema, no entanto, é que quando ele é montado, ele nomeia o ataque com base em <hostname>:<raidname> .

Devido à captura acima, estou usando mdadm --create /dev/md/<hostname>:stoneshare ... , que parece estar rodando bem na CLI, não importa qual seja o usuário (usuários não-root são executados como sudo e bem sucedidos), os problemas surgem quando executados através do contexto HTTP.

Cenário nº 1, RAID0:

<?php

$command = sprintf('sudo mdadm --create /dev/md/%s:stoneshare --level 0 --raid-devices 2 /dev/sdb1 /dev/sdc1');
proc_open($command, /* ... */, /* ... */);

O RAID é criado, mas, onde a CLI faz o RAID em /dev/md127 e os links simbólicos para /dev/md/<hostname>:<sharename> , executando o script acima, acabo com /dev/md127 sem link:

[root@stone ~]# mdadm --detail --scan
ARRAY /dev/md127 metadata=1.2 name=stone:stoneshare UUID=7329e458:96be442a:84f616d8:fd4ba42e

[root@stone ~]# ls -la /dev/md*
brw-rw---- 1 root disk 9, 127 Jul 30 11:48 /dev/md127

Cenário nº 2, RAID1:

<?php

$command = sprintf('sudo mdadm --create /dev/md/%s:stoneshare --level 1 --assume-clean --raid-devices 2 /dev/sdb1 /dev/sdc1');
proc_open($command, /* ... */, /* ... */);

Verifique:

[root@stone ~]# mdadm --detail --scan
ARRAY /dev/md/stone:stoneshare metadata=1.2 name=stone:stoneshare UUID=7329e458:96be442a:84f616d8:fd4ba42e

[root@stone ~]# ls -la /dev/md*
brw-rw---- 1 root disk 9, 127 Jul 30 11:48 /dev/md127

/dev/md:
total 0
drwxr-xr-x  2 root root   60 Jul 30 12:17 .
drwxr-xr-x 19 root root 3080 Jul 30 12:17 ..
lrwxrwxrwx  1 root root   10 Jul 30 12:17 stone:stoneshare -> /dev/md127

Estranhamente, mas o link simbólico é criado, existe um problema diferente - na criação do RAID, aleatoriamente /dev/sdb1 ou /dev/sdc1 é automaticamente marcado como defeituoso. O RAID é criado e iniciado, mas está sendo executado com 1 unidade. Às vezes, nenhuma das unidades é marcada como defeituosa e o RAID é criado sem nenhum problema.

Eu escolhi, o que eu encontrei como informação relevante para a falha do dispositivo:

[root@stone ~]# journalctl -xb
Jul 30 11:39:43 stone kernel: md: bind<sdb1>
Jul 30 11:39:43 stone kernel: md: bind<sdc1>
Jul 30 11:39:43 stone kernel: md/raid1:md127: active with 2 out of 2 mirrors
Jul 30 11:39:43 stone kernel: created bitmap (8 pages) for device md127
Jul 30 11:39:43 stone kernel: md127: bitmap initialized from disk: read 1 pages, set 14903 of 14903 bits
Jul 30 11:39:43 stone kernel: md127: detected capacity change from 0 to 1000068874240
Jul 30 11:39:43 stone kernel:  md127: unknown partition table
Jul 30 11:39:43 stone systemd[1]: Starting MD array monitor...
Jul 30 11:39:43 stone systemd[1]: About to execute: /usr/lib/systemd/scripts/mdadm_env.sh
Jul 30 11:39:43 stone systemd[1]: Forked /usr/lib/systemd/scripts/mdadm_env.sh as 457
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service changed failed -> start-pre
Jul 30 11:39:43 stone systemd[457]: Executing: /usr/lib/systemd/scripts/mdadm_env.sh
Jul 30 11:39:43 stone systemd[457]: Failed at step EXEC spawning /usr/lib/systemd/scripts/mdadm_env.sh: No such file or directory
Jul 30 11:39:43 stone systemd[1]: Received SIGCHLD from PID 457 ((m_env.sh)).
Jul 30 11:39:43 stone systemd[1]: Child 457 ((m_env.sh)) died (code=exited, status=203/EXEC)
Jul 30 11:39:43 stone systemd[1]: Child 457 belongs to mdmonitor.service
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service: control process exited, code=exited status=203
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service got final SIGCHLD for state start-pre
Jul 30 11:39:43 stone systemd[1]: About to execute: /sbin/mdadm --monitor $MDADM_MONITOR_ARGS
Jul 30 11:39:43 stone systemd[1]: Forked /sbin/mdadm as 460
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service changed start-pre -> running
Jul 30 11:39:43 stone systemd[1]: Job mdmonitor.service/start finished, result=done
Jul 30 11:39:43 stone systemd[1]: Started MD array monitor.
Jul 30 11:39:43 stone kernel: md: md127 still in use.
Jul 30 11:39:43 stone kernel: md/raid1:md127: Disk failure on sdb1, disabling device.
                              md/raid1:md127: Operation continuing on 1 devices.
Jul 30 11:39:43 stone mdadm[460]: mdadm: No mail address or alert command - not monitoring.
Jul 30 11:39:43 stone systemd[460]: Executing: /sbin/mdadm --monitor --scan
Jul 30 11:39:43 stone systemd[1]: Received SIGCHLD from PID 460 (mdadm).
Jul 30 11:39:43 stone systemd[1]: Child 460 (mdadm) died (code=exited, status=1/FAILURE)
Jul 30 11:39:43 stone systemd[1]: Child 460 belongs to mdmonitor.service
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service: main process exited, code=exited, status=1/FAILURE
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service changed running -> failed
Jul 30 11:39:43 stone systemd[1]: Unit mdmonitor.service entered failed state.
Jul 30 11:39:43 stone systemd[1]: mdmonitor.service: cgroup is empty
Jul 30 11:39:43 stone kernel: RAID1 conf printout:
Jul 30 11:39:43 stone kernel:  --- wd:1 rd:2
Jul 30 11:39:43 stone kernel:  disk 0, wo:1, o:0, dev:sdb1
Jul 30 11:39:43 stone kernel:  disk 1, wo:0, o:1, dev:sdc1
Jul 30 11:39:43 stone systemd[1]: Got disconnect on private connection.
Jul 30 11:39:43 stone kernel: RAID1 conf printout:
Jul 30 11:39:43 stone kernel:  --- wd:1 rd:2
Jul 30 11:39:43 stone kernel:  disk 1, wo:0, o:1, dev:sdc1
Jul 30 11:39:43 stone kernel: md: unbind<sdb1>
Jul 30 11:39:43 stone kernel: md: export_rdev(sdb1)

Pensei que eu duvido que mdmonitor é essencial para criar o RAID.

Ambos os RAIDs são perfeitamente montados quando executados a partir do CLI, sem problemas encontrados.

Drives, por S.M.A.R.T. são saudáveis.

Os UUIDs, na realidade, não são iguais, acabei de criar os exemplos de um único RAID.

O que estou fazendo errado aqui, que está causando essas inconsistências?

    
por joltmode 30.07.2014 / 12:32

1 resposta

1

TL; DR.

Eu descobri onde está o problema! Eu tive que sleep algum tempo entre algumas das tarefas de particionamento. Aparentemente me deparei com problemas de concorrência.

Em profundidade:

Parece que quando um processo é concluído, isso não significa que o kernel já tenha completado seu papel no processo (caso o kernel tenha que fazer algo após determinado processo). No meu caso, isto foi particionamento - aparentemente, eu iniciei mdadm --create muito cedo, quando o kernel ainda não tinha atualizado algumas das mudanças na partição. E sim, eu tinha partprobe no meio, mas parecia que não estava ciente de mudanças também.

Eu comecei a depurar isso com scripts de shell, scripts cli php, scripts da web, até me deparar com:

[root@stone /] parted -s /dev/sdb mklabel gpt unit GB mkpart primary 0 100%
[root@stone /] parted -s /dev/sdc mklabel gpt unit GB mkpart primary 0 100%

[root@stone /] partprobe

[root@stone /] lsblk
sda      8:0    0  55.9G  0 disk
├─sda1   8:1    0     1M  0 part
├─sda2   8:2    0   500M  0 part /boot/efi
├─sda3   8:3    0   500M  0 part [SWAP]
└─sda4   8:4    0  54.9G  0 part /
sdb      8:16   0 931.5G  0 disk
└─sdb1   8:17   0 931.5G  0 part
sdc      8:32   0 931.5G  0 disk

Quando os comandos foram executados sem intervalos entre eles, permitindo que a CPU os processe o mais rápido possível - notei que /dev/sdc ainda não atualizou sua tabela de partições.

Aparentemente, o próximo comando depois disso partprobe é mdadm --create , que começou sem alterações na tabela de partições, resultando em comportamentos estranhos.

Pode ser que minhas observações e suposições estejam completamente erradas, mas pelo menos é assim que eu posso explicar a situação logicamente por mim mesmo.

Sim, a correção foi adicionar sleep entre as chamadas:

[root@stone /] parted -s /dev/sdb mklabel gpt unit GB mkpart primary 0 100%
[root@stone /] parted -s /dev/sdc mklabel gpt unit GB mkpart primary 0 100%

[root@stone /] sleep 1

[root@stone /] partprobe

[root@stone /] sleep 1

[root@stone /] lsblk
sda      8:0    0  55.9G  0 disk
├─sda1   8:1    0     1M  0 part
├─sda2   8:2    0   500M  0 part /boot/efi
├─sda3   8:3    0   500M  0 part [SWAP]
└─sda4   8:4    0  54.9G  0 part /
sdb      8:16   0 931.5G  0 disk
└─sdb1   8:17   0 931.5G  0 part
sdc      8:32   0 931.5G  0 disk

Isso resolveu o problema.

No final, no entanto, ainda não consigo encontrar uma explicação lógica sobre por que, no caso do RAID0, ele não fez o symlink, onde ocorreu no caso do RAID1. Eu simplesmente não consigo entender o que há para impulsionar a prontidão que impede a criação de links simbólicos ...

    
por 31.07.2014 / 13:32