viernes, 4 de abril de 2025

Compilando zimbra en dsitribución Fedora para versiones equivalente a RHEL8 o RHEL9

¿Por qué Fedora y no Alma o Rocky?

Antes que nada, muchos preguntarán ¿Por que no lo hago con Alma, Rocky o cualquiera de las otras ofertas disponibles equivalentes a RedHat? Antes de indicar los pasos explicaré mis razones brevemente:

1.- Fedora Server como Fuente de Innovación

Fedora es el upstream directo de RHEL, lo que significa que incorpora las tecnologías más recientes antes de que sean probadas, estabilizadas y adoptadas en RHEL (y, por extensión, en sus clones como Rocky o Alma).

  • Ventaja: Fedora Server ofrece acceso temprano a características innovadoras (como nuevas versiones de GNOME, systemd, podman, Wayland, etc.) que pueden tardar años en llegar a RHEL.

  • Filosofía: Fedora representa el progreso tecnológico continuo, mientras que RHEL y sus derivados priorizan la estabilidad a largo plazo. Si una organización valora estar a la vanguardia, Fedora es una opción más alineada con la innovación que con la conservación.

2.- Depender de un "Rebuild" de RHEL es muy peligroso

CentOS (antes independiente) fue absorbido por Red Hat y convertido en CentOS Stream, un rolling-release entre Fedora y RHEL. Esto dejó a muchos usuarios sin una alternativa "gratuita" a RHEL, lo que llevó al nacimiento de Rocky y Alma Linux.

  • Desventaja: Estos proyectos dependen de que Red Hat no restrinja el acceso al código fuente de RHEL (como sucedió brevemente en 2023, cuando Red Hat limitó el acceso público a los SRPMs).

  • Filosofía: Si Red Hat decide cambiar su política nuevamente, los proyectos basados en RHEL podrían verse afectados. Fedora, al ser upstream, no tiene este problema, ya que es la base, no una copia.

3.- Fedora vs CentOS Stream: ¿Donde está el futuro?

CentOS Stream es ahora el midstream entre Fedora y RHEL, lo que lo hace más estable que Fedora pero menos que RHEL.

  • Ventaja de Fedora: Si una organización quiere influir en el futuro de RHEL, Fedora es donde ocurre el desarrollo inicial.

  • Desventaja de CentOS Stream: No es tan estable como RHEL, pero tampoco tan innovador como Fedora.

4.- Soporte y Ciclo de Vida

Fedora tiene un ciclo de vida corto (~13 meses por versión), lo que puede ser un problema para entornos que requieren estabilidad a largo plazo.

RHEL y sus clones (Rocky/Alma) ofrecen soporte por hasta 10 años, ideal para empresas.

Mi argumento más fuerte es: Si Red Hat cambia su política de código fuente nuevamente. Fedora, al ser upstream, está más protegido de estos cambios.

Compilando Zimbra en Fedora Server 28 (RHEL8)

Habiendo hecho la explicación previamente veamos entonces como proceder a compilar zimbra en un Fedora server 28 del cual esta basado RHEL8.

1. El primer paso es hacerse usuario root y ejecutar los siguientes comandos:
# yum groupinstall 'Development Tools' -y
# yum install java-1.8.0-openjdk ant ant-junit ruby git maven cpan wget perl-IPC-Cmd vim rpm-build -y
# useradd -s /bin/bash -m zmbuild
# usermod -aG wheel zmbuild
# echo "Fedora release 28" > /etc/redhat-release
2. Una vez creado el usuario zmbuild acceder como usuario zmbuild:
# su - zmbuild
3.- Crear llave git y agregarlo al repositorio:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
4.- El siguiente paso es preparar el ambiente, establecer variables de entorno y clonar el repositorio:
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
$ export RPM_BUILD_ROOT=/home/zmbuild/rpmbuild/BUILDROOT
$ export RPM_BUILD_DIR=/home/zmbuild/rpmbuild/BUILD
$ export PKG_OS_TAG=$(awk '{print "r"$3}' /etc/redhat-release)
$ mkdir installer-build
$ cd installer-build
$ clone --depth 1 --branch 10.1.0 git@github.com:Zimbra/zm-build.git
$ cd zm-build
5.- El ultimo paso es construir el paquete de zimbra para Fedora 28
$ ENV_CACHE_CLEAR_FLAG=true ./build.pl --ant-options -DskipTests=true --git-default-tag=10.1.0 --build-os=RHEL8_64 --build-arch=x86_64 --pkg-os-tag=$(awk '{print "r"$3}' /etc/redhat-release) --build-release-no=10.1.0 --build-type=FOSS --build-release=LIBERTY --build-release-candidate=GA --build-thirdparty-server=files.zimbra.com --no-interactive
6.- El último paso es restablecer el archivo “redhat-release”
$ exit
# echo "Fedora release 28 (Twenty Eight)" > /etc/redhat-release

Algunas notas sobre la modificación del archivo "/etc/redhat-release"

Para los que pregunten por hacer [echo "Fedora release 28" > /etc/redhat-release] para eliminar "(Twenty Eight)", la respuesta es que durante la compilación

ENV_CACHE_CLEAR_FLAG=true ./build.pl ... 
el zimbra builder durante la ejecución no puede manipular los espacios y arrojará el siguiente error:

     [exec] error: línea 4: La etiqueta solo recibe patrones individuales: Release: 1.r28 (Twenty Eight)
               [exec] END at ../zm-pkg-tool/pkg-build.pl line 146.
               [exec] END at ./pkg-builder.pl line 659.

Una solución alterna es compilar

