Archive for the 'Cacharreo' Category

Un poco de modding

domingo, marzo 31st, 2019

Hace tiempo me compré una caja Elite 110 de Cooler Master. Esta caja tiene la ventaja de ser muy pequeña y compacta gracias a que no tiene hueco para lector de CD/DVD, por lo que me gustaba mucho. Su inconveniente, sin embargo, es que sólo permite placas madre mini-ITX; esto es, de un máximo de 17x17cm, aunque para mí tampoco era un problema, pues mi placa madre era de ese formato. Sin embargo, recientemente se me estropeó, y ahí empezaron mis problemas, porque por más que buscaba no encontraba ninguna placa decente para socket Intel LGA 1150 en formato mini-ITX. Sí las había en formato micro-ATX, pero obviamente eran demasiado grandes y no entraban, o bien un par de modelos chinos a la venta en Amazon que me inspiraban poca o ninguna confianza.

Sin embargo, de pura casualidad, encontré que en una tienda de aquí vendían la Gigabyte GA-B85M-DS3H, que medía 22,6 x 19,3 centímetros. Armado con el metro vi que sí entraba, justita pero entraba, así que la compré. Cual no sería mi decepción cuando fui a montarla, al descubrir que no entraba por unos míseros tres milímetros.

Afortunadamente no tropezaba con el borde de la caja, sino con un tabique interno que permite montar discos duros o bien dos ventiladores extra, así que, tras verlo con calma, comprobé que era posible recortar parte del tabique de manera que la placa entrase. Y dicho y hecho.

Lo primero fue desmontar el tabique. Para ello utilicé el taladro y la broca de 3 milímetros para romper los siete remaches que lo sujetaban (tres delante, dos debajo y dos detrás). Una vez retirado, usé la dremel para recortar la parte inferior. Primero corté el nervio central, como se ve en esta foto:

Luego corté por los laterales. En la parte trasera corté justo por debajo del agujero del remache, pero en la delantera corté primero en vertical y luego de manera perpendicular, para así dejar más sitio para la placa. En la siguiente foto se ve, marcado en rojo, la dirección de corte para cada lado:

Una vez hecho esto limamos la pieza con una lima de metal para quitar asperezas que puedan dañar los cables, y limpiamos a conciencia la pieza para eliminar restos de limaduras de aluminio que puedan causar cortocircuitos (yo suelo lavarla un poco y luego secarla cuidadosamente; por hacerlo una vez no es un problema).

Y llega el momento de volver a colocarla en su sitio: para ello colocamos primero los cinco remaches que quedan, pero sin apretarlos aún. Una vez introducidos, les damos un primer apretón a cada uno para asegurarnos de que la pieza se vaya situando en su lugar, y sólo entonces damos el segundo apretón, el que romperá el vástago interno del remache. Este es el resultado:

Ahora ya tenemos espacio suficiente para montar la placa sin que tropiece con nada, y teniendo incluso unos milímetros de espacio extra:

Sin embargo, ya que había desmontado la caja, decidí intentar mejorarla un poco. Por un lado, echaba de menos disponer de un conector eSATA, y por otro, en varias ocasiones me encontré con que necesitaba leer tarjetas SD y similares. Aunque disponía de un lector de tarjetas para montar en una bahía de 3 1/2 pulgadas, era bastante largo; afortunadamente, por dentro estaba prácticamente hueco, así que cogí la dremel y recorté su contenedor hasta el tamaño mínimo, y luego lo sujeté a la parte superior del frontal así:

Fijarlo no fue algo inmediato: el tornillo izquierdo fue relativamente sencillo, pues coincidía con un agujero del frontal y era suficiente con añadir una arandela, pero el tornillo derecho caía justo en la abertura grande que se ve junto al lector. La solución consistió en tomar un trozo de alambre de un clip y doblarlo en forma de gancho:

Este gancho lo metí en el tornillo derecho (también con una arandela) y luego lo doblé por uno de los agujeros del ventilador, situados debajo de la abertura grande, tal y como se ve en estas fotos:

Luego sólo fue necesario hacer un recorte con la dremel en la parte superior del frontal para que sobresaliese el lector.

El conector eSATA fue lo más sencillo de implementar: sólo tuve que coger el taladro y abrir un agujero rectangular del tamaño adecuado en la parte superior derecha del frontal, además de dos agujeros para los tornillos:

Por último, decidí montar el ventilador frontal en este lado del aluminio en lugar de hacerlo en la zona útil de la caja, para así ganar un par de centímetros extra. Por desgracia casi no había sitio, entre el lector de tarjetas y el interruptor de encendido; sin embargo, recortando una de las esquinas conseguí que entrase:

Y con esto ya está terminada: una caja compacta pero con la que no renuncio a nada.

