Recuperar ficheros borrados de un sistema de ficheros ext3 ext4

Lo primero, detener todas las posibles escrituras.

Reiniciar con un Live CD, por ejemplo el estupendo Kali Linux (que además incluye extundelete).

Hacer una imagen de la partición (o volumen) de la que se quieren recuperar los datos. La imagen se puede guardar en otra partición, en un disco externo, en otro ordenador…

Después, se puede pasar a intentar recuperar los ficheros a partir de la imagen, con herramientas como extundelete:

extundelete --recover-all imagen.img

extundelete ofrece opciones para concretar el qué intentar recuperar (y así ahorrar algo de tiempo)

Obviamente, lo suyo es recuperar de una copia de seguridad (backup), pero no siempre es posible…

Ampliar disco fijo NTFS en Virtualbox

Virtualbox permite ampliar más o menos fácilmente un disco cuando es de tipo “dinámico” (el cual crece según va haciendo falta)

Cuando el disco es de tamaño fijo, la cosa se complica un poco. Una posible receta es:

  1. Crear un nuevo disco en Virtualbox del tamaño deseado
  2. Clonar el disco antiguo en el disco nuevo usando Clonezilla
  3. Desconectar el disco antiguo de la máquina virtual
  4. Ampliar el tamaño de la partición NTFS con GParted
  5. Hacer un chequeo del sistema de ficheros ampliado (si es la partición de Windows, se hace automáticamente al arrancar)

git

# git notes - http://git-scm.com/docs/git-notes
# Anotar un commit 
git notes add -m 'Anotación extra' 72a144e2
# listado de anotaciones
git notes list
# añadir sólo un subconjunto de los últimos cambios -> modo interactivo
# esta variante de add funciona con menus. Vamos escogiendo con la opcion "patch" y cuando terminamos salimos con "quit"
git add -i 

# comparar dos ramas (si la rama es remota, puede hacer falta usar la ruta, origin/ramaX)
# La comparación puede servir como "vista previa" de un merge
git diff rama1..rama2
# si estamos en rama1, se puede omitir:
git diff ..OTRA_RAMA
# También se puede usar un hash para elegir con qué commit comparar

# Excluir del repositorio los ficheros de backup de emacs
# Añadir a .gitignore
*~
.#*

# Registrar cambios: add+commit
# Incluir fichero f
git add f
git commit -m "Consecuencia de aplicar los cambios"
# (una vez en el repositorio, se puede incluir automaticamente todos los ficheros con la opción -a de commit)
# Cambiar el mensaje del ultimo commit
git commit --amend

# deshacer add
git rm --cached
# "Deshacer" ultimo commit
git reset --soft HEAD~1

# Publicar cambios
# normalmente, "donde" es origin, y "rama" es master
git push donde rama

# Descargar cambios (fetch + merge)
git pull 

# Mostrar cambios en un commit
# (con -w ignora cambios solo en espacios en blanco,
# y con --word-diff solo muestra cambios en palabras,
# en lugar de líneas enteras)
git diff COMMIT^ COMMIT


# Mostrar ficheros de un commit:
git show --name-only -r commit_id
git ls-tree --name-only -r commit_id
# Ficheros modificados...
# ...desde ultimo commit
git status
# ...en los ultimos commit
git diff-tree -r commit_id

# Informe de cambios
git log
# ...en una linea
git log --pretty=oneline
# ... para un fichero
git log --follow -p FILE

# Restablecer un fichero...
# ... a la última "versión"
git checkout f
# ...a la versión del commit hash
git checkout hash f

# RAMAS
# cambiar a rama r3
git checkout r3
# crear rama r4 a partir de r3
git checkout -b r4
# fusionar rama r2 con actual
git merge r2

# aplicar un commit de otra rama a la rama actual
git cherry-pick COMMIT

# copiar un fichero de otra rama
git checkout otra_rama fichero.py

# Etiquetas: Versiones / Releases
git tag -a v1.0 -m "Release 1.0"
git push origin v1.0

Hooks

La base para publicar sitios web usando git (ver git website howto)

# En el servidor, editar hooks/post-receive 
# (asegurarse de que tiene permiso de ejecucion...)
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f

Como siempre, para hacer push hay que añadir el origen remoto (en este caso, el servidor web)