ENV_CACHE_CLEAR_FLAG=true ./build.pl ... 
Esperar que de el error y agregar en la linea 249 solo el release "r28" en la variable para que el compilador pase sin problemas, el comando sería:

sed -i '249i\         chomp( $gOSTAG = `echo "r28"` );' ../zm-pkg-tool/pkg-build.pl 

Luego sería ejecutar nuevamente el comando para continuar compilando

ENV_CACHE_CLEAR_FLAG=true ./build.pl ...

Compilando Zimbra en Fedora Server 34 (RHEL9)

Los siguientes pasos son para compilar zimbra en un Fedora server 34 del cual esta basado RHEL9.
1. El primer paso es hacerse usuario root y ejecutar los siguientes comandos:
# dnf groupinstall 'Development Tools' -y
# dnf install java-1.8.0-openjdk java-1.8.0-openjdk-devel ant ant-junit ruby git maven cpan wget perl-IPC-Cmd vim rpm-build -y
# useradd -s /bin/bash -m zmbuild
# usermod -aG wheel zmbuild
# echo "Fedora release 34" > /etc/redhat-release
2. Configurar java-1.8.0 como predeterminado para jre como jdk
# update-alternatives --config java
# update-alternatives --config javac
3.- Una vez creado el usuario zmbuild acceder como usuario zmbuild:
# su - zmbuild
4.- Crear llave git y agregarlo al repositorio:
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
5.- El siguiente paso es preparar el ambiente, establecer variables de entorno y clonar el repositorio:
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
$ export RPM_BUILD_ROOT=/home/zmbuild/rpmbuild/BUILDROOT
$ export RPM_BUILD_DIR=/home/zmbuild/rpmbuild/BUILD
$ export PKG_OS_TAG=$(awk '{print "r"$3}' /etc/redhat-release)
$ mkdir installer-build
$ cd installer-build
$ git clone --depth 1 --branch 10.1.0 git@github.com:Zimbra/zm-build.git
$ cd zm-build
6.- El ultimo paso es construir el paquete de zimbra para Fedora 34
ENV_CACHE_CLEAR_FLAG=true ./build.pl --ant-options -DskipTests=true --git-default-tag=10.1.0 --build-os=RHEL9_64 --build-arch=x86_64 --pkg-os-tag=$(awk '{print "r"$3}' /etc/redhat-release) --build-release-no=10.1.0 --build-type=FOSS --build-release=LIBERTY --build-release-candidate=GA --build-thirdparty-server=files.zimbra.com --no-interactive
7.- El último paso es restablecer el archivo “redhat-release”
$ exit
# echo "Fedora release 34 (Thirty Four)" > /etc/redhat-release

lunes, 24 de enero de 2022

¿Cómo acelerar tu zabbix server?

