Ikasten.IO
Learning, Aprendiendo

HOWTO: hibernación y suspenso en Debian GNU/Linux 6 junio, 2007

Autor: Basaburu ‘ 2007
Título completo: HOWTO: hibernación y suspenso en Debian GNU/Linux sid/experimental con el patch suspend2 y el script hibernate

Introducción

El software Suspend2 es una funcionalidad del kernel que guarda el contenido de la memoria Ram en la partición swap o en un fichero y apaga la máquina. Cuando se enciende de nuevo, el contenido de la partición swap se carga nuevamente en la memoria, permitiendo el trabajo continuo, en el mismo estado en que se encontraba la máquina al hibernar/suspender, sin tener que recargar el sistema. El script hibernate explota y gestiona las funcionalidades de Suspend2. El proceso es muy rápido y útil, sobre todo en portátiles, donde economizar la energía es importante para el equipo.

Otra funcionalidad que proporciona el script hibernate es el suspenso en Ram de forma que mientras exista batería la imagen del sistema es almacenada en suspenso en la Ram.

Así que tenemos por un lado el software suspend2 un parche del kernel y el script hibernate que explota sus funcionalidades.

Este howto se escribe sobre una Debian GNU/Linux sid/experimental pero es factible su aplicación a etch y lenny. Y se presupone que a Ubuntu. De hecho hibernate esta en la misma versión para etch, lenny 1.94-2. Y sid esta en 1.96~pre-svn.r1116-1) He instalado las dos versiones y no he apreciado cambios aparentes.

En KDE se integra perfectamente con klaptop, con todas las ventajas que eso tiene. Excepto por que para el suspenso no utiliza hibernate-ram el script para suspenso en Ram. Lo que supone incomodidades a la hora de gestionar módulos que no se quieren levantar o hardware que se queda perchado. (estoy intentando averiguar si es posible que klaptop tire de hibernate-ram)

Una comparativa de funcionalidades de hibernado a disco de las distintas implementaciones para la serie 2.6 del kernel, se pueden encontrar en esta pagina: http://www.suspend2.net/features


La documentación de referencia principal que he usado: HOWTO oficial de Suspend2
Así como las páginas man hibernate e hibernate.conf y el wiki de gentoo

Hardware confirmado que funciona y que no funciona con Suspend2. Dado el acelerado proceso de desarrollo no esta actualizada. Parte de mi hardware funciona y en la página se dice que no. Así que usadla de referencia nada mas. De todas formas lo mejor es probar XD

http://wiki.suspend2.net/HardwareCompatibility

El software Suspend2 necesita características pse o pse36 en la CPU así que haced un “”cat /proc/cpuinfo”” y comprobarlo en el campo de los flags.

El uso de swapwriter requiere un espacio swap mayor que la ram de la que dispongas. De todas formas yo no he tenido ningún problema puesto que usando compresión LZF se obtiene un ratio de compresión de entre el 30% y el 50%. Yo tengo la misma swap que ram.

Proceso de implementación
Para conseguir las funcionalidades del software suspen2 es necesario incorporar al código del kernel el parche suspend2 (parchear), compilar el kernel, instalar el kernel compilado, instalar el script hibernate que gestiona suspend2 y configurarlo.

Estos son los pasos que vamos a dar:

  • Obtener las herramientas para compilar
  • Obtener el Kernel para el que exista parche
  • Parchear el kernel con el patch suspend2
  • Configurar el Kernel
  • Modificar el initrd incorporando un script
  • Compilar el kernel, en este caso a la manera debian
  • Instalar el nuevo núcleo
  • Instalar el paquete hibernate y el paquete suspend2-userui
  • Configurar hibernate

1. Obtener las herramienas para compilar
La manera más fácil es instalando los paquetes kernel-package, debhelper, modutils y libncurses5-dev y sus dependencias. Podeís consultar la documentación de debian al respecto.

Debian Reference, El kernel de Linux en Debian

debian:~# apt-get install debhelper modutils kernel-package libncurses5-dev

Otra referencia de como compilar kernels en Debian kernel a la debian
nota= olvidaros de la orden make mproper, para eso ya está make-kpkg clean

2. Obtener el Kernel para el que exista parche

Hay dos vías (teniendo en cuenta que estamos hablando de una instalación en Debian) el repositorio de debian (con las ventajas que suponen los parches de debian) o site kernel.org

