Páginas

sábado, 23 de septiembre de 2017

Problemas en Ubuntu al copiar ficheros desde disco duro a discos externos NTFS vía USB

Hola

En las últimas versiones de Ubuntu 16.04, 16.10 y 17.04 siempre he tenido problemas para copiar ficheros grandes (desde varios cientos de MB en adelante) desde el disco duro a unidades NTFS externas vía USB.

Al copiar estos ficheros la velocidad de copiado se va degradando poco a poco, llegando a bajar a velocidades de unos pocos cientos de bytes/sec. Si dejas el proceso de copia lanzado horas y horas
finalmente la copia se efectúa correctamente y el sistema se recupera, pero mientras se ejecuta el proceso de copiado el rendimiento general del sistema se degrada, llegando incluso a dejar de responder el ratón y el teclado, con lo que he llegado a tirar del cable USB o incluso a reiniciar el PC, cosa que no he tenido que hacer en Linux nunca.

Después de mucho googlear he dado con una solución PARCIAL que me permite una velocidad de copiado normal, PERO QUE SOLO FUNCIONA MEDIANTE LINEA DE COMANDOS lanzando cosas como:
 
   cp /path-origen/mi-fichero-grande /media/egdepedro/usbdisk

EL TEMA NO FUNCIONA SI COPIAMOS DESDE GNOME USANDO POR EJEMPLO NAUTILUS, POR ESE LADO HAY QUE SEGUIR INVESTIGANDO......

El problema viene por la extrema lentitud de los accesos USB, pero hay claramente algún bug que lleva ya años apareciendo y que no he notado en versiones anteriores de Ubuntu.

La solución es ajustar ciertos parámetros del kernel vía '/proc/sys/vm' y hacer luego esos ajustes permanentes en todos los arranques. Los pasos son:

1) Creamos el fichero de configuración del servicio /etc/systemd/system/rc.local.service con el siguiente comando:

   sudo gedit /etc/systemd/system/rc.local.service

2) Copiamos en el fichero de configuración del servicio el siguiente contenido:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

3) Creamos el script /etc/rc.local con el siguiente comando:

   sudo gedit /etc/rc.local

4) Copiamos en el script el siguiente contenido:

#!/bin/sh
echo 'tupasswordroot' | sudo -S su
echo $((16*1024*1024)) > /proc/sys/vm/dirty_background_bytes
echo $((48*1024*1024)) > /proc/sys/vm/dirty_bytes

5) Cambiamos los permisos al script para que sea ejecutable

   sudo chmod 755 /etc/rc.local

6) Por último activamos el servicio y lo iniciamos con los comandos:

   sudo systemctl enable rc.local.service
   sudo systemctl start rc.local.service

7) Podemos verificar que el servicio está bien generado con el comando:

   sudo systemctl status rc.local.service

   Que debería devolver algo de tipo:

systemctl status rc.local.service
   rc.local.service - /etc/rc.local Compatibility
   Loaded: loaded (/etc/systemd/system/rc.local.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2017-09-23 01:15:22 CEST; 1min 2s ago

14) Reiniciamos el PC y ya podemos copiar a la unidad USB ficheros grandes de forma ágil y sin afectar al rendimiento del sistema. OJO COPIANDO SIEMPRE DESDE LINEA DE COMANDOS.

Eso sería todo.

Nota. Para restaurar los valores de los parámetros del kernel 'dirty_background_bytes' y 'dirty_bytes' deberíamos hacer lo siguiente:

   sudo systemctl stop rc.local.service
   sudo systemctl disable rc.local.service
   sudo rm /etc/systemd/system/rc.local.service
   sudo rm  /etc/rc.local
   cd /proc/sys/vm
   sudo su
   echo 0 > /proc/sys/vm/dirty_background_bytes
   echo 0 > /proc/sys/vm/dirty_bytes
 
   Y tras reiniciar el PC todo volvería a estar como al comienzo.

Referencias:

https://lwn.net/Articles/572911/
https://unix.stackexchange.com/questions/107703/why-is-my-pc-freezing-while-im-copying-a-file-to-a-pendrive
https://www.netroby.com/view/3895

No hay comentarios:

Publicar un comentario