miércoles, julio 05, 2006

Enviar archivos por bluetooth de pc a movil o viceversa en Gentoo

Llevo un poco parao mis descubrimientos con linux, mas que nada por las vacas y la cantidad de curro que tengo, este post lo empece a escribir el 5 de julio de 2006 y ya por fin hoy he terminado (10 de septiembre de 2006)....

Salud3!

Bueno, comentaros que con la pagina siguiente todo solucionado :

Guia de Bluetooth en gentoo

Voy ha hacerme un pequeño resumen para que no se me orvide.

Basicamente si utilizas genkernel los modulos ya los tienes instalados menos el protocolo RFCOMM.

Como se trata de un modulo y pensando que ya tienes el kernel generado con # genkernel all hacemos lo siguiente como root

cd /usr/src/linux
make menuconfig


y seleccionamos

Networking --->

<*> Bluetooth subsystem support --->

--- Bluetooth subsystem support
<M> L2CAP protocol support
<M> SCO links support
<M> RFCOMM protocol support
[*] RFCOMM TTY support
<M> BNEP protocol support
[*] Multicast filter support
[*] Protocol filter support
<M> HIDP protocol support


Salvamos y salimos y por que no, hacemos una nueva copia de la configuracion al /boot/

mount /boot/
cp .config /boot/.config-version-con-net-bt


Compilamos los nuevos modulos he instalamos

make modules
make modules_install


Si todo ha ido bien, enchufamos el bluetooth/usb y hacemos un dmesg

dmesg


El dmesg deberia devolvernos algo como esto :

ohci_hcd 0000:00:02.0: wakeup
usb 2-6: new full speed USB device using ohci_hcd and address 2
usb 2-6: configuration #1 chosen from 1 choice
Bluetooth: Core ver 2.8
NET: Registered protocol family 31
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: HCI USB driver ver 2.9
usbcore: registered new driver hci_usb


Tambien nos puede dar una idea ejecutar lsusb

lsusb


Si lo cogio bien el lsusb deberia devolvernos algo como esto

Bus 002 Device 002: ID 0db0:1967 Micro Star International Bluetooth Dongle
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000


No se como ira si tienes el bluetooth integrado, pci o otras pajas, pero imagino que no debe ser muy distinto

Una vez que ya vemos que el bluetooth esta soportado en nuestro kernel, necesitamos alguna aplicacion para comunicarnos con otros dispositivos bluetooth, en el wiki que puse al principio nos recomienda BlueZ, que funciona mu bien al menos para lo que yo quiero.

emerge -va net-wireless/bluez-libs net-wireless/bluez-utils


Arrancamos el servicio bluetooth

/etc/init.d/bluetooth start


cambiamos el pin, por defecto 1234 por otro que queramos
nano -w /etc/bluetooth/pin


Ahora probaremos que funciona, para probar voy a poner de ejemplo mi telefono movil, enciendo el bluetooth del movil y escaneamos a ver si vemos el mismo desde el ordenador, con hcitool scan, escaneamos dispositivos bluetooth encendidos.

hcitool scan


El resultado sera algo como esto :

Scanning ...
00:E0:03:64:16:75 Mozvil


Al ver que encuentra el dispositivo Mozvil, instalamos unas valiosas herramientas para hacer los envios de forma mas sencilla, gnome-bluetooth, entre otras, nos instalara:
gnome-obex-send (para enviar archivos del pc al movil)
gnome-obex-server (para recibir archivos del movil en el pc)

USE="bluetooth" ACCEPT_KEYWORDS="~amd64" emerge -va gnome-bluetooth


El ACCEPT_KEYWORDS para los usuarios que como yo tienen amd64

Probamos a enviarnos algo, un mp3 para poner un tono chanchi lerendi al mozvil.

gnome-obex-send fihcero.mp3


Le damos al boton de actualizar para ver el dispositivo al que vamos a enviar y listo.

Para enviar del movil al pc. tan simple como ejecutar el gnome-obex-server

gnome-obex-server


Y desde el movil enviar el archivo y seleccionar el pc como destinatario tecleamos el pin que pusimos y listo.