Cargando mis cascos (y 2)

martes, diciembre 18th, 2018

Hace ya dos años modifiqué unos cascos BlueTooth para que sólo con colgarlos de un soporte se cargase su batería. Aunque funcionó bien, en este tiempo hice algunos cambios extra, y creo que ha llegado la hora de publicarlos.

Para empezar, en el artículo anterior comentaba que había utilizado malla de desoldar para hacer los contactos. Aunque funcionó bien durante unos cuantos meses, lo cierto es que el pegamento de la cinta de doble cara fue permeando a través de la malla de cobre y acabó por dar problemas de conductividad, por eso al final opté por comprar cinta adhesiva de cobre y crear con ella los nuevos contactos.

Lo primero fue pegar la cinta por la parte de arriba de la diadema, como se ve en la foto, dejando pegada sólo aproximadamente un tercio. Luego, con unas tijeras, procedí a dar cortes en la parte que quedaba colgando, cada dos centímetros aproximadamente. De esta manera pude doblarlo sobre el lateral y garantizar que quedase bien pegado y, a la vez, con continuidad eléctrica sobre toda la superficie. Este fue el resultado:

El último paso en los cascos fue soldar los cables que vienen del puente de diodos a los dos contactos (véase la entrada anterior donde explico las modificaciones a nivel eléctrico), y proteger todo con un par de vueltas de cinta aislante en cada lado.

El siguiente punto era el soporte. En el artículo anterior mostré la chapuza que hice con una alcayata y lengüetas sacadas de una pila de petaca, pero llevaba tiempo con ganas de hacer algo más serio, así que decidí darle uso a las impresoras 3D de A Industriosa para construir un soporte en condiciones. Para ello, primero hice el diseño con FreeCAD, que tiene esta pinta y cuyo fichero podéis descargar desde este enlace.

Una vez impresa llegó la cuestión de como hacer las lengüetas para los contactos. Para ello decidí hacerlas de plástico flexible, sacado de una tapa de tornillos, y luego recubrirlas con cinta adhesiva de cobre. En la foto siguiente se ven las dos lengüetas.

Tras cortarlas, las pegué en el soporte utilizando cola térmica, quedando como en la siguiente foto.

El siguiente paso fue recubrirlas con la cinta adhesiva de cobre y soldar los cables del transformador de alimentación. Sin embargo, aunque quedó bien, es cierto que habría sido mejor pegar primero la cinta adhesiva y soldar los cables, y sólo después pegar las lengüetas con la cola térmica, pues cuando apliqué el soldador me encontré con que se me despegaban.

Tras hacer todo esto, éste es el resultado del soporte, listo para acoger en su seno a los cascos. Vemos que está fijado a la balda con un tornillo, y que los cables de alimentación están soldados en la parte superior, dejando toda la superficie de las lengüetas para que haga contacto con los electrodos de los cascos.

Y este es el resultado final: un soporte con mucha mejor presencia y calidad, y que me garantiza que mis cascos siempre estarán adecuadamente cargados cada vez que los necesite.


Más Gentoo para MipsEL

domingo, diciembre 25th, 2016

Estoy actualizando la distribución de Gentoo para webtv y, como no podía ser de otra manera, hay problemillas. El último ha sido con busybox. Para poder compilarla hay que añadir, además de las opciones que indico en Generando Gentoo para WebTV, hay que añadir las siguientes:

busybox_config_option n NANDWRITE
busybox_config_option n NANDDUMP
busybox_config_option n FLASH_ERASEALL
busybox_config_option n FLASHCP
busybox_config_option n BLKDISCARD

Por otro lado, la variable USE debe contener:

USE="${ARCH} -pam -fortran -sanitize -X -iptables -hardened -seccomp -ipv6 -systemd -mdev internal-glib -caps -gtk -qt -t -boehm-gc -nls -filecaps"

El cubo III

miércoles, octubre 12th, 2016

Cuando actualicé mi PC hace unos años, opté por deshacerme del viejo Cubo II y utilizar una caja comercial cúbica. Luego volví a actualizar el ordenador y pasé a una caja clásica. Finalmente, hace unos meses, decidí que era hora de darle un poco a la carpintería, así que decidí construir una caja nueva.

Tras darle varias vueltas, sopesando posibles materiales, de pronto caí en la cuenta de que podía aprovechar la vieja caja cúbica. Esta caja era bastante grande, así que podía intentar reducirla a un tamaño más manejable (pulsar sobre las imágenes para verlas más grandes).

caja_pequena_2 caja_pequena_1

Esta es la caja original. No es realmente muy grande, pero aún así, dado que está pensada para contener placas MicroATX, dos unidades de 5 1/4 y una de 3 1/2 externas, y hasta dos discos duros internos, es obvio que sobra mucho espacio. Sobre todo cuando yo ya no uso el DVD para nada.

