O problema de
cache em dispositivos de armazenamento
USB é algo bastante comum e pode ser frustrante para os usuários. Quando copiamos arquivos grandes para um pendrive ou HD plugado na USB, a cópia é feita rapidamente, mas ao tentarmos remover com segurança o dispositivo, é preciso esperar por um longo período.
Isso ocorre porque a cópia dos arquivos não diferencia a cópia em cache da cópia real para o outro dispositivo. O tamanho da cache varia conforme a quantidade de memória RAM livre, o que é bom para acelerar o sistema, mas pode ser inconveniente para dispositivos USB.
Ao longo dos anos, houve muitos relatos de usuários de várias distribuições
Linux que não gostam desse comportamento. No entanto, reduzir a configuração de "dirty pages" para diminuir a cache pode também reduzir a velocidade do sistema como um todo, inclusive do armazenamento interno.
Fiz uma solução que está sendo utilizada no
BigLinux, mas deve funcionar em todas as outras distribuições, chamei de
usb-dirty-pages-udev, que detecta automaticamente dispositivos de armazenamento plugados na USB e estabelece a cache especificamente para eles em 16 MB, enquanto o restante do sistema continua com o sistema de cache padrão. Isso resolve o problema de espera prolongada para remover com segurança os dispositivos USB, sem afetar o desempenho geral do sistema.
Se a distribuição for instalada em um dispositivo USB, esse dispositivo não terá a redução de cache para 16 MB, mantendo o desempenho do sistema e o código completo pode ser visto aqui:
https://github.com/biglinux/usb-dirty-pages-udev
Se você não está utilizando uma distribuição instalada em um dispositivo USB, que deve ser a situação de quase todos os usuários, é mais simples ainda, basta criar um arquivo de configuração do udev com esse conteúdo:
ACTION=="add", KERNEL=="sd[a-z]", SUBSYSTEM=="block", ENV{ID_USB_TYPE}=="disk", RUN+="/usr/bin/bash -c 'echo 1 > /sys/block/%k/bdi/strict_limit; echo 16777216 > /sys/block/%k/bdi/max_bytes'"
Sugestão de pasta e nome para o arquivo:
/etc/udev/rules.d/60-usb-dirty-pages-udev.rules
Vamos entender o que essa regra faz, ao plugar um dispositivo (add), é feira a verificação se o kernel vai criar algum dispositivo /dev/sda ou qualquer outro dispositivo em ordem alfabética até o /dev/sdz, verifica é o SUBSYSTEM é block e o ID_USB_TYPE é disk. Se o dispositivo corresponder a essas características, então serão executadas duas mudanças na configuração:
# echo 1 > /sys/block/%k/bdi/strict_limit
Esse comando ativa o limite de cache específico para esse dispositivo, lembre que %k é a identificação do dispositivo fornecida pelo udev, por exemplo, sda.
# echo 16777216 > /sys/block/%k/bdi/max_bytes'
Esse comando estabelece o limite de cache em RAM desse dispositivo em 16 MB, você pode alterar o valor para o que achar melhor.
Após salvar o arquivo pode atualizar as regras do
udev sem precisar reiniciar com o comando:
udevadm control --reload-rules && udevadm trigger
Dica complementar 1: para você criar suas próprias regras do udev, utilize esse comando para ter informações do dispositivo, troque o endereço para o do dispositivo que for necessário, no exemplo irá verificar informações sobre o sda:
# udevadm info /sys/class/block/sda
Dica complementar 2: para monitorar o que ocorre com o udev ao conectar ou desconectar um dispositivo, utilize o comando:
# udevadm monitor
Dica complementar 3: venha fazer parte do BigLinux, criando automações e outras facilidades para o sistema.