El que ha configurado zabbix ha observado que zabbix consume espacio para el registro histórico, registro que puede eliminarse y en el siguiente ejemplo se dejan 60 dias equivalente a casi dos meses de registro histórico, esto acelera un poco el servicio del zabbix reduciendo la cantidad de información historica de logs almacenadas en la base de datos y dejando siempre información en la base de datos. El lector puede ajustar la cantidad de tiempo que le convenga almacenar o si desea no perder esta información puede hacer un dump a estas tablas y almacenarlas en un espacio de almacenamiento histórico. El usuario puede ejecutar este script cada cierto tiempo y mantener una base de datos reducida.
#!/bin/bash
fromdate=$(date --date="60 day ago" +"%Y-%m-%d")
time mysql -u root -proot zabbix -e "
RENAME TABLE history_uint TO history_uint_old;
CREATE TABLE history_uint LIKE history_uint_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO history_uint (
SELECT * FROM history_uint_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE history_uint_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE history_str TO history_str_old;
CREATE TABLE history_str LIKE history_str_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO history_str (
SELECT * FROM history_str_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE history_str_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE history_log TO history_log_old;
CREATE TABLE history_log LIKE history_log_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO history_log (
SELECT * FROM history_log_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE history_log_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE history_text TO history_text_old;
CREATE TABLE history_text LIKE history_text_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO history_text (
SELECT * FROM history_text_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE history_text_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE history TO history_old;
CREATE TABLE history LIKE history_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO history (
SELECT * FROM history_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE history_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE trends_uint TO trends_uint_old;
CREATE TABLE trends_uint LIKE trends_uint_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO trends_uint (
SELECT * FROM trends_uint_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE trends_uint_old;
"

time mysql -u root -proot zabbix -e "
RENAME TABLE trends TO trends_old;
CREATE TABLE trends LIKE trends_old;
SET SESSION SQL_LOG_BIN=0;
INSERT INTO trends (
SELECT * FROM trends_old WHERE clock >= UNIX_TIMESTAMP(
\"$fromdate 00:00:00\"
)
);
DROP TABLE trends_old;
"

viernes, 21 de enero de 2022

Proxmox VLANS

 Hola chicos.


Tenía rato de no agregar artículos, pero recordemos que agrego cuando encuentro algo útil e importante.

Tutoriales existen por montón, pero cuando encuentro algo que no está claro me agrada compartirlo.

Proxmox VE, es un excelente virtualizador, hace poco me tocó configurar un troncal entre el equipo y un switch y luego respectivamente vincular la ip administrativa a esa vlan y las vm a sus vlans correspondientes.

Por defecto instalo openvswitch en todos los proxmox VE que instalo, uso preferentemente debian como ya saben.

OpenVswitch por defecto viene configurado en modo troncal por lo que no hay que agregar opciones adicionales.

La configuración de nuestro puerto físico vendría de la siguiente forma:

#Puerto físico
auto eno1
iface eno1 inet manual
        ovs_type OVSPort
        ovs_bridge vmbr1
        ovs_options other_config:rstp-path-cost=20000 other_config:rstp-port-auto-edge=false other_config:rstp-enable=true other_config:rstp-port-admin-edge=false other_config:rstp-port-mcheck=true vlan_mode=native-untagged

#Puerto Administrativo
auto ovsip1
iface ovsip1 inet static
        address 10.0.3.5/24
        gateway 10.0.3.1
        ovs_type OVSIntPort
        ovs_bridge vmbr1
        ovs_options tag=152

#Switch ovs
auto vmbr1
iface vmbr1 inet manual
        ovs_type OVSBridge
        ovs_ports eno1 ovsip1
Creada la maquina virtual desde el proxmox en las opciones de la tarjeta de red se le coloca el switch vmbr1 y la vlan a la que se desea anexar, eso se realiza desde la web gui o se realiza en el archivo de configuración de la vm, en el siguiente ejemplo se miraría así:
net0: virtio=56:45:13:00:38:AF,bridge=vmbr1,firewall=1,tag=160
NOTA: Si observan configuro el RSTP, debido a que openvswitch no lo habilita por defecto, en mi caso prefiero hacerlo para evitar loops en la red.

jueves, 11 de noviembre de 2021

Como renombrar

Renombrar múltiples archivos y automatizarlos es útil, una de las tareas en la que hago uso esta operación es para renombrar multiples archivos y usarlos para alimentar mi granja de servidores antispam.

Por ejemplo si nos llegan a multiples cuentas correos SPAM, basta que los usuarios desde el webmail o via IMAP y marcar los mensajes como SPAM y dejar que el servidor de correo aprenda gracias al usuario.

Sin embargo cuando el usuario no realiza su tarea o se tienen servicios antispam adicionales esta tarea se debe hacer un poco manual, capturamos una copia de los correos spam y los guardamos, pero al guardarlos se guardan con el asunto si usamos por ejemplo Thunderbird.

Por lo que es útil renombrarlos a un nombre más útil y que no cause problemas con caracteres no ASCII.

Se le recuerda al lector que si esta sumergido en el área de antispam también es útil crear un bulk para los correos HAM.

Para hacer este renombrado nos moveríamos a la carpeta ham o spam y ejecutamos lo siguiente:
find . -type f | (let i=0; while read f; do mv "$f" file-$i ; let i=$i+1; done)

Otro método es mediante los inum de cada archivo y renombrarlo una vez identificado el inum.

Evitar que laptop no se duerma al cerrar la tapa

Digamos que deseas configurar una laptop en la casa pero tener la pantalla abierta es muy molesta o peligroso, los accidentes pueden ocurrir y puede ser golpeada, la basura se acumula en el teclado, etc.

Omitamos las razones para las que alguien desee dejar un servidor en casa ya sea UPNP, Gaming Server, VPN, LOCAL CLOUD, BACKUP, MEDIA SERVER, etc.

Para lograr este fin agregaremos en el siguiente archivo /etc/systemd/logind.conf como usuario root la siguiente linea:

HandleLidSwitch=ignore

Para evitar reiniciar el ordenador ejecutemos el siguiente comando, siempre como root:

service systemd-logind restart

REPOSITORIO OLD UBUNTU

Si tienes una version ubuntu vieja y requieres algun paquete disponible o realizar la actualización, usa el siguiente repositorio: 
http://old-releases.ubuntu.com/ubuntu/dists/

Configurando TCP FAST OPEN

Extensión para acelerar la apertura de conexiones sucesivas del Protocolo de control de transmisión (TCP) entre dos puntos finales. Funciona mediante el uso de una cookie TFO (una opción de TCP), que es una cookie criptográfica almacenada en el cliente y configurada en la conexión inicial con el servidor.

Establecer tcp fast open persistente a reinicios:
echo "net.ipv4.tcp_fastopen=3" > /etc/sysctl.d/30-tcp_fastopen.conf

Establecer tcp fast open en caliente:
echo "3" > /proc/sys/net/ipv4/tcp_fastopen

domingo, 11 de marzo de 2018

Zimbra Relay by Sender (User or Domain)

Mientras navegaba en la internet buscando cosas interesantes esas que valen la pena probar y configurar, encontré este artículo:
https://wiki.zimbra.com/wiki/Relay_per_Domain

Mientras lo probaba encontré un problema, que usando zimbra 8.7 al modificar según la indicación el archivo "/opt/zimbra/common/conf/main.cf.default" y agregando la linea "sender_dependent_relayhost_maps = lmdb:/opt/zimbra/common/conf/bysender" luego de reiniciar el servicio y el servidor mismo, esto no se aplicaba nunca, desconozco la razón pero parece que el zimbra no usa main.cf.default como fuente para la configuración si no como plantilla.
La solución es configurar el postfix asi:
postconf -e sender_dependent_relayhost_maps=lmdb:/opt/zimbra/common/conf/bysender

martes, 29 de agosto de 2017

Nuevo debian nuevos cambios

Recuerdo que Debian era más sencillo y por eso lo he preferido siempre, pero los cambios que trae debian 9 no me estan gustando. Sin embargo decidí no tirar toda una distribución solo por un poco de inconformidad. El problema inicia con el nombramiento de las interfaces, en sistemas nuevos veo que las interfaces toman nombres como "ens18", en lugar de "eth0" que es lo trandicional. "Ok", me dije, un pequeño cambio que puede luego ser renombrado, solo es un label, pero luego cuando quise establecer el ip de la forma tradicional editando "/etc/network/interfaces", y haciendo un ifdown y un ifup tradicional, me lleve la gran sorpresa que no ocurria nada, adicionando que "net-tools" no venía incluido por defecto, lo cual me sorprendió. Leyendo un poco al final resolví el acertijo, en debian9 ya no se puede hacer ifdown y un ifup de forma tradicional, al menos no con la versión que he instalado que es la "9.1" entiendo que es la última. La forma bajo la cual realice lo deseado sin tener que apagar el equipo fueron los siguientes pasos: # ifdown ens18 # ip address del 172.20.5.5 dev ens18 # vim /etc/network/interfaces # /etc/init.d/networking restart Con esto logré realizar el cambio de ip sin tener que reiniciar.

martes, 18 de julio de 2017

Escribiendo Scripts para crear un respaldo usando mariadb como base de datos

Hacer un respaldo con mysqldump es algo que mola mucho y va de pasada, pero a veces tenemos un servidor con tantos usuarios y tantas bd que estar creando un script con un comando mysql que por parámetro con la opción '-e' le pasemos las consultas para hacer una query para obtener todas las bd, a veces puede resultar en catastrofes al darnos cuenta que mysqldump no respaldó toda la bd desde hace meses y que no lo ha venido haciendo correctamente, por lo tanto necesitamos un metodo más fiable que haga en verdad su trabajo y es acá donde entra xtrabackup.

Como me gusta trabajar en scripts les comparto un script diseñado por mi para que alivie sus necesidades. Si encuentran algun bug me avisan y recuerden que deben ajustarlo a sus necesidades, aún voy a liberar una nueva versión donde pregunte si el respaldo es nfs o no, si lo es, que se pase por parámetro el ip remoto, por ahora es estático y se debe comentar la parte donde se monta el nfs remoto en caso de no tener uno:

#!/bin/bash

Scripts_path="/Scripts"

femail="webmaster@dominio.ejemplo.test"
temail="soporte@dominio.ejemplo.test" 

#Aqui va el ip del servidor nfs donde se ha de montar el respaldo
ipnfs="192.168.1.20"

dest="/backup"

host="localhost"
port=3306
user="backup"
password="U2FsdGVkX18WWIZ2IUg2hs+E8UWC82jp9jml40ruOJM="

hostname=$(hostname)
tool_mode="xtrabackup"

error_log=/var/log/$(echo $tool_mode)-backupm.log
lock_file=/tmp/$(echo $tool_mode)-backupm.lck

main_path="$dest/$hostname/$tool_mode"

last_full_backup="$main_path/last_full_backup.txt"
incremental_reg_backup="$main_path/incremental_reg_backup.txt"

history_full_backup="$main_path/history_full_backup.txt"
history_incremental_reg_backup="$main_path/history_incremental_reg_backup.txt"

function montar(){
  montado=$(cat /etc/mtab | grep backup | wc -l)
  if let "montado==0";then
    echo "Mounting $ipnfs:/nfs/dbserver on $dest" >> $error_log 2>&1
    mount -t nfs $ipnfs:/nfs/dbserver $dest
  fi
}
function desmontar(){
  montado=$(cat /etc/mtab | grep backup | wc -l)
  if let "montado==1";then
    echo "Unmounting $ipnfs:/nfs/dbserver on $dest" >> $error_log 2>&1
    umount $dest
  fi
}

function chk_files(){
  if [[ ! -d $main_path ]];then
    mkdir -pv $main_path >> $error_log 2>&1
  fi
  if [[ ! -f $last_full_backup ]];then
    echo "Creating $last_full_backup" >> $error_log 2>&1
    > $last_full_backup
  fi
  if [[ ! -f $incremental_reg_backup ]];then
    echo "Creating $incremental_reg_backup" >> $error_log 2>&1
    > $incremental_reg_backup
  fi
}

function do_backup(){

  host=$3
  port=$4
  user=$5
  password=$(echo $6 | openssl enc -aes-128-cbc -a -d -salt -pass pass:wtf)
  
  if [[ ! -f "$lock_file" ]];then
    > $lock_file
  fi

  if [[ "$( cat $lock_file )" != "$(date +%Y%m%d)" ]];then

    ##########################################################
    # Tomamos la fecha y ordenador al que el backup pertenece.

    Yr=$(date +"%Y")
    Mh=$(date +"%m")
    Dy=$(date +"%d")
    day=$(echo "$Yr$Mh$Dy")
    let $folder "folder=(Mh-1)%3"
    echo $day > $lock_file
    echo " day $day --- folder $folder --- month $Mh" >> $error_log 2>&1
    echo "---------------- $(date +"%Y/%m/%d - %H:%M:%S") ----------------" >> $error_log 2>&1

    backup_path="$main_path/monthly/$folder"
    if [[ ! -d $backup_path ]];then
      mkdir -pv $backup_path >> $error_log 2>&1
    fi

    #If force yes then delete
    if [[ "$2" == "1" ]]; then
      if [[ -d $backup_path ]]; then
        rm -rfv $backup_path >> $error_log 2>&1
      fi
    else
      if [[ -d $backup_path ]]; then
        error="La carpeta existe y no se hace nada use la opcion -(f) para forzar el respaldo!\n"
        print "%s" "$error" >> $error_log 2>&1
        print "%s" "$error"
        exit 1
      fi
    fi

    initialt=$(date +"%H:%H:%S")
    if [[ ! -d $dest/files ]];then
      mkdir -pv $dest/files >> $error_log 2>&1
    fi

    echo "---------------- [$day / $initialt] - [Backup of files and Scripts] ----------------" >> $error_log 2>&1

    tar -czpf $dest/files/etc.tar.gz /etc/ >> $error_log 2>&1
    tar -czpf $dest/files/Scripts.tar.gz $Scripts_path >> $error_log 2>&1

    printf "Last Script runned on %d and stored in folder %s\n" "$day" "$backup_path" >> $main_path/date.txt

    echo "---------------- [$day / $initialt] - [Initial Backup] ----------------" >> $error_log 2>&1
    xtrabackup -u $user -p $password --backup --datadir=/var/lib/mysql/ --target-dir=$backup_path >> $error_log 2>&1
    finalt=$(date +"%H:%H:%S")
    echo "---------------- [$day / $finalt] - [Final Backup] ----------------" >> $error_log 2>&1

    cat $last_full_backup >> $history_full_backup
    echo "$day [$initialt - $finalt] | $backup_path" > $last_full_backup

    echo "Cleaning old week backup" >> $error_log 2>&1
    while read weekline;do
      weekfolder=$(echo $weekline | awk '{print $6}' )
      if [ -d $weekfolder ];then
        rm -rfv $weekfolder >> $error_log 2>&1
      fi
    done < $history_incremental_reg_backup

    #Updateing incremental registry
    cat $incremental_reg_backup >> $history_incremental_reg_backup
    > $incremental_reg_backup

    rm $lock_file
  fi
}

> $error_log

option=""
force=1
nfs_option=1

flag1=0
flag2=0

print_usage() {
  backup_path="$main_path/monthly/[0-2]"

  echo "Modo de empleo: $0.sh [-F|--force] [N|--noforce] [-T|--timestamp] [-O|--notimestamp] [-U|--user=\$user] [-P|--port=\$port] [-H|--host=\$host] [-p|--password=\$password] [--no_nfs] [-h|--help]
  Realiza un respaldo completo de la base de datos usando el PATH $backup_path

  Las opciones validas son:
  -F|--force   Forzar la carpeta destino si existe reescribe
  -H|--host=\$host  Nombre del servidor a conectarse para el respaldo (default=dbserver) 
  -N|--noforce   Si la carpeta destino existe no reescribe
  -O|--notimestamp  Escribe directamente en $backup_path sin estampado de tiempo
  -P|--port=\$port  Puerto a conectarse para el respaldo (default=3306)
  -T|--timestamp  Agrega al $backup_path un directorio \$Y-\$m-\$d-\$H-\$M-\$s
  -U|--user=\$user  Usuario con el que se conectara al servidor para hacer el respaldo (default=backup)
  -h|--help   Imprime esta ayuda
  --no_nfs   No intenta montar directorio de respaldo
  -p|--password=\$password Password para la autenticacion.

  Las opciones por defectos son --force y --notimestamp

  OPTIONS: -[F|H|N|O|P|T|U|h|p] 
  " >&2
}
while [[ "$1" != "" ]]; do

  case $1 in
    -F|--force)
      if let "flag1==0";then
        let $force "force=1"
        let $flag1 "flag=1"
      fi
      ;;
    -N|--noforce)
      if let "flag1==0";then
        let $force "force=0"
        let $flag1 "flag=1"
      fi
      ;;
    --no_nfs)
      nfs_option=0
      ;;
    -T|--timestamp)
      if let "flag2==0";then
        option=""
        let $flag2 "flag2=1"
      fi
      ;;
    -O|--notimestamp)
      if let "flag2==0";then
        option="--no-timestamp "
        let $flag2 "flag2=1"
      fi
      ;;
    -U)
      user=$2
      shift
      ;;
    -P)
      port=$2
      shift
      ;;
    -H)
      host=$2
      shift
      ;;
    -p)
      password=$(echo $2 | openssl enc -aes-128-cbc -a -salt -pass pass:wtf)
      shift
      ;;
    --user=*)
      user=$(echo $1 | awk -F= '{print $2}')
      ;;
    --port=*)
      port=$(echo $1 | awk -F= '{print $2}')
      ;;
    --host=*)
      host=$(echo $1 | awk -F= '{print $2}')
      ;;
    --password=*)
      password=$(echo $1 | awk -F= '{print $2}' | openssl enc -aes-128-cbc -a -salt -pass pass:wtf)
      ;;
    -h|\?|--help)
      print_usage
      exit 0
      ;;
    *)
      printf "Comando $1 no reconocido, favor consulte ($0 -h) para ver las opciones aceptadas.\n"
      #print_usage
      exit 1
      ;;
  esac
  shift