Lo primero que hice fue desmontarla completamente y dejar sólo el armazón.

caja_pequena_3

Vemos que hay dos piezas que van desde el frontal hasta la parte posterior y que, además de dar más solidez a la caja, permiten sostener las unidades externas; sobre una de ellas, además, se apoyan los discos duros y la fuente de alimentación. También hay una barra metálica en el otro lado. Las piezas están sujetas con remaches, que quité reventándolos con el taladro. La barra está atornillada, así que no tuvo ninguna dificultad.

caja_pequena_4

El siguiente paso consistió en cortar el chasis para acortarlo. Decidí reducirlo a lo mínimo que me permitiese la base donde se atornilla la placa madre (que es una pieza independiente). También recorté las dos mitades en altura, teniendo en cuenta el tamaño de la fuente de alimentación y la mínima altura a la que la podría poner.caja_pequena_5 caja_pequena_6

Una vez hecho esto, uní ambas mitades con remaches, consiguiendo así el chasis del tamaño que quería.

caja_pequena_7

A continuación, recorté la barra para ajustarla al tamaño, la limé bien para quitarle asperezas, y le hice un agujero en el lado recortado para poder fijarla con un tornillo en los mismos agujeros del chasis donde estaba originalmente.

caja_pequena_8 caja_pequena_9

Ahora tenía que añadir la pieza que va desde el frontal hasta la parte posterior, para poder apoyar la fuente de alimentación. Para ello eliminé primero los soportes de las unidades externas (usando el taladro, como en la primera foto), y la fijé boca arriba para poder recortar cómodamente los laterales con la dremel.

caja_pequena_11

Hecho esto, la fijé boca abajo sobre un listón y recorté la parte central, dejando unos dos centímetros extra de manera que dispusiese de una lengüeta, necesaria para fijar la pieza en el otro lado de la caja.

caja_pequena_12 caja_pequena_13

Doblé la lengüeta de manera que quedase perpendicular a la parte superior. Para que quedase lo mejor posible puse la pieza boca abajo de nuevo y la fijé con un listón, cuyo borde estaba situado justo en el punto de doblez. Luego sólo tuve que ir golpeando poco a poco con el martillo hasta conseguir dejarla exactamente como deseaba. El listón garantizó que sólo se doblará por donde me interesaba.

caja_pequena_14

Hecho esto, hice dos agujeros en los puntos adecuados y sujeté la pieza con unos remaches. Con esto terminé el chasis.

caja_pequena_15

Ahora le tocaba el turno a la fuente de alimentación. La coloqué sobre la pieza y recorté la zona de la rejilla de la parte posterior para dejar libres los conectores, además de hacer algún agujero extra para los tornillos.

caja_pequena_16

Llegó el turno de construir el frontal. Al principio había probado a recortar y recomponer el original, pero quedaba fatal, así que decidí hacer yo mismo uno nuevo. Y ya puestos, decidí darle algo de estilo, así que lo hice directamente en madera. Lo primero fue conseguir un trozo de tablero del tamaño deseado para el frontal y marcar en él qué zonas se van a recortar para colocar los conectores delanteros. En este caso dejé hueco para un lector de tarjetas, los conectores de audio, dos USB 2.0, dos USB 3.0 y dos eSATA.

caja_pequena_17

Procuré que la veta de la madera quedase en la misma dirección que los cortes más largos, pues simplifica el trabajo. A continuación fijé un listón de madera bien recto en cada una de las líneas a recortar, y usé un cincel de madera para recortar hasta una profundidad de unos cinco milímetros. El cincel lo iba apoyando en el listón para asegurarme de que el corte fuese lo más recto posible.

caja_pequena_18 caja_pequena_19

Una vez hechos todos los cortes, le di la vuelta a la tabla y usé una fresa para ir rebajando (poco a poco, unos milímetros de cada vez) por el lado opuesto las zonas de cada conector, hasta quedar a unos cuatro milímetros del frontal. Al hacerlo, los cortes que hice antes con el cincel hicieron que la pieza interna de los agujeros se soltase, quedando así libres.

caja_pequena_20

El siguiente paso fue lijar a conciencia la superficie, limar los bordes de los agujeros para dejarlos regulares y lisos, recortar los bordes del tablero con una fresa para darles un acabado redondeado, y barnizarla con tres capas de barniz. Este es el resultado definitivo, junto con los tres intentos fallidos anteriores.

caja_pequena_21

Luego ya sólo hubo que añadir el botón de encendido, los LEDs y los conectores por el lado trasero.

caja_pequena_22 caja_pequena_23