Algunas cosas interesantes para el tema de los mp3s.
mp3splt, para partir el mp3 en un cacho pequeño (que nos mole para el tono del movil, toda una cancion puede ser una locura), para extraer un cacho de la cancion se le invoca con 3 parametros, nombre de fichero mp3, tiempo desde donde empieza, tiempo donde acaba en el formato minutos.segundos, por ejemplo :

mp3splt fichero.mp3 0.0 0.6


Nos extraera en un nuevo archivo llamado fichero_0.0_0.6.mp3 los primeros 6 segundos de la cancion.

Ademas si soys unos pijoteros que os bajais los mp3s en calidad decente (192 Kbps) seria recomendable que recodificarais con un sonido un poco peor... (total es para que os llamen no para dar un concierto).

El lame tiene un present para moviles que te reduce bastante la calidad (en consecuencia el tamaño) y es tan facil de usar como lame --preset phone fichero-a-recodificar.mp3 fichero-de-salida.mp3

lame --preset phone fichero_0.0_0.6.mp3 fichero-pal-movil.mp3


Como siempre todos los comentarios seran bien recibidos.

Pasando la live de gentoo a usb

Como ya decia en el anterior post, el tema de hacer la live era para probar a hacer una live que cargara desde un usb-stick. Pues bien, nada mas facil si habeis conseguido hacer la livecd con los pasos que os indique teneis que hacer estos sencillos pasos.

Para empezar tenemos que compilar el kernel con soporte para usb-storage incluido en el propio kernel y no como modulo (que es como normalmente se suele poner y te pone por defecto el genkernel)

# hacemos el chroot
cd ~/livecd/source
mount -o bind /proc proc
mount -o bind /dev dev
mount -o bind /sys sys
mount -o bind /usr/portage/distfiles usr/portage/distfiles
cp /etc/resolv.conf etc/resolv.conf
# Para sistemas de 32 bits desde 32 bits
chroot . /bin/bash --login
# Para sistemas de 32 bits desde 64 bits
linux32 chroot . /bin/bash --login
env-update
source /etc/profile
genkernel --gensplash=livecd-2006.0 --menuconfig all

# En el menuconfig buscamos estas opciones de configuracion para ponerlas en el kernel por defecto
# No se si son necesarias todas ellas pero para mi usb-stick con estas ha funcionado
Device Drivers --->
  USB support --->
    <*> USB Mass Storage support
      [ ] USB Mass Storage verbose debug
      [*] Datafab Compact Flash Reader support (EXPERIMENTAL)
      [*] Freecom USB/ATAPI Bridge support
      [*] ISD-200 USB/ATA Bridge support
      [*] Microtech/ZiO! CompactFlash/SmartMedia support
      [ ] USBAT/USBAT02-based storage support (EXPERIMENTAL)
      [*] SanDisk SDDR-09 (and other SmartMedia) support (EXPERIMENTAL)
      [*] SanDisk SDDR-55 SmartMedia support (EXPERIMENTAL)
      [*] Lexar Jumpshot Compact Flash Reader (EXPERIMENTAL)
      [ ] Olympus MAUSB-10/Fuji DPC-R1 support (EXPERIMENTAL)
# Salvamos la configuracion y esperamos a que termine de compilar el nuevo kernel

# Salimos del chroot
exit
env-update
source /etc/profile



Borramos el contenido total del usb-sitck y la particion (contamos que el usb es /dev/sdd, si no tienes disco duro sata es casi seguro que sea /dev/sda, pero ten mucho cuidado por que te borraras el contenido del usb-stick)

# Para ver que particiones tenemos
sfdisk -l /dev/sdd
# Borramos el contenido
dd if=/dev/zero of=/dev/sdd
# Esto tardara un ratito, se paciente


Una vez borrado el contenido y las particiones del usb creamos unas nuevas, esto es igual que particionar cualquier disco duro, asi que si no sois neonatos en el tema no os deberia costar demasiado, yo lo voy a relatar para el sistema mas sencillo que se me ocurre que es una particion con todo el contenido del usb-stick en sistema de ficheros ext2.