Podeís elegir entre los existentes en el repositorio debian….

usuario@debian:~$ apt-cache search linux-source

O bajarlo de kernel.org repositorio serie 2.6

Si optaís por el repositorio debian, al instalar el paquete os dejará un fichero comprimido en /usr/src/linux-sources-2.6.x.tar.bz2

debian:~# apt-get install linux-source-2.6.x

Si optaís por bajarlo de kernel.org el procedimiento es el mismo solo que el nombre del tar es linux-2.6.21.1.tar.bz2 y además tenéis que colocarlo/moverlo vosotros al directorio de las fuentes /usr/src, lo hacemos al reves :))) nos metemos como root en el /usr/src y desde ahí bajamos el kernel.

Vamos a usar las últimas fuentes estables de kernel.org para las que hay patch suspend2 (ver más abajo)

debian:~# cd /usr/src

debian:/usr/src# wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.1.tar.bz2
Y descomprimimos las fuentes

debian:/usr/src# tar xfj linux-2.6.21.1.tar.bz2

Creáis un enlace simbólico a las fuentes descomprimidas, que estarán en un directorio con el nombre de fichero comprimido. linux-2.6.21.1

debian:/usr/src# ln -s linux-2.6.21.1 linux

Bueno, las fuentes del kernel están preparadas.

Vamos a parchear…….

3. Parchear el kernel con el patch suspend2

Para que el scrip hibernate funcione es necesario parchear el kernel con el patch suspend2. Para cada kernel hay su correspondiente patch. Por lo tanto en función de la versión del kernel que elijas debes elegir su patch.

El web site de suspend2 es:

Download de Suspend2

El último a fecha de la redacción de este howto es el 2.2.10 para los siguientes kernels:

2.6.18.8
suspend2-2.2.10-for-2.6.18.8.patch.bz2 19 May 2007 101440

2.6.19.7
suspend2-2.2.10-for-2.6.19.7.patch.bz2 19 May 2007 101718

2.6.20.11
suspend2-2.2.10-for-2.6.20.11.patch.bz2 19 May 2007 95824

2.6.21.1
suspend2-2.2.10-for-2.6.21.1.patch.bz2 19 May 2007 95850

2.6.22-rc1
suspend2-2.2.10-for-2.6.22-rc1.patch.bz2 19 May 2007 96272

ubuntu-feisty
suspend2-2.2.10-for-ubuntu-feisty.patch.bz2 21 May 2007 94863

El sitio “natural” para dejar los parches es el directorio /usr/src/kernel-patches

debian:/usr/src# mkdir kernel-patches/suspend2

Y ahora metéis ahí, en ese dir, el comprimido del patch que habréis elegido en función de la version del kernel a parchear.

Lo primero es descomprimirlo, así:

debian:/usr/src/# bunzip2 kernel-patches/suspend2/suspend2-2.2.10-for-2.6.21.1.patch.bz2

Esto os dejara el patch descomprimido listo para parchear.

Entráis en el dir de las fuentes “cd linux“. Y desde ahí llamáis al parche y parcheáis el núcleo.

debian:/usr/src/linux# patch -p1 < /usr/src/kernel-patches/suspend2/suspend2-2.2.10-for-2.6.21.1.patch

Si todo ha ido bien…… ya tenéis el kernel parcheado.

Yo he aprovechado y e instalado el paquete kernel-patch-debianlogo y he cambiado el logo que aparece arriba en la pantalla a la izquierda por cada núcleo cuando arranca la máquina….. un tux…. por un logo debian XD

Os deja el patch en /usr/src/kernel-patches/diffs/debianlogo/debian-logo-2.6.x.gz

El proceso es el mismo, descomprimirlo (en este caso con gunzip es un gz) y parchear con él el núcleo.

Ahora el kernel esta configurado por defecto y con el/los parches. Lo más cómodo, “práctico” es que cojáis un config que este funcionando en la máquina y lo convirtáis en el .config de las fuentes. Las imágenes de debian vienen preparadas para funcionar en “casi” cualquier máquina, usar ese config da la seguridad de que todo lo necesario esta en la configuración del kernel. Eso sí salen imágenes más grandes 🙂

Por ejemplo:

