quarta-feira, 17 de outubro de 2012

Desativando write cache em todos os discos internos

No post Escritas duráveis (ou: o mal que o EXT3 causou) mostrei uma forma de desativar o write cache do disco rígido usando um .service do systemd. Considerei apenas um disco /dev/sda. Quando existe mais de um HD na máquina, poderíamos repetir a linha ExecStart adaptando o nome do dispositivo. Funcionaria, porém não seria lá uma solução muito robusta, pois se algum disco for adicionado ou removido o arquivo precisaria ser atualizado. E se por algum motivo surgir um disco interno chamado /dev/sdzzz? (saiba que é possível, porém improvável :-)

Quem sabe automatizar um meio de desativar o write cache em todos os discos existentes na máquina que sejam do tipo não-removível?

O systemd é um projeto que quer retirar o shell script da onde for possível. Tirá-lo da vitrine do processo de boot. Mas obviamente não acabar com ele. Este é um caso onde um pequeno shell script ajuda pacas e trabalha em harmonia com o systemd.

Chega de papo e vamos lá.

/usr/local/libexec/desativa-write-cache.sh
(não esqueça de dar permissão de execução ao arquivo: chmod +x /usr/local/libexec/desativa-write-cache.sh)

#!/bin/bash

for i in $(lsblk -drno NAME | grep -Eo 'sd[[:alpha:]]+'); do
    if [[ $(lsblk -drno RM /dev/$i) == 0 ]]; then
        echo "Desativando write cache em /dev/$i"
        hdparm -W0 /dev/$i
    fi
done

/etc/systemd/system/desativa-write-cache.service

[Unit]
Description=Desativa Write Cache
DefaultDependencies=no
Before=local-fs-pre.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/desativa-write-cache.sh

[Install]
WantedBy=basic.target

systemctl daemon-reload
systemctl enable desativa-write-cache.service

----
Nota: no shell script, se você usar uma distribuição que venha com pelo menos a suíte util-linux 2.22 (fdisk -V dirá a versão), poderá simplificar um pouco usando a nova opção -I do lsblk, que nos permite remover o filtro com o grep:

#!/bin/bash

for i in $(lsblk -I 8 -drno NAME); do
    if [[ $(lsblk -drno RM /dev/$i) == 0 ]]; then
        echo "Desativando write cache em /dev/$i"
        hdparm -W0 /dev/$i
    fi
done

Nenhum comentário:

Postar um comentário