Chuletas: SphereDev, Seth Robertson, Publicar una web usando Git, Little things I like to do with git

Gestión de recursos en Debian

Una forma sencilla de controlar el uso de recursos es con ulimit o pam_limits (en /etc/security/limits.conf, y los servicios de /etc/pam.d pertinentes)

Si queremos gestionar recursos como el tráfico de red, los dispositivos o la entrada/salida; o necesitamos flexibilidad para afinar a qué procesos aplicar restricciones, podemos recurrir a los grupos de control (cgroups)

Las opciones con cgroups son múltiples (ver documentación al final). Una de ellas es asignar las restricciones por usuarios / grupos (en la tradición pam). Para ello, los pasos a seguir son:

  1. Instalar los paquetes de cgroups+pam. En Debian, cgroup-bin y libpam-cgroup
  2. Si vamos a usar el controlador de memoria, habilitarlo en grub: añadir “cgroup_enable=memory swapaccount=1” a GRUB_CMDLINE_LINUX_DEFAULT en /etc/default/grub, ejecutar update-grup y reiniciar
  3. Definir los grupos en /etc/cgconfig.conf:
    # Ejemplo sencillo: el grupo common_mem_pool solo puede usar 192GB de RAM.
    # Si un proceso del grupo se encuentra se recursos, se queda en pausa
    # (en lugar de recurrir al OOM killer)
    # Es importante limitar también el swap, ya que si no los procesos empiezan a tirar de él
    # cuando copan la RAM delimitada...
    group common_mem_pool {
            memory {
                   memory.oom_control = 1;
                   memory.limit_in_bytes = 210G;
                   memory.memsw.limit_in_bytes = 210G;
            }
    }
    
  4. Incorporar los cambios de cgconfig.conf con
    cgconfigparser -l /etc/cgconfig.conf
    

    Para configurar la ejecución automática de cgconfigparser durante el arranque, podemos añadir la línea anterior a /etc/rc.local

  5. Probar las definiciones con cgexec (y un programa adecuado, que intente sobrepar las limitaciones):
    cgexec -g memory:common_mem_pool mem_eater
    
  6. Definir las reglas de asignación de grupos en /etc/cgrules.conf:
    # Sintaxis:
    # usuario:nombre_proceso controlador grupo
    # Si el grupo de control no está definido en cgconfig, pam se quejará con algo tipo
    # "cannot make/remove an entry for the specified session"
    
    # Aplicar al usuario alex y al grupo devel las restricciones de common_mem_pool
    alex        memory          common_mem_pool
    @devel        memory          common_mem_pool
    
  7. Habilitar pam-cgroup en los ambitos pertinentes. Por ejemplo, si los usuarios acceden por ssh, en /etc/pam.d/sshd:
    session    required   pam_cgroup.so
    

    (otras posibilidades interesantes son /etc/pam.d/su y /etc/pam.d/sudo)

  8. Configurar el montaje del sistema de ficheros /sys/fs/cgroup. Si tenemos instalado Docker en el sistema, /etc/init.d/docker ya se encarga de montarlo. Si no, lo más sencillo es añadir a cgconfig.conf algo tipo…
    # Si ya está montado, cgconfigparser da un error (tipo "request came in from non owner").
    # En cuyo caso, lo más simple es comentar esta sección
    mount {
            cpu = /sys/fs/cgroup;
            memory = /sys/fs/cgroup;
            cpuacct = /sys/fs/cgroup;
    }
    

Para obtener información relacionada con cgroups, disponemos de los siguientes comandos:

# ver grupos de control de los procesos
ps -O cgroup
# grupos disponibles
cat /proc/cgroups
lscgroup
# informacion sobre un grupo en particular
cgget common_mem_pool

Los controladores a priori más apetecibles son cpu, memory (ver ejemplo más arriba) y blkio:

  • cpu.shares: porcentaje de CPU para el grupo
  • blkio.weight: porcentaje de E/S para el grupo
  • blkio.throttle.read_bps_device, blkio.throttle.read_iops_device, blkio.throttle.write_bps_device, blkio.throttle.write_iops_device: límite de velocidad (en bytes por segundo) en acceso a un dispositivo

Para adaptar el funcionamiento del OOM killer, podemos modificar indirectamente oom_score ajustando el parametro oom_adj de los procesos (-17 si queremos apartar al proceso de la mira de OOM, -16 si queremos que su muerte sea muy poco probable, 15 si muy probable). Ruth (root) juega con ventaja, por defecto a sus procesos se les reduce su probabilidad de ser exterminados por OOM.

Para saber más…

cgroups:

Memoria:

Cuotas XFS

Una de las ventajas del sistema de ficheros XFS es que permite establecer cuotas de disco por directorio (“proyecto”, en terminología XFS). A continuación la chuleta para ello.

Montar el sistema de ficheros con las opciones de quotas (previsoramente añadiendolas a fstab):

# habilitar quotas de usuario y de proyecto
/dev/sdd3 /mnt/projects xfs defaults,uquota,pquota 0 3

Después, para cada proyecto seguir este protocolo:

# vincular el id de proyecto (100) con su directorio (p1)
echo 100:/mnt/projects/p1 >> /etc/projects
# asociar el nombre del proyecto (project1) al id
echo project1:100 >> /etc/projid
# habilitar la quota para el proyecto
xfs_quota -xc 'project -s project1' /mnt/projects
# limitar el proyecto a 20 GB
xfs_quota -xc 'limit -p bhard=20g project1' /mnt/projects
# informe de las quotas del sistema de ficheros (/mnt/projects)
xfs_quota -xc 'report -p' /mnt/projects

Obviamente, con XFS también se pueden hacer operaciones más “básicas”:

# informe de las cuotas, por usuario 
xfs_quota -xc report /mnt/projects
# definir una cuota de 500GB para "joe"
xfs_quota -xc 'limit bsoft=490g bhard=500g joe' /mnt/projects
# desactivar las cuotas para "joe"
xfs_quota -xc 'limit bsoft=0 bhard=0 joe' /mnt/projects

Gestionar discos controladora LSI en sistema operativo

A veces resulta más práctico gestionar los discos conectados a una controladora RAID desde el sistema operativo. Si la BIOS no ofrece esa posibilidad, se puede buscar la manera de hacerlo en la propia controladora.

La interfaz grafica de LSI WebBIOS (Control-H) puede resultar limitada. Aunque no sea cómoda de usar, la linea de comandos “preboot CLI” (Control-Y) ofrece bastantes opciones. Los comandos son esencialmente los mismos de MegaCLI, con pequeñas diferencias sintácticas. La más importante es que cada guión es necesario (incluido el que va delante de cada comando)

# -a hace referencia al adaptador. Normalmente se puede usar el 0 (-a0)
# -page activa la paginación. En los siguientes ejemplos solo se incluye donde puede hacer falta
#   (salidas multipágina)
# ayuda
-h -a0 -page

# Comprobar si JBOD esta habilitado
-AdpGetProp -EnableJBOD -aALL

# Habilitar JBOD
-AdpSetProp -EnableJBOD -1 -aALL

# Listado de discos. Anotar los números de cabina (enclosure) y ranura (slot) de cada disco, para sucesivos comandos
-PDList -aALL -page

# Habilitar discos (si no se encuentran en estado "Unconfigured-Good"
-PDMakeGood -PhysDrv[Cabina:Ranura,...] -a0

# Configurar los discos como JBOD. Si JBOD no está soportado, aparece el mensaje "Failed to change PD state (...) Exit code 0x1"
-PDMakeJBOD -PhysDrv[Cabina:Ranura,...] -a0

# Crear un "RAID-0 de un solo disco"
-CfgLdAdd r0[Cabina:Ranura] -a0

# Comprobar que se ha creado correctamente
-CfgDsply -a0 -page

Estos comandos también se pueden ejecutar con la herramienta megacli.

Más info:

LSI MegaRAID en le-vert.net

MegaCli en Linux RAID Wiki

Cambiar tamaño sistema de ficheros

Probablemente la forma más fácil sea utilizando la herramienta gparted.

Alternativamente, también se puede hacer paso a paso.

Primero hay que ajustar el tamaño del sistema de ficheros en sí:

e2fsck -f RUTA_DISPOSITIVO
resize2fs RUTA_DISPOSITIVO NUEVO_TAMAÑO

Después hay que hacer lo mismo con el soporte del sistema de ficheros. Si es una partición MBR:

  1. Anotar parámetros de la partición (fdisk -l)
  2. Borrar partición
  3. Crearla con el mismo sector de inicio, pero con el nuevo tamaño

Si es un volumen, basta con ejecutar

lvresize -L NUEVO_TAMAÑO RUTA_DISPOSITIVO

Interfaces de red

El kernel de Linux permite agregar varios enlaces de red (módulo bonding). Esta idea ya venía recogida en los estándares IEEE (802.3ad, 802.1AX), que incluyen el protocolo LACP (Link Aggregation Control Protocol).

El módulo soporta varios modos:

  • Switch único: balance-rr (Round Robin), 8023ad (LACP)
  • Multiswitch: active-backup, , balance-tlb y balance-alb (equilibrio de carga)

Generalmente, los modos balance-rr y lacp necesitan ser configurados también en el propio switch.

Configuración bonding en Red Hat / CentOS

El estándar IEEE 802.1q define las VLAN (redes de área local virtuales).

El soporte VLAN en Linux lo gestiona el módulo 8021q

Configuración VLAN en interfaz de red (Red Hat / CentOS), Configuración VLAN en bonding para Red Hat / CentOS

Referencia emacs

  • Cancelar comando: C-g
  • Deshacer: C– (M-x revert-buffer vuelve al ultimo (auto)guardado)
  • Rehacer: C-g C-x u (en teoria, tambien C-g C–)
  • Salir: C-x C-c

Ayuda

  • M-x apropos
  • Lista comandos (modo actual): M-x describe-mode

Desplazamiento

  • Ir a linea: M-g g #linea

Autocompletar: M-tab

Buscar / reemplazar

  • Buscar: C-s (adelante), C-r (atras) (repetir pulsacion para encontrar siguiente ocurrencia)
  • Reemplazar: M-% (usar y/n o ! en cada sustitución)
  • Buscar en ficheros: M-x [lgrep / rgrep / grep]

Ficheros

  • Guardar: C-x C-s

Regiones

  • Seleccionar todo el buffer: C-x h
  • Cortar: C-w
  • Copiar: M-w
  • Pegar: C-y

Buffers

  • Listado (“Buffer List”): C-x C-b
    • Marcar buffer para eliminar del listado: d
    • Marcar buffer para guardar: s
    • Completar operaciones pendientes: x
  • Cambio: C-x b
  • Cerrar: C-x k

Ventanas

  • Partir vertical: C-x 3
  • Partir horizontal: C-x 2
  • Cerrar: C-x 0
  • Cerrar todas las demás: C-x 1
  • Cambiar: C-x o

Modos

  • Cambiar: M-x nombre_modo

Código

  • Indentar: C-M-\ (o M-x indent-region)
  • Compilar: C-c C-u
  • Enviar a REPL: C-c C-j (linea), C-c C-r (region)
  • Etiquetas (tags)
    • Completar: M-tab

Ejecutar

  • Ejecutar comando: M-!
  • Abrir ELISP REPL: M-x ielm

Javascript: M-x js-mode

  • M-.: ir a símbolo (función)
  • Autocompletar: Setup Tern + Company-mode
  • Navegar funciones: xref-js2

Personalización simple: M-x customize

Guardar estado: cambiar desktop-save-mode a 1. Por defecto, debería usar el fichero .emacs-desktop del directorio actual (con lo cual basta cambiar de directorio para usar varios escritorios), pero parece que si no se define el path explicitamente no lo reconoce. Así pues, en ~/.emacs:

(setq desktop-path ‘(“./”))

Otra forma de usar rápidamente varios escritorios es con los “marcadores de escritorio

Dired, ImageDired

Orgmode (Manual, cheatsheet):

  • Despliegue nodos: Tab
  • Añadir nodo en mismo nivel: M-enter
  • Mover nodos: M-cursor (izquierda-derecha, arriba-abajo)
  • Crear enlace a fichero: C-u C-c C-l (se pueden incluir búsquedas en ficheros: [[file:~/ejemplo::/regexp]])
  • Abrir enlace: C-c C-o
  • Editar enlace: C-c C-l
  • Buscar en fichero actual: C-c /
  • Etiquetas: C-c C-q
  • Cambiar estado tarea: C-c C-t
  • Marcar checkbox: C-c C-c
  • Marcar checkbox en linea: C-c C-x C-b
  • Agenda: M-x org-agenda (normalmente se personaliza como C-c a)
    • Clock in: C-c C-x tab
    • Clock out: C-c C-x C-o
    • Informe: C-c C-x C-r
  • Búsqueda en agenda: C-c a / (texto libre), C-c a m (etiquetas). Permite expresiones como “+computer +wifi -ethernet -{8\.11[bg]}”
  • Babel
  • Capture
  • Tablas
    • Crear con “|”
    • Cambiar de campo, evaluar formula: tab
    • Fórmula en un campo: “:= …”
    • Recalcular tabla entera: C-u C-c C-c
  • Orgprotocol
  • Convertir a blog, Convertir con Jekyll (Octopress)

Pendientes de clasificación

Cambiar variable: M-x set-variable
Insertar caracter arbitrario: C-q caracter
Mostrar parentesis: M-x show-paren-mode (o  (show-paren-mode 1) en .emacs)
Repetir comando: C-x z (cada z vuelve a repetir)

* Edición
Cambiar mayusculas / minusculas: M-u (mayusculas), M-l (minusculas), M-c (inicial a mayuscula). Regiones: C-x C-l, C-x C-u
Unir linea actual con anterior: M-^ (puede ser necesario pulsar dos veces "^")
Nueva linea indentada: C-j
Nueva linea comentada: M-j

* UTF / Unicode
C-x 8 Enter Point/Name

* Macros de teclado
Comenzar grabación: C-x (
Terminar: C-x )
Ejecutar: C-x e e e e...

“Extensiones” interesantes

html-mode

C-c 1..5 insertar h1..h5
C-c / insertar etiqueta de cierre
C-c izq / dcha Desplazarse a la etiqueta correspondiente

GPFS

Sistema de ficheros paralelo de alto rendimiento creado por IBM

Cuotas

# Cuota por defecto
mmdefedquota -u fs0

# Cambiar cuota usuarios
mmedquota -u jcuenca

# Mostrar cuota
mmlsquota

# "Informes"
mmrepquota -u -v -a
mmrepquota -g -v -a

Resolución de problemas

Algunos comandos de gpfs usan una shell distribuida (rsh por defecto). Para aprovechar ssh, configurar así:

mmfsadm dump cfgmgr | awk '/ up / {print $3} /\(cluster/ {exit} /Current clock/ {exit} ' > /tmp/wcoll
export WCOLL=/tmp/wcoll
export GPFS_rshPath=/usr/bin/ssh 
# Test mmdsh date

Comandos útiles GPFS

# inodos disponibles
mmdf /dev/fs1

# aumentar número de inodos máximo
mmchfs /dev/fs1 -F XX 

# informacion detallada (por ejemplo, estado de los hilos para comprobar si hay hilos colgado)
mmfsadm dump all

# reiniciar demonio GPFS, "revocando" cualquier token I/O que tuviese
mmfsadm cleanup

# sólo en casos extremos
mmfsck

Chuleta PostgreSQL

\list (show databases)
\du (show users)
\connect db
\dt (show tables)

Create user
From shell (user postgres): createuser username
From psql: create role

Delete user
Shell: dropuser
psql: drop role

Change password

ALTER USER xx WITH PASSWORD ‘zzzzzzzzzzzzzzz’;

Arranque en Debian (cada línea llama a la siguiente, hasta llegar a la ultima que es el comando que realmente se ejecuta)

/etc/init.d/postgresql start

pg_ctlcluster 9.0 main start

/usr/lib/postgresql/9.0/bin/pg_ctl start -D /var/lib/postgresql/9.0/main -s -o -c /etc/postgresql/9.0/main/postgresql.conf

/usr/lib/postgresql/9.0/bin/postgres -D /var/lib/postgresql/9.0/main -c config_file=/etc/postgresql/9.0/main/postgresql.conf

Normalmente, postgres escribe los logs a stderr, y redirige stderr a los ficheros de log (/var/log/postgresql/postgresql-9.0-main.log)

Pero en ocasiones (por ejemplo, los permisos del directorio /var/lib/postgresql/9.0/main/ no son 700) no llega a escribir en el log. En estos casos puede resultar util ejecutar postgres directamente

Chuleta Conkeror

  • Ctl-X Ctl-C salir
  • ; elegir en que marco centrar el foco
  • Ctl-x Ctl-f : abrir nuevo buffer
  • Alt-n / Alt-p : desplazamiento entre buffers
  • q cerrar buffer
  • Espacio / Retroceso: desplazamiento página a página
  • f ir a. Luego, enter: en el mismo buffer. Alt-enter: solo mover el foco. Ctl-enter: abrir en otro buffer
  • **c Copiar texto
  • F / B : adelante / atrás (histórico páginas)
  • b crear marcador
  • Ctl-s : buscar

Exim

En /etc/aliases se pueden usar pipes para redirigir el correo a scripts. Esto est desactivado en Exim, para activarlo hay que definir la variable SYSTEM_ALIASES_PIPE_TRANSPORT = address_pipe en /etc/exim4/conf.d/main/02_exim4-config_options (si se usa los ficheros de configuracion “split”)

Con dpkg-reconfigure exim4-config se hace la configuración básica de Exim, que incluye los cambios manuales incluidos en el fichero /etc/exim4/update-exim4.conf.conf

En modo smarthost, exim usa otro servidor SMTP para reenviar los mensajes que no pertenecen a su propio dominio. El dominio propio se define como

Probar ruta de envio (router / transport): exim4 -bt direccion_email

Comandos útiles

mailq
# Forzar proceso cola mensajes
runq 
exim4 -Mrm id_mensaje_a_borrar_de_cola
exim4 -M id_mensaje_a_forzar_envio
# Reintentar envio de todos los mensajes pendientes, incluidos los congelados
exim4 -qff

Listas de correo

# Restricted mailing lists - only members of valid can send email
# Open mail lists are handled through system aliases (/etc/aliases)
lists:
        driver = redirect
        file = /etc/mail/lists/$local_part
        no_check_local_user
        forbid_pipe
        forbid_file
        senders = lsearch;/etc/mail/valid
        errors_to = root

La direccion lista@domino se asocia a las direcciones del fichero /etc/mail/lists/lista. Solo se aceptan correos cuyos remitentes están en la lista /etc/mail/valid (que contiene direcciones completas user@dominio). Si el fichero lista no existe o el remitente no está en valid, se rechaza el envio con este director y se pasa a los siguientes. Si ninguno acepta la dirección se rechaza el envio con el error “User unknown”

Envio de correos desde la linea de comandos

Crear un fichero (testmail) con el mensaje:

From: Jesus Cuenca
To: jcuenca@xxxxxxxx
Subject: Test
Test

Enviarlo con el comando

/usr/sbin/exim -oi -t < testmail

Problemas típicos

“Mailing to remote domains not supported”: servidor tipo localhost only, intento de enviar mensajes a otros hosts. O servidor tipo internet que escucha solo en 127.0.0.1

# Tracear que directores/drivers y filtros se usan para una cierta direcciónn (-f sirve para especificar el From que se usará en la prueba)
exim -d+all -f jcuenca -bt address
# Desbloquear mensajes de la cola; con -Mrm los borra
mailq | grep frozen | awk '{print $3}' | while read m; do exim4 -M ${m}; done
# Forzar envio de todos los mensajes, incluidos los bloqueados
exim4 -qff

Gestión de paquetes

Accion Debian Arch RedHat Gentoo Suse
Buscar apt-cache search pacman -Ss rpm -q / yum search emerge –search zypper search
Buscar versiones yum list PKG equery list -po PKG
Instalar apt-get install pacman -S rpm -i / yum install emerge
Instalar version emerge -av =CAT/PKG-VERS
Actualizar indices apt-get update pacman -Sy emerge –sync
Actualizar todo apt-get upgrade pacman -Su yum update emerge –update –deep @world && etc-update && emerge –depclean
Paquetes instalados dpkg -l pacman -Q rpm -qa equery list “*”
Ficheros paquete dpkg -L pacman -Ql equery f
Paquete provides dpkg -S file
Desinstalar apt-get remove / purge yum remove emerge –unmerge (no comprueba dependencias!)
Reinstalar apt-get install PKG –reinstall