El siguiente paso fue el soporte del disco duro. Partí del mismo que tenía la caja vieja, pero lo recorté (el original tenía espacio para dos discos duros apilados, pero quedaba muy pegado a la tarjeta gráfica).

caja_pequena_28 caja_pequena_29

A continuación enderecé y volví a doblar la lengüeta superior para «colgar» el soporte de la barra que cruza la caja. Para ello utilicé un destornillador con el mismo diámetro que la barra, y el martillo. También recorté el lateral izquierdo para hacer una pestaña que encajase en la parte izquierda, para así sujetar el soporte a la caja con un remache (en la segunda foto, es la pestaña situada encima de las aberturas de las tarjetas de expansión, a la izquierda).

caja_pequena_30 caja_pequena_31

Por último, enderecé la pestaña de la derecha y le fijé un soporte para discos de 2 1/2 pulgadas, porque quería añadir un disco SSD a mi equipo.

caja_pequena_32

Y así quedaron ambos discos, ya montados y conectados.

caja_pequena_33

El último paso fue preparar la tapa y las paredes laterales. La tapa la recorté un centímetro más larga de lo necesario, y luego coloqué una tabla para doblarla en ángulo con el martillo. Esa zona quedó hacia atrás.

caja_pequena_24

Por último, las paredes. Comencé colocando las láminas originales en su sitio para marcar los dos cortes necesarios.

caja_pequena_25

Luego corté dejando un centímetro de más tanto por arriba como por detrás. La esquina común a ambos cortes la corté en chaflán. A continuación, usando una vez más un listón sujeto con dos sargentas y el martillo, procedí a doblar 180 grados el trozo que sobra. Al haber cortado en chaflán la esquina común, las dos lengüetas no se solaparon (como se puede ver en la tercera fotografía).

caja_pequena_26 caja_pequena_27

caja_pequena_35

Y este es el resultado final, una vez ensamblado todo y, por supuesto, darle una mano de pintura negra en spray: una caja que ocupa, aproximadamente, 2/3 del volumen de la caja original.

caja_pequena_34

Cargando fácilmente mis cascos

lunes, julio 25th, 2016

Hace tiempo acabé cansado de mis cascos con cable: se enredaban con todo, y a menudo me olvidaba que los llevaba puestos, con lo que, al levantarme, me daban un tirón. Es por esto que decidí comprar unos cascos inalámbricos. Además, para evitar interferencias o que los vecinos puedan escuchar desde otro equipo lo que estoy viendo en ese momento (cof, cof-porno-cof, cof), decidí usar unos cascos bluetooth. Compré unos bastante baratos, pero eran incómodos, así que trasplanté la circuitería a mis viejos cascos de cable.

Todo funcionaba bien, excepto por un detalle: cada dos por tres me encontraba sin batería porque me los quitaba y no los enchufaba al cargador, con lo que tenía que usarlos durante un buen rato con el cable enchufado, perdiendo así las ventajas. Ante esto empecé a pensar en maneras de recargar la batería de una manera más automática. La primera idea fue utilizar carga inalámbrica: montaría un soporte para los cascos con una bobina sobre él; a su vez, una segunda bobina montada en la diadema de los cascos estaría conectada a los pines de recarga. Así, al colocarlos en el soporte, ambas bobinas quedarían alineadas formando un transformador, igual que se hace en los sistemas de carga inalámbrica de los móviles. Por desgracia, aunque la teoría era muy sencilla, la práctica no lo era tanto: hacía falta un oscilador para alimentar la primera bobina, ajustar la impedancia del conjunto para que estuviese en resonancia… un cristo.

Decidí entonces probar una aproximación más pedestre: colocaría un par de contactos metálicos en la diadema que coincidiesen con otros situados en un soporte, de manera que cuando colgase los cascos éstos recibirían alimentación directamente. La primera idea fue colocar dos contactos en los laterales de la diadema para uno de los polos, y otro en el centro, por debajo, para el otro. De esta manera no habría riesgo de invertir la polaridad si colgaba los cascos al revés. Sin embargo, enseguida deseché esta opción por dos motivos: para empezar, no era sencillo construir un soporte con los tres contactos; y por otro, no me gustaba la idea de tener un contacto metálico apoyado en mi cuero cabelludo (con el sudor acabaría estropeándose). Tras darle varias vueltas, decidí que la mejor opción era usar sólo dos contactos, situados en cada lado de la diadema. Para evitar estropear los cascos por recibir la polaridad al revés si los colgaba mal, decidí añadir un puente de diodos entre los contactos y el circuito de carga. Por desgracia, a la salida tendría 1,4 voltios menos que en la entrada por culpa de las pérdidas de los diodos, y, por otro lado, no quería correr el riesgo de alimentar un dispositivo con una batería de Li-ion con una tensión excesiva(y menos si está situada junto a mi oreja) .