debian:/usr/src/linux# cp /boot/config-2.6.18-4-686 .config

4. Configurar el Kernel

Bueno pues ya estamos listos para configurar el kernel con sus parches. Evidentemente este howto no prentende enseñar a compilar el núcleo, no vamos a ver todas las opciones….. solo las necesarias para nuestro objetivo. Obtener hibernación con hibernate, suspend2 y ya puestos el logo de debian.

Ahora configuramos el kernel con el configurador menuconfig:

debian:/usr/src/linux# make menuconfig

Vamos a la sección “Power management options (ACPI, APM) —>”

Desactiváis la opción “Software Suspend” y entráis en la subsección “Suspend2 —>”

Subsección Software Suspend 2

Aquí he definido una configuración para usar la partición swap como resume device.

Activáis la opción de “Compression support” que luego veremos como asegurarnos de que esta activado el compresor que utiliza Suspend2 LZF

Y si pensáis usar “Userspace User Interface” lo activaís, luego veremos como bajar el paquete y su configuración. (Aunque es un poco pobre, una interface texto en mi caso)

En mi caso la partición swap es (swap:/dev/sda6) En “Default resume device name debéis” poner la partición que se corresponda con vuestra swap. Aunque la docu dice que de esta forma no es necesario, hay que pasarle parametro al kernel.

Debéis poner vuestra swap en el grub como parametro del kernel “resume2=swap:/dev/sda6”

Por ejemplo: “kernel /vmlinuz-2.6.21.1 root=/dev/sda2 ro vga=792 resume2=sawp:/dev/sda6

Lo he montado en dos máquinas y en una no hace falta y en la otra si. Así que mejor lo ponéis.XD

Como no voy a usar ficheros para almacenar la imagen desactivamos “File Allocator”

Salimos de la subsección y entramos en “ACPI … Support —>”

ACPI Kernel

Aquí como en todos lados en general tenéis la opción de modudos o monolítico compilado en el núcleo. En algunos docus que he leido recomiendan todo como modulos en otros lo contrario. Yo prefiero en monolítico (aparece un * el check box de las opciones)

Si tu hardware no soporta ACPI… tendrás que probrar con APM pero creo que no funcionará. En general todo el mundo con hard moderno debe usar ACPI y desactivar APM.

Salimos al menú principal. Y vamos a la sección “Cryptographic options —>”

Y nos aseguramos que “LZF compression algorithm” está marcado para compilación monolítica, esto es…… tiene un asterisco.

Yo me he encontrado con un problema con los discos. me decía:

Suspend2: Can’t translate “/dev/sda6” into a device id yet.
Suspend2: Initialise modules failed!

Esto es debido a que los discos no se han inicializado y reconocido las particiones.

Para resolverlo hay que configurar en monolítico en el kernel el soporte de disco en función de la infraestructura que tengáis. En mi caso es un disco sata y por lo tanto el driver sata y los drivers scsi. (gracias a José Luis Triviño de la lista debian-user-spanish que me lo señaló cuando estaba atascado con el suspend2) }8=]

Debian logo, para configurarlo os metéis en la sección Device driver –> graphics support –> Logo configuration –>)

Logo Configuration

Elegid solo uno 🙂 sino veréis bonitos colores y se descontrolará la consola, pasarle al kernel en el grub, vga=792 o lo que soporte vuestro monitor, necesitaís también soporte framebuffer en consola. Y veréis un logo por procesador al comienzo del arranque del sistema.

Por ejemplo: “kernel /vmlinuz-2.6.21.1 root=/dev/sda2 ro vga=792

NOTA para nvidia

Para que la cosa funcione hace falta desactivar el soporte agpart, modificar el xorg.conf y modificar el /etc/hibernate/blacklisted-modules

Entráis a la sección Device Drivers –> Graphics support y desactiváis todas las tarjetas agp desde la nVidia Riva support hasta el final. Si no hacéis esto no os dejará desactivar el agpart.

Desde el menu principal entraís en Device Drivers –> Character devices –> y desactiváis /dev/agpart (AGP Support).

Ojo esto solo para las tarjetas nvidia que soporten agp interno.

En el xorg.conf añadís a la sección Device Option “NvAGP” “1”

