jueves, 29 de mayo de 2014

controlling cpu temperature with bash scripting

As I said before in a previous post, my favourite linux flavour is gentoo. Gentoo is a good distribution but as many others have some problem implicit in their own philosophy.

All their packets have to be compiled and this is a problem in terms of heating. I mean, if you pc is a very old laptop with one of its fan broken, compiling could be a dangerous task.

Some time my cpu have reached 80 ºC, even though my cpu claim that the critical point is 95 ºC I dont want to test it.

Therefore, in order to keep my cpu cold I make a-very-easy-to-understand script that modulates the cpu frequency.

Firstly, you have to know if your cpu is giving its temperature to the operative system.

ls /sys/devices/virtual/thermal/thermal_zone0/

and you have to see something like this:


This means that you have at least one thermal_zone that normaly is given by ACPI as in my case it is. If you read the content of the file temp, you will be able to see the cpu's temperature in milidegrees.

Secondly, you have to know if you have an active linux module that let you modulate the cpu's frequency with the userspace governor. In my case I'm using p4-clockmod as a frequency modulator. As you can read in several places this driver do not change your cpu at all because speedstep technology is not available in old pentium 4 processor. However this driver halt the cpu several times per seconds in order to emulate a frequency modulation. There are diferents drivers like acpi-cpufreq, as you can imagine this driver let you use the acpi p-states that are available in most of the new cpu that you can buy nowadays.

Let's try to change the cpu speed

You have to know at what frequencys are your proccesor able to run.

sudo cpupower frequency-info


Now you can try to change the cpu frequency.




Now you can try to read my code:

#!/bin/bash

#licenced with gpl-v3
clear

while true
do
   sleep 5
   temp=`cat /sys/devices/virtual/thermal/thermal_zone0/temp`
   echo $temp
   if(($temp <= 70000)); then
      cpupower frequency-set -f 1600MHz
      echo "cpupower frequency-set -f 1600MHz"
   else
      cpupower frequency-set -f 200MHz
      echo "cpupower frequency-set -f 200MHz"
   fi

   
done


example of execution:



Yeah man but.... why are you doing this if there are a good driver called intel-thermal-daemon?

man, i don't know, in gentoo it is not available in the main portage so I want to try by myself.

If you are using ubuntu you can try this driver with
sudo apt-get install thermald

If i were you, I'll definitely try thermald before my shit.

There are a lots of miss spellings a grammar mistakes, I will correct them when I learn proper english.

See you in my next post. (maybe I'm am my only reader)

jueves, 9 de enero de 2014

tutorial: Desactivando ipv6 (y SLAAC) a lo gomero

Tuve un compañero de universidad que por nivel de frikismo vaticinó que sería el típico que gastase sus tardes de invierno en casa compilando el kernel de linux. Por supuesto yo lo negué y dije que jamás sería tan friki como para compilar por mi cuenta el kernel.

Bueno, pues va siendo hora de reconocer mi nivel de frikismo. SI, lo acepto, me gusta linux y me gusta el open source, me gusta compilar el kernel desde que hace un mes aprendí a hacerlo.
He conseguido disminuir el tiempo de carga de mi portátil en 10 segundos y eso que el pobre tiene ya 9 años que en escala humana serían como 99.

La historia comienza cuando este verano quise investigar cuales distribuciones de linux son optimizadas para ordenadores viejos. Empecé probando lubuntu, es de las mejores ya que incorpora el escritorio LXDE que no ocupa nada literalmente. El siguiente paso fue buscar distribuciones más difíciles como puede ser archlinux que tienen la flexibilidad de personalizar los demonios que quieres que carguen al principio etc...
Pero la distribución por antonomasia es GENTOO LINUX y a continuación explicaré el porqué de escribirlo en mayúsculas.

Gentoo es una distribución en que todos los paquetes o programas DEBEN de ser compilados, para ello el instalador te proporciona un gcc y poco más, pero resulta que al contrario que pueda parecer es sumamente sencillo de utilizar.
Dispone del gestor de paquetes emerge, el cual como cualquier otro, detecta dependencias y las descarga y compila, todo ello sin uno tener que escribir ningún comando mágico en la consola.

Las ventajas son tremendas dado que uno controla las optimizaciones independientes de la máquina que hace gcc e incluso puede decirle si tu procesador tiene el repertorio SSE o SSE2 como es mi caso.
Esto resulta en un código especial para tu procesador lo cual es sumamente positivo, dado que un programa determinado irá más rápido en determinadas circunstancias.

Después de este prologo un tanto largo no voy a continuar con la explicación de porqué es necesario desactivar SLAAC en un entorno en que ipv4 es suficiente, sino iré directamente al grano.
Para quien quiera informarse del tema seguir el siguiente enlace:
http://www.elladodelmal.com/2013/03/evil-foca-ataque-slaac-1-de-4.html

Como bien dice el título del post, va a ser una solución gomera, es decir... a lo bruto. ¿Para qué quiero desactivar ipv6 si siempre puedo no incluirla en la pila de protocolos?

Sabiendo compilar el kernel y no perdiéndose entre tantas opciones de configuración, es sumamente sencillo deshacerse de ipv6 de una vez por todas.

Antes de empezar decir que este tutorial está hecho para gentoo linux, pero quien tenga ubuntu que se mire el manual de como compilar el kernel:
https://help.ubuntu.com/community/Kernel/Compile

Nos vamos a la carpeta donde está el fuente:
cd /usr/src/linux


tecleamos make menuconfig
o sudo make menuconfig si no tenemos permisos de administrador:


nos aparecerá una pantalla bien bonita hecha con ncurses:



Nos dirigimos a:
Network Supporting -> Networking Options -> The IPv6 Protocol

y escribimos la N de no para decir que no lo queremos en el kernel ni como modulo.




le damos a exit y esto hará que se guarde el config en .config


lo unico que queda es lo normal en estos casos


  1. hacer make
  2. ir a arch/x86/boot/bzimage y copiarla a /boot
  3. luego hacer make modules_install para compilar los modulos..
  4. luego como opcional hacer una imagen inicial de ram initramfs... "genkernel --install initramfs"
  5. y por ultimo decirle al bootloader que hay un nuevo kernel listo "grub2-mkconfig -o /boot/grub/grub.cfg"


y reiniciar....

ESO es to, eso es to, eso es tooodoo amigos.

Hemos borrado de un plumazo un protocolo de red de la pila, fácil, sencillo y para toda la familia!

En un capitulo posterior discutiremos cuales son las desventajas de tener los drivers compilados en módulos y cuales son las ventajas de incorporarlos dentro del kernel. JIJIJIJIJI soy friki!