# Como ya hemos comentado, con esto particionamos con sfdisk el /dev/sdd para crear una nueva particion con todo el contenido del usb-stick.
sfdisk -q /dev/sdd << EOF
0,,L,*
;
;
;
EOF
# Yo siempre he utilizado fdisk, esto es el ejemplo que venia en el wiki, pero supongo que podras utilizar el que mas te apetedca.

# Formateamos con ext2
mke2fs -m0 /dev/sdd1
fi


Despues de formatear, montamos el usb-stick y copiamos el directorio donde tenemos la live, podemos copiarla integramente o copiar solo la parte que mas nos convenga, aqui os pongo un ejemplo de rsync contando que el directorio donde montamos se llame /mnt/usbstick y el directorio donde tenemos la live sea el /root/livecd/source/, y excluyendo los archivos inecesarios para el uso de la distro.

# montamos
mount /dev/sdd1 /mnt/usbstick
# copiamos
rsync -a --delete --progress --exclude "*.h" --exclude "etc/bootsplash" --exclude "usr/tmp" --exclude "var/cache/*" --exclude "var/db/*" --exclude "var/log/*" --exclude "var/tmp/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" /root/livecd/source/ /mnt/usbstick/

# limpiamos cosillas por si las moscas
cd /mnt/usbstick
rm -rf var/tmp/*
rm -rf var/run/*
rm -rf var/lock/*
rm -rf var/cache/*
rm -rf var/db
rm -rf tmp/*
rm -f etc/mtab
touch etc/mtab
rm -rf var/log
mkdir var/log
mkdir var/lib/
mkdir var/lib/dhcpc
rm -rf usr/portage
rm -rf etc/portage
rm -rf usr/share/doc
rm -rf usr/src/
rm root/.bash_history


Si venimos de la live del post anterior para cd hay que modificar un par de archivos, el grub.conf y el /etc/fstab

# Configs del grub
sed 's/(cd)/(hd0,0)/g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# Metemos el real_root (reemplazandolo por el cdroot)
sed 's/cdroot/real_root=\/dev\/sda1/g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# quitamos la paja del squashfs
sed 's/looptype=squashfs//g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
sed 's/loop=/livecd.squashfs//g' /mnt/usbstick/boot/grub/menu.lst > /mnt/usbstick/boot/grub/menu.lst-tmp && mv /mnt/usbstick/boot/grub/menu.lst-tmp /mnt/usbstick/boot/grub/grub.conf
# hacemos el link de grub.conf a menu.lst (ext2 admite links :D)
rm /mnt/usbstick/boot/grub/menu.lst
cd /mnt/usbstick/boot/grub/
ln -sf grub.conf menu.lst

# cambiamos completamente el fstab
echo "/dev/sda1 / ext2 noatime 0 0" > /mnt/usbstick/etc/fstab
echo "none /proc proc defaults 0 0" >> /mnt/usbstick/etc/fstab
echo "none /dev/shm tmpfs defaults 0 0" >> /mnt/usbstick/etc/fstab


Por ultimo instalamos el grub en el mbr del usb-stick

grub-install --root-directory=/mnt/usbstick /dev/sdd --recheck


Y eso es todo amigos... Supongo que en el caso de que tengamos discos duros sata habra que poner otro real_root en el grub, pero lo desconodco por que no lo he probado.

Si sabeis de alguna forma que se pueda arrancar parecido estableciendo el root como usbroot que te lo coja automaticamente no estaria de mas que me lo contarais :D


Aqui dejo un pequeño script con la ejecucion de todo para posteriores pasos y actualizaciones.

Lo unico que no hace es el tema del kernel que lo teneis que hacer a mano.

#!/bin/bash
# 02-copiar-a-usb.sh
# ==================
LIVECD=~/livecd
TARGET=${LIVECD}/target
TARGET_SOURCE=${TARGET}/files/source/
SOURCE=${LIVECD}/source

#USB settings
USBDEV=/dev/sdd
MNTDIR=/mnt/usbstick

echo -n "Desea particionar el usbstick y formatearlo (solo es necesario la primera vez) [y/N] : "
read yn
echo ""

if test x"$yn" = xy -o x"$yn" = xY; then
#USB
echo "Warning!!! Estas a punto de borrar el contenido de ${USBDEV}!!!"
echo "Las siguientes particiones se sobreescribiran :"
sfdisk -l ${USBDEV}
echo "Estas seguro de que es tu intencion?"
echo "Presiona ENTER para continuar o CTRL-C para salir."
read user_reply
echo "Espera, preparando ${USBDEV} . . ."
dd if=/dev/zero of=${USBDEV}
sfdisk -q ${USBDEV} << EOF
0,,L,*
;
;
;
EOF
mke2fs -m0 ${USBDEV}1
fi

mkdir ${MNTDIR}
mount ${USBDEV}1 ${MNTDIR}

echo -n "Desea copiar el contenido del directorio ${SOURCE} a ${MNTDIR} (toda la informacion que contenga el directorio se borrara) [Y/n] : "

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
    echo "Borrando el contenido de . . . "
    cd ${MNTDIR}
    rm -rf *
    echo "Copiando ficheros a ${MNTDIR} . . ."

    rsync -a --delete --progress --exclude "*.h" --exclude "etc/bootsplash" --exclude "usr/tmp" --exclude "opt/enemy-territory/etmain/video/*" --exclude "var/cache/*" --exclude "var/db/*" --exclude "var/log/*" --exclude "var/tmp/*" --exclude "usr/portage" --exclude "usr/share/doc" --exclude "usr/src" ${SOURCE}/ ${MNTDIR}/

    echo "Limpiando la nueva live"
    cd ${MNTDIR}
    rm -rf var/tmp/*
    rm -rf var/run/*
    rm -rf var/lock/*
    rm -rf var/cache/*
    rm -rf var/db
    rm -rf tmp/*
    rm -f etc/mtab
    touch etc/mtab
    rm -rf var/log
    mkdir var/log
    mkdir var/lib/
    mkdir var/lib/dhcpc
    rm -rf usr/portage
    rm -rf etc/portage
    rm -rf usr/share/doc
    rm -rf usr/src/
    rm root/.bash_history
fi

echo -n "Vienes de una live iso? (Esto es para cambiar el contenido de algunos archivos como el fstab para que te monte los archivos como dios manda y el config del grub para que te arranque desde el usb) [Y/n] : "

if test x"$yn" = x -o x"$yn" = xy -o x"$yn" = xY; then
    # Configs del grub
    echo "Modificando el fichero ${MNTDIR}/boot/grub/menu.lst . . ."
    # Si viene de la generacion de un cd de arranque
    sed 's/(cd)/(hd0,0)/g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # Metemos el real_root (reemplazandolo por el cdroot)
    sed 's/cdroot/real_root=\/dev\/sda1/g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # quitamos la paja del squashfs
    sed 's/looptype=squashfs//g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    sed 's/loop=/livecd.squashfs//g' ${MNTDIR}/boot/grub/menu.lst > ${MNTDIR}/boot/grub/menu.lst-tmp && mv ${MNTDIR}/boot/grub/menu.lst-tmp ${MNTDIR}/boot/grub/grub.conf
    # hacemos el link de grub.conf a menu.lst
    rm ${MNTDIR}/boot/grub/menu.lst
    cd ${MNTDIR}/boot/grub/
    ln -sf grub.conf menu.lst

    # fstab
    echo "/dev/sda1     /     ext2     noatime         0 0" > ${MNTDIR}/etc/fstab
    echo "none         /proc     proc     defaults        0 0" >> ${MNTDIR}/etc/fstab
    echo "none         /dev/shm    tmpfs     defaults        0 0" >> ${MNTDIR}/etc/fstab
fi

echo -n "Desea instalar grub en el arranque de ${USBDEV} (solo es necesario la primera vez) [y/N] : "
read yn
echo ""

if test x"$yn" = xy -o x"$yn" = xY; then
    echo "Instalando Grub . . ."
    grub-install --root-directory=${MNTDIR} ${USBDEV} --recheck
fi

echo "Desmontando ${MNTDIR} . . ."
umount ${MNTDIR}

echo "Tu usb auto-arrancable esta listo."