done

if [[ "$flag2" == "0" && "$option" == "" ]];then
  option="--no-timestamp"
fi

if let "nfs_option==1";then
  montar
fi
chk_files
do_backup $option $force $host $port $user $password 
#if let "nfs_option==1";then
#  desmontar
#fi

lunes, 9 de noviembre de 2015

Mariadb Galera Cluster y Debian Jessie con systemd

Debian Jessie a cambiado de SysV a Systemd.

Cambios en Jessie
Más información

Esto significa que el método para arrancar el cluster de galera mariadb según la documentación se debe iniciar de la siguiente forma:

# service mysql start --wsrep-new-cluster

Para sistemas systemd:

# systemctl start mysql --wsrep-new-cluster

El problema es que no arrancará con uno ni con el otro, debido a que el nuevo systemd no permite parámetros y el service no manda a cargar /etc/init.d/mysql, por lo tanto la forma rústica e incorrecta es configurar en my.cnf:

wsrep_cluster_address                           = "gcomm://"

Arrancar el servidor y luego modificar nuevamente el my.cnf:

wsrep_cluster_address                           = "gcomm://ip1,ip2,ip3"

Pero esta no es la forma correcta.

La forma correcta es indicar por parámetros la primera vez lo deseado "--wresp-new-cluster" y dejando el wsrep_cluster_address con todos los integrantes.