Dado que el diseño original estaba pensado para cargarse desde un USB y, por tanto, la tensión tenía que ser de 5V estabilizados, decidí añadir un regulador justo entre el puente de diodos y el circuito bluetooth. La primera idea que me vino a la cabeza fue el clásico 7805, pero dado que es un regulador lineal, podría tener problemas de sobrecalentamiento (y, una vez más, hay que recordar que eso va a ir pegado a nuestra oreja…), así que lo sustituí por un regulador conmutado, en concreto un TSRN 1-2450 de la marca TRACO. Gracias a él, podría usar cualquier tensión superior a 8 voltios en la entrada del circuito sin riesgo de quemar nada orgánico.

El sistema, finalmente, quedó así:

esquematico

Vemos que la tensión (que no es necesario que esté estabilizada) disponible en el soporte llega a los cascos mediante dos contactos metálicos situados a cada lado de la diadema. Esta tensión (que puede ir con cualquiera de las dos posibles polaridades) llega al puente de diodos, que nos garantiza tener el positivo y el negativo donde nos interesa, pero con una pérdida de 1,4 voltios (con lo que tendremos entre 7,6 y 10,6 voltios). A continuación viene el regulador de tensión, que nos proporciona los 5 voltios estabilizados que necesitamos para el circuito bluetooth.

Una vez diseñado llegó el momento de construirlo, y aquí fue donde empezaron los problemas, en concreto el problema de como hacer los contactos. La primera idea fue utilizar lámina de cobre, pero no fui capaz de encontrarla en ningún lugar. Decidí probar con papel de aluminio: supuse que, si iba bien pegado, no debería haber riesgo de rotura, y sería muy sencillo de fabricar al poder aplicar una capa de loctite primero, pegar encima el papel, y luego recortar con un cutter. Por desgracia el invento no aguantó ni dos días (no sólo el papel de aluminio es demasiado frágil, sino que el loctite no se adhiere nada bien a él). Empecé a buscar alternativas, llegando incluso a intentar hacer una especie de trenza con cable de cobre, pero no encontraba nada que fuese adecuado.

Y de pronto, la solución apareció por pura casualidad: malla de desoldar.

desoldar

Para los que no la conozcan, se trata de cable fino de cobre trenzado formando una tira plana, utilizado para desoldar componentes: básicamente se coloca encima del estaño que se quiere retirar y se calienta el conjunto con el soldador. Cuando el estaño se funde, la malla lo absorbe por capilaridad, quedando el punto completamente libre.

Probé a pegarlo con loctite y el resultado fue excelente… hasta que intenté alimentar el circuito: la malla había absorbido el loctite por capilaridad, por lo que había quedado completamente cubierta y ya no era conductora. Probé también con pistola de pegamento térmico, pero no agarraba en el cobre y se soltaba.

Entonces decidí hacer una prueba a la desesperada, así que fui a la papelería de enfrente de mi casa y compré cinta adhesiva de doble cara, la apliqué en ambos lados de la diadema, pegué la malla poco a poco pasando la uña fuertemente por encima para asegurarme de que quedase bien pegada, y recorté los trozos sobrantes con un cutter. El resultado fue perfecto, y es capaz de aguantar muy bien el rozamiento diario de colgarlo y quitarlo del soporte:

contactos

La cinta aislante negra colocada en los dos extremos es para evitar que la malla se suelte: aunque a lo largo queda muy bien fijada, en los extremos es muy fácil que se acabe levantando, lo que acaba en un «efecto cremallera». Es por esto que es fundamental protegerla de esta manera si queremos que nos dure mucho tiempo.

Para el soporte utilicé una alcayata grande en forma de L, y para los contactos aproveché las láminas de una pila de 4,5 voltios (la clásica «pila de petaca»):

pila_de_petaca

Con ellos hice dos contactos, uno en cada lado, y los conecté a un alimentador de 12 voltios:

soporte

El resultado no es muy elegante y puede mejorarse, lo reconozco, pero será cuando tenga algo de tiempo.

Y este es el resultado final: ahora sólo tengo que asegurarme de colgar los cascos en el soporte y siempre estarán cargados y listos para su uso.

completo

Más sobre Debian en Android

sábado, febrero 20th, 2016

A raíz de la aparición de MaruOS, decidí intentar hacer algo similar en mi móvil Android, así que me puse a preparar una instalación de Debian para Android como ya había hecho otras veces. Por desgracia las cosas se torcieron ya al principio, así que voy a comentar los pasos que di para corregir los problemas que encontré, que no han sido pocos:

Para empezar, mi móvil tiene Android 6 (en concreto la distribución PureNexus para Nexus 4 que encontré en la página de El tendero digital). Parece que algunos cambios de seguridad hechos en él, junto con otros en APT fueron los que acabaron dando guerra. Pero no adelantemos acontecimientos…

Empecé creando el entorno básico con debootstrap, con el comando

sudo debootstrap --arch=armhf --variant=minbase --foreign sid  /home/raster/tmp  http://ftp.debian.org/debian

El resultado lo comprimí con TAR, lo pasé al móvil, y me conecté a través de USB con un shell ADB (para disponer de ADB hay que bajarse el SDK de Android):

sudo ./platform-tools/adb shell

Una vez hecho esto, lo primero es ejecutar el comando resize para ajustar el tamaño lógico de la ventana a la que tenemos físicamente, y que aplicaciones como los editores de texto y demás se vean correctamente.

Tras ello, fui hasta /data/media/0, que es donde se encuentra la zona de datos de usuario, y allí descomprimí el fichero .tar con el sistema Debian básico. Luego usé un sencillo script para entrar dentro de él para seguir la instalación:

resize
export SDCARD=/data
export ROOT=$SDCARD/media/0/debian
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH
export HOME=/root
mount -o remount,exec,dev,suid $SDCARD
for f in dev dev/pts proc sys ; do mount -o bind /$f $ROOT/$f ; done
chroot $ROOT /bin/bash -l
for f in sys proc dev/pts dev ; do umount $ROOT/$f ; done

Tras lanzarlo, procedí a terminar la instalación del sistema, pero me encontré con que al ejecutar debootstrap/debootstrap –second-stage, fallaba y no continuaba la instalación. Tras varias pruebas, descubrí que el problema era que intentaba crear varias veces una serie de nodos en /dev.

Se me ocurrió probar a usar QEMU para realizar la operación en mi propio PC, así que instalé qemu-static, copié qemu-arm-static al directorio /usr/bin del sistema Debian sin configurar, y lancé una sesión de shell dentro de ella con CHROOT en mi propio PC. Ahí el comando debootstrap/debootstrap –second-stage sí funcionó, así que procedí a comprimir el sistema ya listo y subirlo al móvil.

Ahora ya tenía un sistema Debian. O casi, porque cualquier intento de usar APT para instalar paquetes o actualizar la lista de programas fallaba con un error muy raro: no era capaz de resolver la dirección del repositorio:

root@localhost:/# apt-get update
Err:1 http://ftp.debian.org/debian sid InRelease
  Temporary failure resolving 'ftp.debian.org'
Reading package lists... Done
W: Failed to fetch http://ftp.debian.org/debian/dists/sid/InRelease  Temporary failure resolving 'ftp.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

Sin embargo, un PING o un WGET a dicha dirección sí funcionaba perfectamente, por lo que no parecía ser un problema de la red en sí. Probé a poner manualmente la IP en el fichero /etc/hosts y entonces el error pasó a ser otro:

root@localhost:/# apt-get update
Ign:1 http://ftp.debian.org/debian sid InRelease
Ign:2 http://ftp.debian.org/debian sid Release
Ign:3 http://ftp.debian.org/debian sid/main armhf Packages.diff/Index
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:5 http://ftp.debian.org/debian sid/main Translation-en.diff/Index
Ign:6 http://ftp.debian.org/debian sid/contrib armhf Packages.diff/Index
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:8 http://ftp.debian.org/debian sid/contrib Translation-en.diff/Index
Ign:9 http://ftp.debian.org/debian sid/non-free armhf Packages.diff/Index
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:11 http://ftp.debian.org/debian sid/non-free Translation-en.diff/Index
Ign:12 http://ftp.debian.org/debian sid/main armhf Packages
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Ign:14 http://ftp.debian.org/debian sid/contrib armhf Packages
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Ign:16 http://ftp.debian.org/debian sid/non-free armhf Packages
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Ign:12 http://ftp.debian.org/debian sid/main armhf Packages
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Ign:14 http://ftp.debian.org/debian sid/contrib armhf Packages
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Ign:16 http://ftp.debian.org/debian sid/non-free armhf Packages
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Ign:12 http://ftp.debian.org/debian sid/main armhf Packages
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Ign:14 http://ftp.debian.org/debian sid/contrib armhf Packages
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Ign:16 http://ftp.debian.org/debian sid/non-free armhf Packages
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Ign:12 http://ftp.debian.org/debian sid/main armhf Packages
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Ign:14 http://ftp.debian.org/debian sid/contrib armhf Packages
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Ign:16 http://ftp.debian.org/debian sid/non-free armhf Packages
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Ign:12 http://ftp.debian.org/debian sid/main armhf Packages
Ign:4 http://ftp.debian.org/debian sid/main all Packages
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Ign:14 http://ftp.debian.org/debian sid/contrib armhf Packages
Ign:7 http://ftp.debian.org/debian sid/contrib all Packages
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Ign:16 http://ftp.debian.org/debian sid/non-free armhf Packages
Ign:10 http://ftp.debian.org/debian sid/non-free all Packages
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Err:12 http://ftp.debian.org/debian sid/main armhf Packages
  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