(ver docu Nvidia /usr/share/doc/NVIDIA_GLX-1.0/html/appendix-q.html y /usr/share/doc/NVIDIA_GLX-1.0/html/appendix-f.html o http://us.download.nvidia.com/XFree86/Linux-x86/1.0-9755/README/appendix-f.html)


Section “Device”

EndSection
En el fichero /etc/hibernate/blacklisted-modules hay que comentar o borrar la entrada nvidia.

Bueno pues ya esta, tenemos configurado el kernel.

5. Modificar el initrd

Es necesario modificar el initrd. En este caso se usan initramfs-tools.

Se trata de incorporar un script para suspend2 en el initrd.

#!/bin/sh
echo 1 > /sys/power/suspend2/do_resume

Lo podéis llamar suspend2

Y lo colocáis en el directorio /usr/share/initramfs-tools/scripts/init-premount/ para que se ejecute antes de montar los discos.

Le dais permisos de ejecución

debian:/usr/src/linux# chmod 744 /usr/share/initramfs-tools/scripts/init-premount/suspend2

De forma que cuando instalemos el kernel al ejecutarse mkinitramfs-kpkg lo meta en el initrd.

Si deseáis hacer cambios posteriormente podéis usar “update-initramfs” para modificar el initrd

Si deseáis comprobar el initrd del nuevo kernel una vez instalado lo tendréis en /boot, lo podéis descomprimir y buscar nuestro script……. creáis un dir “mkdir prueba” y desde dentro.


debian:~/prueba# mkdir temp
debian:~/prueba# gzip -cd gzip -cd /boot/initrd.img-2.6.21.1 | cpio -i
debian:~/prueba# grep -r suspend scripts

6. Compilar el kernel, en este caso a la manera debian

Primero limpiamos las fuentes

debian:/usr/src/linux# make-kpkg clean

Y ahora compilamos

debian:/usr/src/linux# make-kpkg --initrd --revision=nombre-maqina+suspend2.0.1 kernel_image

--initrd

Luego con la opción –revision=maquina+suspend2.0.1 le estamos asignado un nombre clave para poder identificar las distintas versiones de este kernel

Y finalmente el objetivo….. en este caso solo la imagen del núcleo. Si ponéis por ejemplo como objetivo binary-arch genera los paquetes headers e imagen del núcleo.

Lo mejor es consultar la página man de make-kpkg

Y ahora dependiendo de la máquina que tengáis a esperar… es el momento para ir por una birra o un cafelito. XD

Si el proceso de compilación ha ido bien…… os habrá dejado un fichero .deb con la imagen del núcleo en el directorio superior, esto es /usr/src

linux-image-2.6.21.1_maquina+suspend2.0.1_i386.deb

7. Instalar el núcleo

La ventaja de la manera debian es que la instalación y desinstalación es muy sencilla

debian:/usr/src/# dpkg -i linux-image-2.6.21.1_maquina+suspend2.0.1_i386.deb

Y ya esta. Construirá el initrd, os modificará el grub y meterá una entrada para el nuevo núcleo y lanzara update-grub.

Y si lo queréis desinstalar para pobar otro (que modifiquéis) de la misma serie debian:/usr/src/# apt-get remove --purge linux-image-2.6.21.1 os recomiendo hacerlo desde otro kernel para que no os de problemas al intentar desinstalar-reinstalar un kernel que esta corriendo. Siempre conviene tener varios kernel instalados para casos como este.

Ahora rebotáis la máquina y elegís este nuevo núcleo en el menú de grub…. que será el núcleo por defecto, si es el más moderno que tenéis pues update-grub los ordena.

En el dmseg podéis ver que suspend2 esta funcionando, por ejemplo dmesg con less para movernos con comodidad por el fichero:

usuario@debian:~$ dmesg | less

Suspend v2.2.10
Suspend2 Checksumming support registered.
Suspend2 Userspace Storage Manager support registered.
Suspend2 Basic User Interface support registered.
Suspend2 Compressor support registered.
Suspend2 Block I/O support registered.
Suspend2 Swap Allocator support registered.
Suspend2 Userspace UI support registered.
No storage allocator is currently active. Rechecking whether we can use one.
Suspend2: SwapAllocator: Signature found.
Suspend2: Resuming enabled.
Suspend2: Normal swapspace found.
Suspend2: Normal swapspace found

Y que algunos dispositivos se “retratan” confirmando su capacidad para despertarse. Por ejemplo:


Device driver usbdev2.3_ep81 lacks bus and class support for being resumed.
usb 3-1: new full speed USB device using uhci_hcd and address 2
Device driver usbdev3.2_ep00 lacks bus and class support for being resumed.
usb 3-1: configuration #1 chosen from 1 choice
Device driver usbdev3.2_ep81 lacks bus and class support for being resumed.
Device driver usbdev3.2_ep02 lacks bus and class support for being resumed.
Device driver usbdev3.2_ep82 lacks bus and class support for being resumed.
Device driver usbdev3.2_ep03 lacks bus and class support for being resumed.
Device driver usbdev3.2_ep83 lacks bus and class support for being resumed.

8. Instalar el paquete hibernate y el paquete suspend2-userui

Hibernate es el script para la explotación de las funcionalidades de Suspend2 y suspend2-userui es una interface de texto o gráfica para el proceso de suspenso/hibernación.

debian:~# apt-get install hibernate suspend2-userui

Podeís ver que os está metiendo en la maquina y donde lo está metiendo con un “dpkg -L hibernate

Podéis ver que hibernate instala tres scripts en /usr/sbin hibernate, hibernate-disk y hibernate-ram. Por lo que he comprobado hibernate y hibernate-disk hacen lo mismo. Hibernate-ram produce un suspenso en Ram.

Podeís probar hibernate con la configuración por defecto y detectar que no se levanta bien. En mi caso el sonido y el brillo de pantalla.

Es el momento de crear el grupo hibernate y meter en él al usuario que deséis de forma que podaís invocar a hibernate como usuario

debian:~# addgroup hibernate
debian:~# adduser usuario hibernate

9. Configurar hibernate

Ahora hibernate (1.94-2) viene dividido en varios ficheros de configuración, las opciones no han cambiado así que toca tirar del howto y de la página man hibernate.conf

Vamos a ir viendo los distintos ficheros de configuración que he modificado. Señalaré las pocas modificaciones que he realizado.

Son el /etc/hibernate/suspend2.conf y el /etc/hibernate/common.conf

# Example suspend2.conf file.
#
# See hibernate.conf(5) for help on the configuration items.
#
# NOTE: Suspend2 is an improved version of suspend-to-disk which currently
# requires patching your kernel. For more information, see www.suspend2.net
#
# If you do not wish to patch your kernel but still be able to suspend to
# disk, see disk.conf instead.

### suspend2 (for Software Suspend 2)
UseSuspend2 yes
Reboot no
EnableEscape yes
DefaultConsoleLevel 1
Compressor lzf
Encryptor none
# ImageSizeLimit 200

## useful for initrd usage:
# SuspendDevice swap:/dev/hda2
###BasaBuru como hemos compilado definiendo la partición swap esto no es necesario
## Powerdown method – 3 for suspend-to-RAM, 4 for ACPI S4 sleep, 5 for poweroff
PowerdownMethod 4
###BasaBuru, yo prefiero acpi así que 4

## Any other /proc/software_suspend setting can be set like so:
# ProcSetting expected_compression 50

## Or traditionally like this:
# Suspend2AllSettings 0 0 2056 65535 5

## Or even from the results of hibernate –save-settings with this:
# Suspend2AllSettingsFile

## For filewriter:
# FilewriterLocation /suspend_file 1000
# VerifyFilewriterResume2 yes

## Specify a userui like this:
ProcSetting userui_program /usr/local/sbin/suspend2ui_text
###BasaBuru para activar el userui en este caso el text, no puedo poner el gráfico por
### la inexistencia de patch fbsplash para este kernel
### el formato gráfico usa fbsplash

# Scale CPU to full speed to make sure we suspend as fast as possible.
FullSpeedCPU yes

Include common.conf

El fbsplash es un proyecto de gentoo y no hay patch para el 2.6.21.1 que hemos utilizado. Su web es
http://dev.gentoo.org/~spock/projects/gensplash/

Siguente common.conf

# Configuration options common for suspending to disk or RAM.
# Options are not case sensitive.
#
# See hibernate.conf(5) for help on the configuration items.

##############################################################################
### Some global settings
##############################################################################

Verbosity 2
###BasaBuru lo dejo en dos para ver errores solo.

LogFile /var/log/hibernate.log
LogVerbosity 2
# LogTimestamp yes
# AlwaysForce yes
# AlwaysKill yes
# HibernateVT 15
Distribution debian
# XDisplay :0

##############################################################################
### Scriptlets
### Scriptlets provide support for doing all sorts of things before and after
### suspending. The defaults settings here should work for most people, but
### you may wish to edit these to taste. Consult “hibernate -h” for help on
### the configuration settings.
##############################################################################

### bootsplash
## If you use bootsplash, also enabling SwitchToTextMode is recommended if
## you use X, otherwise you may end up with a garbled X display.
# Bootsplash on
# BootsplashConfig /etc/bootsplash/default/config/bootsplash-1024×768.cfg

### clock
SaveClock yes
### modifico a yes para que guarde el reloj al hibernar y lo recupere una vez realizado el resume

### devices
# IncompatibleDevices /dev/dsp /dev/video*

### diskcache
# DisableWriteCacheOn /dev/hda

### fbsplash (enable SwitchToTextMode if you use this)
# FBSplash on
# FBSplashTheme suspend2

### filesystems
# Unmount /nfsshare /windows /mnt/sambaserver
# UnmountFSTypes smbfs nfs
# UnmountGraceTime 1
# Mount /windows

### grub
ChangeGrubMenu yes
GrubMenuFile /boot/grub/menu.lst
###BasaBuru activo estas opciones, de forma que meta un aviso en el menu de grub señalando
### que kernel ha sido suspendido. Si arrancas otro kernel se puede producir una degradación de datos

# AlternateGrubMenuFile /boot/grub/menu-suspended.lst
# BackupGrubMenuFile /var/backups/grub.conf.hibernate

# see http://bugs.debian.org/317479
# RemountXFSBoot yes

### hardware_tweaks
# IbmAcpi yes
# Runi915resolution yes
# FullSpeedCPU yes

### lilo
# EnsureLILOResumes yes

### lock (generally you only want one of the following options)
# LockConsoleAs root
# LockXScreenSaver yes
# LockGnomeScreenSaver yes
LockKDE yes
# LockXLock yes
# LockXAutoLock yes
###BasaBuru bloqueo la sesión de kde, al resumir deja una pantalla en negro mueves el ratón y sale
###la petición de autentificación

### misclaunch
# OnSuspend 20 echo “Good night!”
OnResume 20 nvclock -S 40%
###BasaBuru le digo que cuando resuma me ponga el brillo de pantalla al 40% es la forma de dicirle a
###hibernate que ejecute comandos al suspenso o al resume.

### modules
# UnloadModules snd_via82cxxx usb-ohci
# UnloadAllModules yes
UnloadBlacklistedModules yes
LoadModules auto
# LoadModulesFromFile /etc/modules

### modules-gentoo
# GentooModulesAutoload yes

### network
# DownInterfaces eth0
# UpInterfaces auto

### pause_audio
# MuteAudio yes
# PauseAudio yes

### pcmcia
# EjectCards yes

### programs
# IncompatiblePrograms xmms

### services
RestartServices alsa-utils
# StopServices alsasound
# StartServices aumix
### BasaBuru le pido que resete alsa-utils para que me levante el sonido

### vbetool
# EnableVbetool yes
# RestoreVbeStateFrom /var/lib/vbetool/vbestate
# VbetoolPost yes
# RestoreVCSAData yes

### xhacks
SwitchToTextMode yes
# UseDummyXServer yes
# DummyXServerConfig xorg-dummy.conf

### xstatus
## This can be set to gnome, kde or x:
# XStatus gnome
# XmessageDisable yes
# XSuspendText Preparing to suspend…
# XResumeText Resuming from suspend…
## When using XStatus x, and you have xosd installed:
# XosdSettings –font ‘-misc-fixed-medium-r-semicondensed–*-120-*-*-c-*-*-*’ –colour=Green –shadow 1 –pos bottom –align center –offset 50

Evidentemente en función del hardware o servicios que tengáis que no pueden levantarse tendréis que ajustar la configuración.

Durante el proceso de hibernación podéis interactuar por medio de una serie de teclas: Software suspend hotkeys

Que disfrutéis la experiencia XD

BasaBuru basaburu@basatu.org
Este documento se licencia con la GFDL

Categorias diariolinux SysAdmin

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *