Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Resizing LVMs

I was deploying a VM and I needed more space for /.
So first I turned off the machine and modified the machine.ovf file to increase de size of the hard disk:
From

<Disk ovf:capacity="8589934592" ovf:diskId="vmdisk2" ovf:fileRef="file1"…

To

<Disk ovf:capacity="28589934592" ovf:diskId="vmdisk2" ovf:fileRef="file1"…

Then I started the VM to expand the fs
Initial situation (take a look at /)

root@machine:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0       7.2G  5.7G  1.2G  84% /
udev             10M     0   10M   0% /dev
tmpfs           403M  5.5M  397M   2% /run
tmpfs          1006M     0 1006M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs          1006M     0 1006M   0% /sys/fs/cgroup
/dev/sda1       236M   33M  191M  15% /boot

Physical Volumes

root@machine:~# pvs
  PV         VG               Fmt  Attr PSize  PFree
  /dev/sda5  debian-jessie-vg lvm2 a--  26.38g 18.62g

Virtual Groups

root@machine:~# vgs
  VG               #PV #LV #SN Attr   VSize  VFree
  debian-jessie-vg   1   2   0 wz--n- 26.38g 18.62g

Logical Volumes

root@machine:~# lvs
  LV     VG               Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   debian-jessie-vg -wi-ao----   7.39g
  swap_1 debian-jessie-vg -wi-ao---- 376.00m

So I have one PV with 18 free GB (that’s thanks to the machine.ovf modification), one VG and two LVS. The one I want to increase is “root”.
Just a last check:

root@machine:~# pvscan
  PV /dev/sda5   VG debian-jessie-vg   lvm2 [26.38 GiB / 18.62 GiB free]
  Total: 1 [26.38 GiB] / in use: 1 [26.38 GiB] / in no VG: 0 [0   ]
root@machine:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/debian-jessie-vg/root
  LV Name                root
  VG Name                debian-jessie-vg
  LV UUID                OdIAov-a7qm-ThOR-58YP-D7FG-zq5n-r73dUq
  LV Write Access        read/write
  LV Creation host, time debian-jessie, 2015-04-27 10:42:28 +0200
  LV Status              available
  # open                 1
  LV Size                7.39 GiB
  Current LE             1892
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

  --- Logical volume ---
  LV Path                /dev/debian-jessie-vg/swap_1
  LV Name                swap_1
  VG Name                debian-jessie-vg
  LV UUID                dS5vEu-w8LQ-uoZd-IGk8-cmaK-8tBQ-ZtSyvO
  LV Write Access        read/write
  LV Creation host, time debian-jessie, 2015-04-27 10:42:28 +0200
  LV Status              available
  # open                 2
  LV Size                376.00 MiB
  Current LE             94
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

So the path for my LV is /dev/debian-jessie-vg/root

And…

root@machine:~# vgdisplay
  --- Volume group ---
  VG Name               debian-jessie-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               26.38 GiB
  PE Size               4.00 MiB
  Total PE              6754
  Alloc PE / Size       1986 / 7.76 GiB
  Free  PE / Size       4768 / 18.62 GiB
  VG UUID               V2oYD9-uoYy-sFLY-QSLG-FPyx-Ejce-QANYo4

…I have 4768 Free PE for it! :-)

So, let’s use them. I extend first the LV:

root@machine:~# lvextend -l +4768 /dev/debian-jessie-vg/root
  Size of logical volume debian-jessie-vg/root changed from 7.39 GiB (1892 extents) to 26.02 GiB (6660 extents).
  Logical volume root successfully resized

Then I resize the fs

root@machine:~# resize2fs /dev/debian-jessie-vg/root
resize2fs ... (it does it all automatically)

And that’s all!
Let’s check:

root@machine:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0        26G  5.7G   19G  24% /
udev             10M     0   10M   0% /dev
tmpfs           403M  5.5M  397M   2% /run
tmpfs          1006M     0 1006M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs          1006M     0 1006M   0% /sys/fs/cgroup
/dev/sda1       236M   33M  191M  15% /boot
root@machine:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/debian-jessie-vg/root
  LV Name                root
  VG Name                debian-jessie-vg
  LV UUID                OdIAov-a7qm-ThOR-58YP-D7FG-zq5n-r73dUq
  LV Write Access        read/write
  LV Creation host, time debian-jessie, 2015-04-27 10:42:28 +0200
  LV Status              available
  # open                 1
  LV Size                26.02 GiB
  Current LE             6660
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:0

  --- Logical volume ---
  LV Path                /dev/debian-jessie-vg/swap_1
  LV Name                swap_1
  VG Name                debian-jessie-vg
  LV UUID                dS5vEu-w8LQ-uoZd-IGk8-cmaK-8tBQ-ZtSyvO
  LV Write Access        read/write
  LV Creation host, time debian-jessie, 2015-04-27 10:42:28 +0200
  LV Status              available
  # open                 2
  LV Size                376.00 MiB
  Current LE             94
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1

Reconfigurar WiFi en Windows 8

Windows 8 (los dioses confundan a sus creadores) elimina la interfaz gráfica que permitía gestionar las redes WiFi, de manera que si se configura una erróneamente, no se puede editar ni re-crear.

Ante esta situación debemos acudir a la línea de comandos.

Para ello buscamos la consola -> botón derecho -> lanzar como administrador.

Eliminar un perfil:
netsh wlan delete profile name=”ProfileName”

Mostrar todos los perfiles inalámbricos en el equipo:
netsh wlan show profiles

Mostrar una clave de seguridad:
netsh wlan show profile name=”ProfileName” key=clear

Más información:
http://windows.microsoft.com/es-es/windows-8/manage-wireless-network-profiles

Grabar el escritorio GNU/Linux

Para grabar el escritorio en GNU/Linux podemos utiliza ffmpeg. Vamos a ver un par de ejemplos.

Grabar el escritorio completo (1680×1050):
ffmpeg -f x11grab -s 1680×1050 -r 25 -i :0.0 -sameq output.mkv
Grabar una parte del escritorio (tamaño 1000×500, offset 100,100):
ffmpeg -f x11grab -s 1000×500 -r 25 -i :0.0+100,100 -sameq output.mkv

También se puede indicar a ffmpeg que grabe una zona que siga al ratón y varios parámetros más. Como siempre:
man ffmpeg

Otros programas que se pueden usar para capturar el escritorio son VLC, gtk-recordmydesktop, recordmydesktop.

Relacionado: Retocar videos
También recomiendo OpenShot para editar videos de forma gráfica.

sshfs – Montando recursos mediante SSH y FUSE

Mediante SSH y FUSE podemos montar un recurso de una máquina remota. Se pueden usar las opciones de ssh y de fuse, pero puede resultar un poco confuso.
Aquí un ejemplo con opciones para cambiar el puerto y usar un fichero de clave:

$ sshfs guimi@guimi.net:/home/guimi ~/mnt -p [puerto] -o IdentityFile=[fichero]

Instalación
Como siempre, es muy facil:

# aptitude install sshfs

Además, el usuario debe estar en el grupo “fuse”.

Otros artículos relacionados

Configuración de ssh
Confianza ssh
Túneles SSH
Uso de ssh
Uso de scp

ssh, fuse, sshfs

Recuperar archivos borrados en GNU/Linux (undelete ext3/ext4)

Cuando se borran archivos accidentalmente lo primero que hay que intentar es que nada sobre-escriba el espacio que ocupaban.

A veces al instalar el programa que recupera archivos podemos sobreescribirlos. Por eso recomiendo instalar la aplicación en cualquier sistema, sin esperar a necesitarlo.

SI EL ARCHIVO TODAVÍA ESTÁ ABIERTO
Si hemos borrado un archivo que está abierto, hay una copia de él. No cierres la aplicación que lo tiene abierto.
Comprobamos si es el caso, por ejemplo con

 lsof | grep Hank_Mobley
totem     25655         guimi   21u      REG                8,4  5477902   55689957 /home/guimi/Hank_Mobley-Soul_Station/01-Remember_(Irving_Berlin)-Hank_Mobley.mp3

Nos fijamos en que el proceso que tiene abierto el fichero es el 25655 y le ha asignado el número 21.
Recuperamos el fichero con:

cp /proc/25655/fd/21 otra/ubicacion/01-Remember_(Irving_Berlin)-Hank_Mobley.mp3

INSTALACIÓN DE EXTUNDELETE
En este caso la aplicación que vamos a utilizar es extundelete.
Otra herramienta, solo para ext3, es ext3grep.

Como es habitual basta con:

 aptitude install extundelete

USO
Supongamos que tenemos la partición “/dev/sda4” montada como “/home” y que hemos borrado el archivo “/home/guimi/ejemplo.txt”. Por tanto la ruta relativa del fichero en el dispositivo es guimi/ejemplo.txt.

Primero desmontamos la partición implicada:

 umount /dev/sda4

Considera la opción de copiar toda la partición con dd.

Después recuperamos el archivo con:

 extundelete --restore-file guimi/ejemplo.txt /dev/sda4

Si queremos recuperar el contenido de un directorio entero, por ejemplo “/home/guimi/ejemplo/” ejecutamos:

 extundelete --restore-directory guimi/ejemplo /dev/sda4

Otras opciones interesantes son –before y –after.

OTRAS OPCIONES
También se puede probar a usar photorec.

 

Truncar el pwd

Truncar el pwd que aparece en PS1.
Solo recomendable en usuarios, no en root.
Esto nos permite ver algo así:

 :.+cion/Prueba_de_d$ pwd
/home/guimi/direccion/Prueba_de_d

Para ello editamos el archivo del usuario ~/.bashrc:

 vi ~/.bashrc
# Funcion para truncar el pwd extraida de Debian-Administration.org
#+ <a href="http://www.debian-administration.org/articles/548" class="externo">http://www.debian-administration.org/articles/548</a>
#+ posted by mikhailian
function truncate_pwd
{
 if [ $HOME == $PWD ]
 then
   newPWD="~"
 elif [ $HOME ==  ${PWD:0:${#HOME}} ]
 then
   newPWD="~${PWD:${#HOME}}"
 else
   newPWD=$PWD
 fi

  local pwdmaxlen=15
  if [ ${#newPWD} -gt $pwdmaxlen ]
  then
    local pwdoffset=$(( ${#newPWD} - $pwdmaxlen  ))
    newPWD=".+${newPWD:$pwdoffset:$pwdmaxlen}"
  fi
}

PROMPT_COMMAND=truncate_pwd
PS1="${ttyname}@\[${HOST_COLOUR}\]\h\[${RESET_COLOR}\]:\${newPWD}\\$ "

Conocer la arquitectura de nuestro sistema (32 o 64 bits)

Tenemos varias opciones.

Podemos mostrar información del sistema instalado (toda)

guimi:~$ uname -a
Linux guimi 2.6.32-5-686 #1 SMP Mon Feb 25 01:04:36 UTC 2013 i686 GNU/Linux

O solo el nombre de la arquitectura instalada

guimi:~$ uname -m
i686

En este caso está instalada la arquitectura “i686” que se utiliza 32 bits. Pero es un modo indirecto de saberlo.

Podemos mirar directamente la configuración del sistema instalado y ver que los bits del sistema:

guimi:~$ getconf LONG_BIT
32

Pero si lo que queremos es conocer la capacidad de nuestro equipo, podemos consultar el micro:

guimi:~$ lscpu
Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                2
Thread(s) per core:    1
Core(s) per socket:    2
CPU socket(s):         1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1999.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              6144K 

Ya puestos, podemos consultar toda la información del micro:

guimi:~$ cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Pentium(R) Dual-Core  CPU      E5200  @ 2.50GHz
stepping	: 6
cpu MHz		: 1203.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips	: 5000.20
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Pentium(R) Dual-Core  CPU      E5200  @ 2.50GHz
stepping	: 6
cpu MHz		: 1203.000
cache size	: 2048 KB
physical id	: 0
siblings	: 2
core id		: 1
cpu cores	: 2
apicid		: 1
initial apicid	: 1
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips	: 5000.05
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

Modifica metadatos de libros-e

Aquí dejo un script para modificar/consultar los metadatos de una biblioteca de libros-e.
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y modificar/consultar todos los libros-e.
Para casos más sencillo basta con ebook-meta del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_metadata.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

####################################
# REQUISITOS
# calibre -> ebook-metadata


####################################
#### ERRORES
E_PARAMINVAL=64     # Parametro invalido

####################################
#### AYUDA
muestra_ayuda ()
{
  echo "Use `basename $0` -h para ver la ayuda" >&2
}

muestra_ayuda_larga ()
{
  more << EOF

libros-e_metadata.sh
(c) 2013 Guimi (http://guimi.net)
This software is under the GNU Public License (GPL) v.2

Este script utiliza ebook-meta (calibre) para modificar y mostrar metadatos de ficheros epub de forma recurrente (subdirectorios)

Options:
---------
  -a
  --auto
	Utiliza el nombre del fichero para escribir el autor y titulo del libro en los metadatos
	Presupone el siguiente formato de nombre de archivo: autor-titulo.epub
	Ademas presupone que [autor] es: [1er apellido]_[resto] o [solo una palabra]

	Ejemplos:
		Platon-Escritos_completos.epub
		Sagan_Carl-Cosmos-ed.aniversario.epub

  -h
  --help
    Muestra esta ayuda

  -l
  --limpia
	Borra los metadatos de los campos comentarios, titulo de orden, productor y publicación

  -m [metadatos]
  --metadatos [metadatos]
	Escribe los metadatos dados, utilizando ebook-meta (ver ebook-meta --help)
	La cadena de metadatos debe estar entrecomillada

	Ejemplo:
		libros-e_metadata.sh -m "-l es -c 'Excelente libro'"

  -v
  --verbose
    Muestra todos los metadatos

EOF
}


####################################
# PARAMETROS

# Parámetros por omisión
string_parametros=""

# Comprobacion de parametros
while [ $# -gt 0 ]; do    # Mientras tenemos parámetros...
  case "$1" in
    -a|--auto) # Escribe metadatos a partir del nombre de fichero
      AUTO='0'
      ;;
    -h|--help) # Muestra la ayuda larga
	  muestra_ayuda_larga
      exit 0
      ;;
    -l|--limpia) # Limpia algunos metadatos
	  LIMPIA='0'
      ;;
    -m|--metadatos) # Escribe metadatos
      # Comprobando si hay mas parámetros
      if [ -z "$2" ]
      then
        echo "Error: Falta la cadena de metadatos" >&2
        muestra_ayuda
        exit $E_PARAMINVAL
      else
        string_parametros="$2"
        shift
      fi
      ;;
    -v|--verbose) # Muestra todos los metadatos
      VERBORREICO='0'
      ;;
    -*) # Parametro desconocido
      echo "Error: Parametro desconocido $1" >&2
      muestra_ayuda
      exit $E_PARAMINVAL
      ;;
  esac
  shift # Pasar al siguiente parámetro
done


####################################
# BUCLE PRINCIPAL
# Listamos los ficheros, incluidos subdirectorios
#

# Modificamos el separador de archivos (IFS), por si algun fichero contiene espacios en el nombre
SAVEIFS=$IFS
IFS=$'\n'
# Realizamos el bucle
for x in `find . -type f -iname "*.epub" | sort`
do
	# Limpiamos la cadena de comando del bucle anterior (si lo hubiere)
	string_comando=""

	# COMPROBAMOS SI HEMOS DE ESCRIBIR AUTOR Y TITULO A PARTIR DEL NOMBRE DEL FICHERO
	if [ -n "$AUTO" ]
	then
		# Tomamos los datos del nombre del fichero
		nombre_base=$(basename "$x")
		nombre_base="${nombre_base%.*}"
		libro_autor="${nombre_base%%-*}"
		libro_autor_esp="${libro_autor//_/ }"
		libro_autor_apellido="${libro_autor_esp%% *}"
		libro_autor_resto="${libro_autor_esp#* }"
		libro_autor_largo="$libro_autor_resto $libro_autor_apellido"
		libro_autor_orden="$libro_autor_apellido, $libro_autor_resto"
		libro_titulo="${nombre_base#*-}"
		libro_titulo_esp="${libro_titulo//_/ }"
		#echo  "[$libro_autor_largo] [$libro_autor_orden] [$libro_titulo]"

		# Anotamos los parametros para el conversor
		string_comando="-a '$libro_autor_largo' --author-sort '$libro_autor_orden' -t '$libro_titulo_esp' --title-sort ''"
	fi

	# COMPROBAMOS SI HEMOS DE LIMPIAR METADATOS
	if [ -n "$LIMPIA" ]
	then
		# Anotamos los parametros para el conversor
		string_comando=$string_comando" -c '' -p '' -k '' -d '' --title-sort ''"
	fi

	# COMPONEMOS LA ORDEN E INDICAMOS POR QUÉ FICHERO VAMOS
	if [ -n "$VERBORREICO" ]
	then
		comando="ebook-meta $string_comando $string_parametros '$x'"
		echo  "----------- $x ----------"
	else
		if [ "$string_comando" == "" ] && [ "$string_parametros" == "" ]
		then
			comando="ebook-meta '$x' | grep -e Title -e Author -e Language"
			echo  "----------- $x ----------"
		else
			comando="ebook-meta $string_comando $string_parametros '$x' > /dev/null"
			echo  "$x ..."
		fi
	fi

	# LANZAMOS EL CONVERTIDOR
	eval $comando

done
# Restauramos el separador de archivos (IFS)
IFS=$SAVEIFS

####################################
# Terminamos
exit 0

Convierte libros-e

Aquí dejo un script para convertir una biblioteca de libros-e al formato epub (o al que se quiera).
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y convertir todos los libros-e al formato deseado sin alterar la estructura y guardando copia de los originales en una estructura nueva copiada de la antigua.
Para casos más sencillo basta con ebook-convert del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_convierte.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

############
# REQUISITOS
# calibre -> ebook-convert

# Extensiones a convertir
#extensiones="pdf epub txt png jpg jpeg bmp doc docx djvu"
extensiones="rtf lit fb2 mobi"

# Contadores estadísticos
contador_total=0
contador_ok=0
contador_no=0

# Tomamos el directorio inicial, ya que trabajaremos con subdirectorios
directorio_base=$(pwd)

# Generamos un directorio donde guardar los originales.
# Este directorio está fuera de nuestra ruta, así podemos ejecutar repetidas veces el script sin volver a convertir los archivos
mkdir ../originales

# Listamos los ficheros, incluidos subdirectorios
for x in `find . -type f | sort`
do
	# Incrementamos contador estadístico
	let contador_total=contador_total+1

	# Primero hemos de tomar el directorio, el nombre y la extensión
	directorio=$(dirname "$x")
	nombre_base=$(basename "$x")
	extension="${nombre_base##*.}"
	nombre_base="${nombre_base%.*}"
	#echo "$directorio | $nombre_base | $extension"

	# Comprobamos si la extensión del fichero es una de las buscadas
	[[ $extensiones =~ $extension ]] && reconocido=0 || reconocido=1
	# Convertimos el fichero
	if [ $reconocido -eq 0 ]
	then
		echo  -n "Convirtiendo $x..."
		# Cambiamos al directorio del fichero, si no ebook-convert no trabaja bien (!?)
		cd $directorio
		# Hacemos una conversión silenciosa y tomamos la salida (ejecución terminada con éxito o con error)
		ebook-convert $nombre_base.$extension $nombre_base.epub > /dev/null 2> /dev/null
      	SALIDA=$?
		# Volvemos al directorio de trabajo
		cd $directorio_base

		# Comprobamos si la conversión ha sido exitosa
      	if [ "$SALIDA" -gt 0 ]
      	then
			# Incrementamos contador estadístico
			let contador_no=contador_no+1
			echo " ERROR!!!"
		else
			# Incrementamos contador estadístico
			let contador_ok=contador_ok+1
			echo " ok"
			# Generamos el mismo arbol de directorios para lo originales y movemos el archivo
			mkdir ../originales/$directorio -p 2> /dev/null
			mv $directorio/$nombre_base.$extension ../originales/$directorio/$nombre_base.$extension
      	fi
	fi
done

# Mostramos unas pequeñas estadísticas
echo ""
echo "Total ficheros: $contador_total | Convertidos: $contador_ok | Con error: $contador_no"

# Terminamos
exit 0

Conversión juego de caracteres UFT-8, ISO…

Convertir el nombre de los ficheros (paquete convmv):

$ convmv -f iso-8859-15 -t UTF-8 -r * –notest

Convertir el contenido de un fichero:

$ iconv fichero.in -f iso-8859-15 -t utf-8 -o fichero.out

Poner saltos de línea estilos Unix o estilo DOS (paquete tofrodos):

$ unix2dos fichero.in
$ dos2unix fichero.in
unix, dos, charset, juego de caracteres, utf