Ign:13 http://ftp.debian.org/debian sid/main Translation-en
Err:14 http://ftp.debian.org/debian sid/contrib armhf Packages
  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
Ign:15 http://ftp.debian.org/debian sid/contrib Translation-en
Err:16 http://ftp.debian.org/debian sid/non-free armhf Packages
  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
Ign:17 http://ftp.debian.org/debian sid/non-free Translation-en
Reading package lists... Done
W: The repository 'http://ftp.debian.org/debian sid Release' does not have a Release file.
N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: Failed to fetch http://ftp.debian.org/debian/dists/sid/main/binary-armhf/Packages  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
W: Failed to fetch http://ftp.debian.org/debian/dists/sid/contrib/binary-armhf/Packages  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
W: Failed to fetch http://ftp.debian.org/debian/dists/sid/non-free/binary-armhf/Packages  Could not create a socket for 130.89.148.12 (f=2 t=1 p=6) - socket (13: Permission denied)
E: Some index files failed to download. They have been ignored, or old ones used instead.

Esto era otra cosa, claramente: por algún motivo, APT no conseguía permisos para acceder a la red. Parecía un problema de SELINUX, pero realmente estaba en modo permisivo, por lo que no debería estar fallando.

Tras rebuscar por todas partes, descubrí una entrada donde se comentaba el mismo problema para Kali-Rolling en Android: la clave parece estar en que el usuario _apt está en el grupo nogroup, y eso en Android supone no tener acceso a nada, ni siquiera a la red. Para solucionarlo, sólo tuve que editar el fichero /etc/passwd y cambiar el grupo de _apt de 65534 (nogroup) a 3004, que aunque es un grupo que no existe en mi sistema, es suficiente para que todo vuelva a funcionar como debe.

Nueva version del entorno Gentoo para WebTV

jueves, julio 30th, 2015

Acabo de subir a mi web la versión 2 del entorno de desarrollo Gentoo para el WebTV. Con ella ya debería ser posible instalar una versión decente de transmission. Ahora voy a empezar a trabajar en aplicaciones extra.

Peleandome con Python 3.4

jueves, julio 30th, 2015

Dado que quiero tener soporte para gnutls, tuve que cambiar el USE de mi distribución a:

USE="${ARCH} -pam -fortran -sanitize -iptables -static -systemd -mdev gnutls internal-glib -caps -filecaps -X -gtk -qt -tk"

Las siete últimas adiciones fueron para no añadir nada de entorno gráfico (pues no tiene sentido en el WebTV) y para asegurar de que las nuevas bibliotecas necesarias para incluir gnutls se puedan compilar. Hubo varios problemillas, pero uno a uno los fui resolviendo.

Por desgracia, el último escollo estaba en python. Cuando compilé el sistema la versión estable era la 3.3, pero ahora ya salió la 3.4. El problema es que se negaba a compilar, dando un error raro:

Python build finished successfully!
The necessary bits to build these optional modules were not found:
    _tkinter
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
Failed to build these modules:
    _socket               _ssl

Decía que se había compilado correctamente, pero emerge devolvía un error. Al principio pensaba que el problema estaba en tkinter, el módulo gráfico de python, pero no tenía sentido porque había especificado que no quería ni tk, ni X ni nada relacionado con un entorno gráfico. Entonces, revisando el log, vi que en medio de la compilación había este error:

/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.o
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c: In function 'makesockaddr':
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c:1175:14: error: dereferencing pointer to incomplete type
         if (a->can_ifindex) {
              ^
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c:1176:32: error: dereferencing pointer to incomplete type
             ifr.ifr_ifindex = a->can_ifindex;
                                ^
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c:1183:38: error: dereferencing pointer to incomplete type
                                     a->can_family);
                                      ^
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c: In function 'getsockaddrlen':
/tmp/portage/dev-lang/python-3.4.3/work/Python-3.4.3/Modules/socketmodule.c:1802:28: error: invalid application of 'sizeof' to incomplete type 'struct sockaddr_can'
         *len_ret = sizeof (struct sockaddr_can);
                            ^
building '_ssl' extension