Lo primero que vamos a hacer es ejecutar el siguiente comando:

# systemctl cat mysql.service

Lo que nos devolverá la siguiente salida:
# /run/systemd/generator.late/mysql.service
# Automatically generated by systemd-sysv-generator

[Unit]
SourcePath=/etc/init.d/mysql
Description=LSB: Start and stop the mysql database server daemon
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target shutdown.target
After=remote-fs.target systemd-journald-dev-log.socket network-online.target nss-lookup.target time-sync.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SysVStartPriority=2
ExecStart=/etc/init.d/mysql start
ExecStop=/etc/init.d/mysql stop
ExecReload=/etc/init.d/mysql reload
Creamos el siguiente archivo que no existe "/etc/systemd/system/mysql.service" agregando el parámetro que deseamos:

[Unit]
SourcePath=/etc/init.d/mysql
Description=LSB: Start and stop the mysql database server daemon
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target shutdown.target
After=remote-fs.target systemd-journald-dev-log.socket network-online.target nss-lookup.target time-sync.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SysVStartPriority=2
ExecStart=/etc/init.d/mysql start --wsrep_new_cluster
#ExecStart=/etc/init.d/mysql start
ExecStop=/etc/init.d/mysql stop
ExecReload=/etc/init.d/mysql reload

Listo, cuando ejecutemos por primera vez pasará por parámetro que debe iniciar el primer miembro del cluster, basta entrer y solo hacer un cambio en los comentarios, si se cae este servidor solo basta hacer un "service mysql restart" y cargará con el gcomm://ip1,ip2,ip3.

Es más sólido modificar solo el parámetro de entrada que tocar el archivo de configuración.

viernes, 26 de septiembre de 2014

Instalando certificados a subdominios

Primero que todo debemos saber que necesitamos un servidor zimbra proxy donde a él le apuntaremos y en el crearemos los certificados de los dominios internos.
# mkdir /opt/zimbra/conf/domaincerts
# cd /opt/zimbra/conf/domaincerts
Para cada dominio colocaremos sus llaves en estos directorios...
  1. dominio.mi.com.key (el key privado)
  2. dominio.mi.com.crt (commercial.crt + intermediates + root_CA) [El orden de estos archivos es bien sensible y puede evitar al servidor que inicie - hay que ser cuidadoso - ver tambien el bug 57271 http://bugzilla.zimbra.com/show_bug.cgi?id=57271 ]
  3. dominio.tu.com.key
  4. dominio.tu.com.crt
  5. ..
... and do the following commands:
  • Revisamos los keys:
# /opt/zimbra/bin/zmcertmgr verifycrt comm ./dominio.mi.com.key ./dominio.mi.com.crt
  • Hacemos el deploy a los certificados:
#  /opt/zimbra/libexec/zmdomaincertmgr deploycrts
  • Guardamos:
# /opt/zimbra/libexec/zmdomaincertmgr savecrt dominio.mi.com dominio.mi.com.crt dominio.mi.com.key
Luego hay que decirle al servidor zimbra como interactuará con el dominio:
zmprov md dominio.mi.com +zimbraVirtualHostName "dominio.mi.com" +zimbraVirtualIPAddress "aaaa.bbbb.cccc.dddd"
Donde el ip "aaaa.bbbb.cccc.dddd" corresponde al ip del servidor proxy.

Aplicando un certificado a zimbra

Casi siempre resulta a veces que algunas versiones presentan el bug de error de certificado y hay que hacerlo manualmente estos serían los pasos para hacerlo desde el cli.
Como root:
# openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr

Luego comprar el certificado con el csr de esto se obtendran dos archivos uno en extension crt para el ejemplo usaremos (server.crt) y otro que dirá bundle:
# cp server.key /opt/zimbra/ssl/zimbra/commercial/commercial.key
# cp server.crt /opt/zimbra/ssl/zimbra/commercial/commercial.crt
# cp server.ca-bundle /opt/zimbra/ssl/zimbra/commercial/commercial_ca.crt
Antes de hacer el deploy debemos verificar los certificados:
# /opt/zimbra/openssl/bin/openssl verify -CAfile commercial_ca.crt commercial.crt

Si este paso falla asegurarse de tener los archivos bundle y el crt completos y correctos.

# /opt/zimbra/bin/zmcertmgr deploycrt comm /opt/zimbra/ssl/zimbra/commercial/commercial.crt /opt/zimbra/ssl/zimbra/commercial/commercial_ca.crt

Ahora solo basta reiniciar
# su - zimbra
$ zmcontrol stop
$ zmcontrol start

jueves, 18 de septiembre de 2014

Recuperando archivos desde linux

TestDisk es un software OpenSource software y esta licenciado bajo los términos de GNU General Public License (GPL v2+).

Esta pequeña herramienta me dejó sorprendido al probarlo, perfectamente recupero 100% de mis datos habiéndolos borrados intencionalmente para probarla.

Hago hincapié que si desean probarla siempre manejen un respaldo. Jamás se arriesguen a probar herramientas de restauración sin haber respaldado primero la información a probar a ser recuperada.

Esta herramienta funciona como todas las herramientas tradicionales de restauración y siempre hay que tener presente la siguiente etiqueta: "¡Jamás, restaures en el mismo disco dañado!" Los archivos encontrados deben de ser restaurados en una partición distinta o un disco duro distinto del que se esta trabajando, por lo tanto se requiere siempre de un disco externo o una partición sana en caso que se halla corrompido una de las particiones.

Pueden existir otras herramientas, espero comentarios si conocen alguna otra herramienta excelente pero esta resultó ser perfecta para lo que necesitaba.

martes, 2 de septiembre de 2014

Fake Raid

Para habilitar el fake raid en Debian GNU/Linux se debe de agregar en el bootloader la opcion dmraid=enable

https://wiki.debian.org/DebianInstaller/SataRaid

Pero al final es más útil y recomendado usar software RAID que el FAKE RAID.

¿Por qué? Si falla el hardware y se mueven los discos, es más fácil y rápido montar un software RAID que un FAKE RAID.

miércoles, 12 de marzo de 2014

Manipulando salidas repetidas del Shell

Alguna vez nos ha pasado que buscamos un error en un log que se repite mas de una vez pero a la vez es variable su contenido, por ejemplo si es correo el error se repite para un mismo correo o mas.

Si deseamos saber las veces totales unicas que el error a aparecido en el servidor es un poco dificil tratar de contarlos, generalmente puede solucionarse con sort y luego con vim eliminar los repetidos de esa salida. Sin embargo es muy rustico.

El comando uniq viene a solventarnos el problema.

Un ejemplo seria lo siguiente:

# grep kernel /var/log/syslog | head -20
Mar 12 08:09:50 myhostname kernel: [345422.277505] hp_wmi: Unknown event_id - 8 - 0x2
Mar 12 10:52:22 myhostname kernel: [355159.298700] CPU2: Core temperature above threshold, cpu clock throttled (total events = 3401)
Mar 12 10:52:22 myhostname kernel: [355159.298705] CPU3: Core temperature above threshold, cpu clock throttled (total events = 3401)
Mar 12 10:52:22 myhostname kernel: [355159.298710] CPU0: Package temperature above threshold, cpu clock throttled (total events = 3464)
Mar 12 10:52:22 myhostname kernel: [355159.298715] CPU1: Package temperature above threshold, cpu clock throttled (total events = 3464)
Mar 12 10:52:22 myhostname kernel: [355159.298720] CPU3: Package temperature above threshold, cpu clock throttled (total events = 3464)
Mar 12 10:52:22 myhostname kernel: [355159.298725] CPU2: Package temperature above threshold, cpu clock throttled (total events = 3464)
Mar 12 10:52:22 myhostname kernel: [355159.299719] CPU0: Package temperature/speed normal
Mar 12 10:52:22 myhostname kernel: [355159.299721] CPU1: Package temperature/speed normal
Mar 12 10:52:22 myhostname kernel: [355159.299725] CPU3: Core temperature/speed normal
Mar 12 10:52:22 myhostname kernel: [355159.299728] CPU2: Core temperature/speed normal
Mar 12 10:52:22 myhostname kernel: [355159.299731] CPU3: Package temperature/speed normal
Mar 12 10:52:22 myhostname kernel: [355159.299734] CPU2: Package temperature/speed normal
Mar 12 10:54:14 myhostname kernel: [355271.844634] [Hardware Error]: Machine check events logged
Mar 12 10:57:43 myhostname kernel: [355480.139160] CPU3: Core temperature above threshold, cpu clock throttled (total events = 3481)
Mar 12 10:57:43 myhostname kernel: [355480.139165] CPU2: Core temperature above threshold, cpu clock throttled (total events = 3481)
Mar 12 10:57:43 myhostname kernel: [355480.139170] CPU1: Package temperature above threshold, cpu clock throttled (total events = 3544)
Mar 12 10:57:43 myhostname kernel: [355480.139176] CPU0: Package temperature above threshold, cpu clock throttled (total events = 3544)
Mar 12 10:57:43 myhostname kernel: [355480.139180] CPU2: Package temperature above threshold, cpu clock throttled (total events = 3544)
Mar 12 10:57:43 myhostname kernel: [355480.139185] CPU3: Package temperature above threshold, cpu clock throttled (total events = 3544)

El problema es que los 6 primeros campos nos son inutiles por lo tanto tendremos que eliminarlos, transformando la consulta a algo mas util:

# grep kernel /var/log/syslog | awk -F"] " '{print $2}'| head -20
hp_wmi: Unknown event_id - 8 - 0x2
CPU2: Core temperature above threshold, cpu clock throttled (total events = 3401)
CPU3: Core temperature above threshold, cpu clock throttled (total events = 3401)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU3: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU2: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU0: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU3: Core temperature/speed normal
CPU2: Core temperature/speed normal
CPU3: Package temperature/speed normal
CPU2: Package temperature/speed normal
[Hardware Error]: Machine check events logged
CPU3: Core temperature above threshold, cpu clock throttled (total events = 3481)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 3481)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 3544)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 3544)
CPU2: Package temperature above threshold, cpu clock throttled (total events = 3544)
CPU3: Package temperature above threshold, cpu clock throttled (total events = 3544)