¿CAN? ¿En el módulo de sockets? Bastante raro. Rebuscando encontré que, efectivamente, desde el núcleo 2.6.25 hay soporte para el bus CAN; sin embargo, mi núcleo (y sus cabeceras) es el 2.6.22. ¿Por qué se empeñaba en incluir soporte? Por otro lado, python 3.3 también trae de serie soporte para bus CAN, pero esa versión sí compilaba bien. ¿Qué estaba pasando?

Al final descubrí que el núcleo 2.6.22 tiene algo de soporte del bus CAN, pero parece que no el suficiente, y eso lía a python 3.4.

La solución que encontré fue editar el fichero /usr/include/bits/socket.h, y comentar la línea donde se define AF_CAN:

//#define AF_CAN PF_CAN

Y con eso, por fin, pude compilar absolutamente todo, listo para empezar a preparar el sistema que va a llevar definitivamente.

No puede caber aqui

miércoles, julio 29th, 2015

Llevo un par de días incapaz de actualizar el paquete binutils usando la emulación de mipsel sobre mi PC. Es una cosa misteriosa, pues daba un error al compilar el linker gold. Tras intentar hacerlo a mano, me devolvió como mensaje de error:

(for i in `seq 1 70000`; do 
  echo "int var_$i __attribute__((section("section_$i"))) = $i;"; 
done) > many_sections_define.h.tmp
make: execvp: /bin/sh: Argument list too long

¿Argument list too long? Un error bastante extraño, sin duda. Y más en el propio make. Encima, si eliminaba todo ese código y metía un simple echo, el error persistía. ¿Qué estaba pasando?

Tras probar de todo y rebuscar por todas partes, por fin encontré el problema: qemu define un tamaño máximo para la línea de comandos (MAX_ARG_PAGES) demasiado pequeño para compilar binutils, y por eso casca. Encima, dicho valor se define a piñón en el código fuente, por lo que la única solución consiste en bajarse los fuentes de qemu, modificar el fichero linux-user/qemu.h para aumentar a 64 o más las páginas reservadas para la línea de comandos (yo puse 129), y compilarlo todo con:

./configure --static --target-list=mipsel-linux-user
make

Con esto ya tendremos en mipsel-linux-user/qemu-mipsel el ejecutable estático, el cual podemos copiar dentro de la carpeta de nuestra máquina virtual como usr/bin/qemu-mipsel-static. Y con esto deberíamos ser capaces de compilar cualquier cosa.

(Si, el título es por esta escena 🙂 )

Actualizando la Gentoo del WebTV desde el PC

lunes, julio 27th, 2015

Siguiendo con lo que hice el otro día, ahora quería empezar a instalar cosas en el sistema Gentoo del WebTV. Por desgracia la cosa no es tan sencilla porque enseguida pide actualizar algunos paquetes, lo cual tarda mucho tiempo al hacer la compilación en el propio dispositivo. Y por si fuera poco, con alguno necesita tanta memoria que, directamente, casca a la mitad de la compilación.

Afortunadamente hay una forma de hacer todo esto directamente en un PC, pero haciendo creer al sistema Gentoo que está corriendo de forma nativa en un sistema Mipsel. Para ello sólo necesitamos QEMU.

Para empezar necesitamos el binario /usr/bin/qemu-mipsel-static, así que buscamos en qué paquete está disponible y lo instalamos en nuestro sistema. En el caso de Debian, el paquete es qemu-user-static. Este binario nos permite ejecutar binarios de la arquitectura deseada, pero (y esto es lo interesante) encaminando las llamadas al núcleo directamente al de la máquina física, con lo que no necesitamos compilar otro núcleo.

Ahora descomprimimos el fichero entorno_gentoo_mipsel.tar.bz2 en un directorio (por ejemplo, en /tmp), y descomprimimos en lugar adecuado (en nuestro ejemplo, en /tmp/bg_apps/usr) también el fichero de portage, tras bajarlo. Por último, copiamos /usr/bin/qemu-mipsel-static dentro de nuestro sistema mipsel (en nuestro caso, en /tmp/bg_apps/usr/bin/). Con esto hemos terminado los preparativos.

Ahora lanzamos nuestra sesión mediante:

sudo systemd-nspawn -u 1000 -D /tmp/bg_apps /bin/bash

De esta manera lanzamos nuestra sesión como usuario 1000 (que es el que usa el WebTV cuando se arranca una sesión en segundo plano). Además, gracias a que copiamos el binario de qemu, los binarios de mipsel se ejecutarán directamente, sin ningún problema, como si fuesen nativos de nuestro sistema (por increíble que parezca).

Una vez hecho esto ya podemos actualizar el sistema y demás, sin temor a quedarnos sin memoria y a mucha más velocidad. Pero echad un vistazo también a esta entrada posterior: http://blog.rastersoft.com/?p=1645.


Utilizamos cookies para garantizar que tenga la mejor experiencia en nuestro sitio web.