Agregando el comando sort ordenamos todas las salidas y como veremos es mas sencillo encontrar unificados los problemas y nuestra tarea seria descartar los repetidos:

# grep kernel /var/log/syslog | awk -F"] " '{print $2}'| sort | head -40
CPU0: Package temperature above threshold, cpu clock throttled (total events = 12688)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 12689)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 29267)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 3544)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 4977)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 6992)
CPU0: Package temperature above threshold, cpu clock throttled (total events = 8079)
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU0: Package temperature/speed normal
CPU1: Package temperature above threshold, cpu clock throttled (total events = 12688)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 12689)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 29267)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 3464)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 3544)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 4977)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 6992)
CPU1: Package temperature above threshold, cpu clock throttled (total events = 8079)
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU1: Package temperature/speed normal
CPU2: Core temperature above threshold, cpu clock throttled (total events = 12160)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 12161)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 26206)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 3401)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 3481)
CPU2: Core temperature above threshold, cpu clock throttled (total events = 4571)


Para facilitar la tarea usaremos el comando uniq a la salida:

# grep kernel /var/log/syslog | awk -F"] " '{print $2}'| sort | head -40 | uniq -c
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 12688)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 12689)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 29267)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 3464)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 3544)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 4977)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 6992)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 8079)
      9 CPU0: Package temperature/speed normal
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 12688)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 12689)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 29267)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 3464)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 3544)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 4977)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 6992)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 8079)
      9 CPU1: Package temperature/speed normal
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 12160)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 12161)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 26206)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 3401)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 3481)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 4571)

Como vemos ahora es mas sencillo observar los errores, para nuestro ejemplo unifique la salida de los primeros 40, pero tambien podemos unificar la salida de todo el registro y luego mostrar los primeros 40 resultados, veremos que la salida varia un poco y es mas agradable:

# grep kernel /var/log/syslog | awk -F"] " '{print $2}'| sort | uniq -c | head -40
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 12688)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 12689)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 29267)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 3464)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 3544)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 4977)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 6992)
      1 CPU0: Package temperature above threshold, cpu clock throttled (total events = 8079)
      9 CPU0: Package temperature/speed normal
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 12688)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 12689)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 29267)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 3464)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 3544)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 4977)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 6992)
      1 CPU1: Package temperature above threshold, cpu clock throttled (total events = 8079)
      9 CPU1: Package temperature/speed normal
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 12160)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 12161)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 26206)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 3401)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 3481)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 4571)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 6563)
      1 CPU2: Core temperature above threshold, cpu clock throttled (total events = 7636)
      9 CPU2: Core temperature/speed normal
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 12688)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 12689)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 29267)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 3464)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 3544)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 4977)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 6992)
      1 CPU2: Package temperature above threshold, cpu clock throttled (total events = 8079)
      9 CPU2: Package temperature/speed normal
      1 CPU3: Core temperature above threshold, cpu clock throttled (total events = 12160)
      1 CPU3: Core temperature above threshold, cpu clock throttled (total events = 12161)
      1 CPU3: Core temperature above threshold, cpu clock throttled (total events = 26206)
      1 CPU3: Core temperature above threshold, cpu clock throttled (total events = 3401)



lunes, 10 de marzo de 2014

Reiniciando el ratón

Si alguna vez por minutos el sistema bloquea el raton o el ratón se freeza y todo sigue funcionando bien la solución es reiniciar el modulo del ratón:

rmmod psmouse
modprobe psmouse

miércoles, 7 de agosto de 2013

Compilando kernel al modo debian

Siempre nos topamos con la pared que muchos temen al momento de escuchar "vamos a compilar el kernel", debian permite compilarlo de una forma sencilla y ajustado al mismo.

Instalar paquetes necesarios:

apt-get install build-essential fakeroot ncurses-dev kernel-package bc

1) Bajar el kernel a compilar
Suponiendo que hemos bajado la version 3.8.2, actualmete la version estable es la 3.10.5, tambien lo he probado con esta última, pero por ahora veamos con la primera.
cd /usr/src
wget -dc https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.2.tar.gz
tar -xzpf linux-3.8.2.tar.gz
ln -s /usr/src/linux-3.8.2 /usr/src/linux
cd linux

2) Preparamos el kernel
make dep
make-kpkg clean

3) El siguiente paso es elegir las opciones:
make menuconfig
Aqui agregamos y quitamos lo que no necesitamos.

4) Creamos el paquete .deb
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Tiempo estimado:
real    84m34.915s
user    58m5.118s
sys     14m48.043s

5) En caso de algun error en el paso anterior, caso contrario proceda con el paso (6)
make clean
Y volvemos desde el paso (2)

6) Instalamos los .deb
cd ..
dpkg -i linux-image-3.8.2-*.deb linux-headers-3.8.2-*.deb

Listo ahora tendremos un kernel compilado a la forma debian.

http://www.debian.org/releases/stable/amd64/ch08s06.html.en
http://www.debian.org/releases/stable/i386/ch08s06.html.en

https://www.kernel.org/

jueves, 13 de junio de 2013

Fecha de creación de un fichero

Sobre este tema muy poco se encuentra al respecto y siempre encuentras al menso que dice que no se puede.

Luego de buscar encontre lo siguiente, no es linux el que almacena el tiempo sino el filesystem y para encontrar esta informacion hay que realizar lo siguiente:

debugfs -R 'stat /home/renich' /dev/mapper/VolGroup-lv_root

Es decir la sintaxis sería:

debugfs -R 'stat /$path/$to/$file_$dir' /dev/$partition

Y con esto obtenemos la informacion necesaria. 

miércoles, 12 de junio de 2013

Listado distros debian

¿Alguna vez haz deseado o necesitado una version anterior de debian?

Aqui la url para descargar las siguientes distros:
  • 3.0_r0 to 3.0_r6 (Woody)
  • 3.1_r0 to 3.1_r8 (Sarge)
  • 4.0_r0 to 4.0_r9 (Etch)
  • 5.0.0 to 5.0.10 (Lenny)
  • 6.0.0 to 6.0.10 (Squeeze)
  • 7.0.0 to 7.11.0 (Wheezy)
  • 8.0.0 to 8.11.0 (Jessie)
  • 8.11.1 (Jessie LTS, for some arches only)
  • 9.0.0 to 9.13.0 (Stretch)
  • 10.0.0 to ... (Buster)
  • 11.0.0 to ... (Bullseye)
http://cdimage.debian.org/cdimage/archive/

En mi caso necesito lenny y squeeze.