Posted tagged ‘kernel’

Android como Sistema Operativo

23 abril, 2019

Hola a todos,

Continuando con el curso de Android, les comparto ahora un material que nos habla de las características de Android como sistema operativo. Un sistema operativo es un software bastante grande, que se encarga de administrar todos los recursos del sistema, atender las ordenes del usuario y mantener sus aplicaciones en ejecución.

¿qué mecanismos usa Android para realizar administrar la ejecución de un dispositivo móvil?

Aquí el enlace a las notas: http://www.nachintoch.mx/teaching/mobile_dev/android-OS.pdf

Cómo usar una PC con Debian como punto de acceso inalámbrico a internet

8 agosto, 2017

Hola a todos!

Este quizá ha sido el post más difícil de redactar de entre todos los que he publicado en este blog. Antes de publicar tutoriales o manuales de cualquier tipo, siempre realizo los pasos que indico; principalmente cuando estoy experimentando o intentando hacer algo nuevo… Y en este caso, me topé con (¿casi?) todos los problemas que me pude haber encontrado… Al final del post dejaré una bociferación; no solo con el afán de desquitarme, sino también con la esperanza de ayudar a otros que pudieran tener los mismo problemas.

Este es un post particularmente útil para los usuarios de laptop; ya que las computadoras portátiles suelen tener más de una tarjeta de red y necesitamos que la PC a configurar como punto de acceso tenga más de una tarjeta de red. No importa cómo sean las tarjetas de red: sí cuenta con red celular, Wi-Fi, Ethernet; y tampoco importa cómo estén conectadas las tarjetas de red a la computadora; es decir, podemos usar una PC de escritorio con tarjeta ethernet tradicional y un “adaptador” Wi-Fi USB (lo que nos permite usar una PC de escritorio como punto de acceso WiFi) y como acceso a internet podemos usar una interfaz de red virtual USB creada al conectar un dispositivo Android que comparte red por USB.

Vamos a compartir internet usando una PC con Debian de forma muy similar a cómo se hace una “Zona WiFi portátil”  en Android. Antes de continuar, toma en cuenta que algunos gestores de red en Debian ya cuentan con una opción que automatiza este proceso, por lo que es conveniente verificar que puedas hacer esto de entrada con tu gestor de red.

 

 

 

El pase de diapositivas requiere JavaScript.


Bien, con esto dicho; empecemos por detectar las tarjetas de red con las que cuenta el equipo y cómo las reconoce (como las nombra) el sistema; de forma que podamos referirnos a ellas adecuadamente durante el proceso de configuración. Para esto, usamos el comando “lshw -class network”:

bash1

En el ejemplo anterior, podemos ver dos interfaces de red; cuya descripción se encuentra después de cada línea que únicamente dice “* network”. El comando nos proporciona cierta información útil para este procedimiento, como el nombre descriptivo de la interfaz, su identificador, su nombre virtual y su tipo.  Como podemos ver en la imagen, “eth0” es el nombre que recibe una interfaz de Ethernet y “wlan0” es una interfaz de WiFi.

Vamos a usar HostAP para proteger nuestra red inalámbrica, por lo que es necesario asegurarnos de que contamos con HostAP. También HostAP nos provee de un driver que nos ayuda a evitar problemas con la administración de la interfaz de red inalámbrica, pues no todos los drivers soportan actuar como punto de acceso inalámbrico. Sin embargo, existen casos donde no será posible configurar la tarjeta de red como punto de acceso inalámbrico por limitaciones de los dirvers o de la interfaz de red misma. Si tienes problemas al intentar seguir estos pasos, lo más recomendable es buscar si es sabido que tu tarjeta o “adaptador” de WiFi soporta funcionar como punto de acceso inalámbrico.

Así, para asegurarnos que tenemos todos los componentes necesarios, ejecutamos el siguiente comando (con permisos de super usuario):

# apt-get install iw wireless-tools hostapd bridge-utils

Ahora, debemos configurar HostAP. Abrimos el archivo /etc/default/hostapd y editamos la línea que inicia con DAEMON_CONF. Si está comentada (inicia con el caracter ‘#’), la descomentamos (quitamos el ‘#’).

Debe quedar así:

DAEMON_CONF="/etc/hostapd/hostapd.conf"

Ahora, el archivo al que apunta DAEMON_CONF puede no existir en su sistema. De hecho, este tutorial está hecho pensando en que el archivo /etc/hostapd/hostapd.conf no exista. Si existe, puede comentar o eliminar (bajo su propio riesgo) el contenido anterior, o crear un archivo nuevo y usarlo en lugar de hostapd.conf; por simplicidad, recomendaría crearlo en el mismo directorio /etc/hostapd

Debemos editar el arhcivo /etc/hostapd/hostapd.conf (o el que desee crear/editar), para configurar hostapd y definir nuestro punto de acceso inalámbrico. Sin embargo, aquí es importante hacer una observación aquí: la configuración recomendada por la mayoría, es hacer un puente de red usando una tarjeta de red virtual… Sin embargo, no todas los dirvers y no todas las tarjetas de red permiten crear este puente de red. Así que si esto no es posible, podemos dar la vuelta al problema usando redireccionamiento NAT como puente de red.

Si al intentar efectuar estas configuraciones, no podemos usar exitosamente nuestro punto de acceso inalámrico; podemos intentar buscar el mensaje de error:

can't add wlan0 to bridge br0: Operation not supported

Mediante los comandos:

# systemctl status networking.service
# journalctl -xe

Entonces lo más conveniente es usar la configuración con redireccionamiento NAT.


Si usamos un puente de red

Editamos /etc/hostapd/hostapd.conf de la siguiente forma:

interface=<wlan0>
bridge=br0
driver=nl80211
auth_algs=1
ignore_broadcast_ssid=0
logger_syslog=-1
logger_syslog_level=0
hw_mode=g
ssid=<Nachintoch-CT-WAP>
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=<"Si encuentras una SSID con el nombre "Nachintoch-CT-WAP" por allí, ten por seguro que esta no es la contraseña y esa no cuenta como software libre ;)">
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
  • En la primer línea; que dice “interface“, asegúrate de escribir el nombre adecuado de la interfaz de red inalámbrica que quieres usar como punto de acceso inalámbrico. En mi caso (y en la mayoría de ellos), es wlan0.
  • En la línea 9; donde dice “ssid”, escribe el nombre que quieres que vean los posibles usuarios de tu red inalámbrica.
  • En la línea 15, escribe la contraseña que quieres usar en tu red inalámbrica. Está contraseña está asociada a un cifrado WPA2, la cual es relativamente segura (cualquier cosa es mejor que WEP, ¿no?). Debe ser de al menos ocho caracteres, pero usar al menos 12 eleva bastante la seguridad y qué mejor que usar caracteres en mayúscula, minúscula, números, símbolos especiales y la sangre de un unicornio.

Ahora, vamos a definir el puente de red br0 que usamos en la configuración anterior pero no necesariamente existe. Una vez más, el tutorial está pensado en que br0 no existe. Si ya tienes un puente de red configurado, recomendaría crear uno nuevo (br1 por ejemplo). En estos casos, asegúrate de usar el puente de red que configures en el archivo /etc/hostapd/hostapd.conf en lugar de br0.

La configuración anterior puede hacerse una sola vez. La sigueinte debe modificarse cada vez que queramos definir el unto de acceso.

Para crear el puente de red, editamos el archivo /etc/network/interfaces. Agregamos lo siguiente:

auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 10.5.5.1
    netmask 255.255.255.0

auto br0
iface br0 inet dhcp
bridge-ports eth0 wlan0

Aquí es importante que sustituyas adecuadamente los nombres de las interfaces de red que estés usando: en mi caso, la salida a internet está asociada a eth0 y pretendo usar wlan0 como punto de acceso inalámbrico.

Además, si usas una configuración de Ethernet estática, debes cambiar la línea 3 para indicar la dirección IP que utilices; ya que si tu gateway no tiene DHCP configurado, no podrás conectar a Internet, y en consecuencia tu red inalámbrica actuará sólo como red local… Lo cual puede ser suficiente si solo quieres levantar un servidor de juego local o una red para un aula.

Es importante tomar en cuenta que no hemos configurado ningún servidor DHCP, por lo que la máquina que quieres usar como AP tiene una IP fija, no podrá proveer más direcciones para los demás dispositivos que se quieran conectar a la red inalámbrcia y los clientes no se podrán conectar automáticamente. Para sortear este problema, puedes crear una subred y configurar tu propio servidor DHCP dentro de la máquina. También puedes asignarles IP fijas si lo deseas; (casi) todos los dispositivos, incluso los Android, permiten cambiar la configuración IP dinámica en estática.


Si usamos redireccionamiento NAT

Editamos /etc/hostapd/hostapd.conf de la siguiente forma:

interface=<wlan0>
driver=nl80211
hw_mode=g
ssid=<Nachintoch-CT-WAP>
channel=11
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=<"Si encuentras una SSID con el nombre "Nachintoch-CT-WAP" por allí, ten por seguro que esta no es la contraseña y esa no cuenta como software libre ;)"> 
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

El resto de las configuraciones deberían funcionar sin mayor problema. Si tienes problemas con las configuraciones que sugiero, recomiendo que revises las capacidades físicas de tu adaptador de red inalámbrico y del driver; pues por ejemplo, quizá no soporta el modo “g”, pero soporta “a”.

Como en el caso de puente de red; podemos dejar la cnfiguración anterior para todas las veces. La siguiente debe efectuarse cada vez que se quiere definir el acces point.

Ahora, debemos configurar el redireccionamiento NAT. Para ello, damos en consola los siguientes comandos:

# iptables --flush
# iptables --table nat --flush
# iptables --delete-chain
# iptables --table nat --delete-chain
# iptables --table nat --append POSTROUTING --out-interface <eth0> -j MASQUERADE
# iptables --append FORWARD --in-interface <wlan0> -j ACCEPT
# sysctl -w net.ipv4.ip_forward=1

Lo siguiente es configurar un servidor DNS y DHCP. Podemos hacer esto como lo he detallado en post anteriores:

Nota: Para crear el access poont, levanté el servidor DHCP (y DNS) sobre la interfaz wlan0 en lugar de eth0 como hice en los ejemplos.


Debemos apagar el gestor automático de la red; pues vamos a usar la configuración fija que acabamos de describir. Para ello, ejecutamos el siguiente comando con permisos de súper usuario:

# service network-manager stop

Si usamos puente de red

Ahora, reiniciamos el servicio de red, limpiamos la configuración de la interfaz a usar como salida e iniciamos HostAP:

# service networking stop
# ip addr flush dev eth0
# service networking start
# service hostapd restart

Si usamos redireccionamiento NAT

Debemos definir; junto con la configuración de DNS y DHCP el modo de asignacón de IPs en la subred y de la interfaz de saida eh0.

Dejo aquí un par de archivos de configuración que puede ayudarlos a automatizar estas tareas:

http://www.nachintoch.mx/libraries/posix/wap-up.sh

http://www.nachintoch.mx/libraries/posix/wap-down.sh


¡Y listo! ahora nuestro equipo ha quedado configurado como un AP y podemos conectarnos a él desde otros. Si la configuración DHCP o IP es correcta también, tanto el equipo configurado, como los que se conecten a él, deberían poder acceder a internet.


Si usamos puente de red

Para terminar con el punto de acceso, debemos comentar las líneas que agregamos a /etc/network/interfaces:

# auto eth0
# allow-hotplug eth0
# iface eth0 inet dhcp

# auto br0
# iface br0 inet dhcp
# bridge-ports eth0 wlan0

Si usamos redireccionamiento NAT

Debemos eliminar la IP estática que hayamos asociado a la interfaz inalámbrica wlan0 y dar de baja el servidor DHCP y DNS.


En ambos casos, debemos comentar también la referencia al archivo de configuración de HostAP para evitar que se cree el puente de red br0 que puede interferir con la configuración de la tarjeta inalámbrica; por lo que comentamos la línea que creamos/editamos en /etc/default/hostapd:

# DAEMON_CONF="/etc/hostapd/hostapd.conf"

Si usamos puente de red; finalmente, restablecemos los servicios (estos son comandos en consola como súper usuario, no comentarios en un script) y damos de baja el puente de red:

# service hostapd stop
# service networking stop
# ip link set br0 down
# service networking start
# service network-manager start

Recordemos que podemos cambiar eth0; no solo por otra interfaz ethernet, si no por cualquier otra; como modem telefónico, 3G, o interfáz virual USB.


Antes de terminar, quiero compartir mi (frustrante) experiencia al escribir este post…

Antes de publicar cualquiera de mis tutoriales, verifico que su contenido sea correcto y realizo los pasos que describo para verificar que obtengo el resultado deseado. Así, puedo agregar comentarios y posible fallas y soluciones a problemas durante el procedimiento.

En este caso, no pude determinar concretamente qué me dio tantos problemas; si el software o el hardware, pues la tarjeta de red original de mi laptop era una Intel PRO/Wireless 3945ABG y pese a varias horas de esfuerzo, no logré ponerla en modo maestro… Aún desconozco si eran limitaciones del driver o del hardware.

Para que podamos configurar una interfaz de red cómo AP (access point), necesitamos que soporte dos modos: AP y master. Esto debe ser tanto por hardware como por driver. El dirver de Debian para esta tarjeta de red es el iwlegacy; contenido en el paquete iwlwifi; el cual NO es software libre, es provisto por Intel. Pero como es un dispositivo viejo, se cosidera obsoleto e Intel ya no le da mantenimiento… Como a mi ATI Raedon X1300… Gracias Nvidia e Intel, Linus Trovals ya ha hecho el gesto…

Busqué parches, intente cambiar las configuraciones que aquí exhibo, quise darle la vuelta al problema de muchas formas y ninguna me llevó a ningún lado (con la Intel 3945ABG). En todos los foros, la respuesta es “consigue otra interfaz de red” o simplemente no había respuesta; y eso que encontré foros de 2008, 2011… Me desesperé y mejor me puse a cocinar…

Mientras cortaba papas en cuadritos para un arroz que al final quedo bastante bueno; pero que necesitaba un poco más de sal, recordé que tenía una interfaz de red inalámbrica botada por allí…

Parece que a muchos de mis colegas les ofende que les pregunten si les pueden arreglar su compuatadora; a mi no me molesta: sí, si puedo, el precio es accesible y garantizo resultados. A veces de plano me dan máquinas descompuestas para vender por partes. Y en otras veces, yo mismo me quedo con piezas que pienso me pueden servir, porqué son piezas que suelo reemplazar en otras máquinas a reparar o que puedo usar yo mismo (en parte, ¡así es cómo he ido mejorando mi laptop!)

Recordé esto y buscando entre mis curiosidades, en efecto encontré una Qualcomm Atheros AR9285.

Regresé a mi escritorio y empecé a googlear de nuevo. Ambas tarjetas de red son PCI-Express; ¡bien! puedo insertarla en el puerto de la motherboard… Bueno, tuve esperanza de que funcionara por hardware, pues no encontré la lista negra ni blanca de interfaces de red inalámbrica soportada por la motherboard de mi equipo. Sin embargo, la Atheros tiene dos antenas y la Intel 3945ABG también es de dos antenas… Eso es buena señal de que puedan ser compatibles.

El driver de la Atheros viene incluido en el kernel de Linux y en Windows también, es bien sabido que soporta los modos AP y master… Empecé a creer que había encontrado la solución a mis problemas y luego empecé a desarmar mi laptop. Levanté el teclado y el horror: la Intel 3945ABG es una tarjeta PCI-Express de tamaño “normal” y la Atheros AR9285 es mini; y el puerto está sobre la motherboard sin otra placa de la que la pudiera sujetar… Pareciera que no podría reemplazarla… Luego, tuve una idea que aún creo es un poco “loca” pero que al final funcionó; y como decimos con mis colegas: si jala, ¡jala!

Bajo el puerto PCI-Express está el chip del bus norte, y las antenas tienen un cable bastante rígido. Así que conecté las antenas a la tarjeta, la inserté en el puerto PCI-Express y con cinta de aislar traté de pegarla al chip del bus norte y a una etiqueta a un costado del chip… ¡es en serio! Y para evitar que la tarjeta se levante o se mueva (por si fuera poco), puse una “plasta” de cinta de aislar de unos 4mm de altura bajo el teclado para que cuando lo cerrara, haga presión sobre la tarjeta y la termine de fijar en su lugar.

Aún tenía la duda de si la motherboard aceptaría la tarjeta, así que sin ensamblar el resto del gabinete de la portatil, la conecté al toma corriente y la encendí. Inicie sesión en Debian e inmediatamente me apareció una notificación diciéndome que “hay conexiones de red disponible”, ¡eureka! Debian reconoció la tarjeta inmediatamente como la interfaz wlan1. Hice lo mismo en Windows 7 y no tan inmediatamente, Windows también instaló los drivers de la AR9285. Funciona todo a la perfección, incluso el Bluethoot en ambos sistemas operativos.

Usando el contenido de este post, volví a configurar HostAP y etc/network/interfaces tal y como aparecen aquí, ejecuté los comandos para reiniciar los servicios y.. nope… no jaló… pero no iba a darme por vencido tan fácilemnte.

Depurando los problemas que tuve; descubrí que desde cierta versión del kernel de Linux, ya no es posible poner una tarjeta ath5 en un puente de red. Así que pensé inmediatamente, bueno; si el kernel no quiere que establezca un puente de red, usaré NAT. Así nació el post para usar una laptop como “adaptador inalámbrico” y con un poco más de esfuerzo, logré establecer un “puente” entre las interfaces eth0 y wlan1 y crear mi AP; unos dos o tres meses después de que empezara a jugar con esto.

¡voalá! por fin pude conectarme a mi nueva red local inalámbrica desde mi celular. No he probado conectarme a una red de 5GHz (pues la AR9285 soporta WiFi n, cosa que no podía la Intel 3945ABG), tengo entendido que las antenas no necesariamente van a darme toda la latencia de los 5GHz (pues la tarjeta original no la soportaba y quizá las antenas no estén diseñadas para eso), pero también es posible que sí, ya que la fecha de manufactura de esta laptop fue cuando el estándar n comenzaba a ganar presencia (en 2006).

Y bueno, ¿qué aprendí? Las tarjetas de red inalámbricas de Intel viejas, no pueden configurarse como AP y siempre hay forma de usar una tarjeta PCI-Express mini en un “slot” de tamaño tradicional. Tengo entendido que en el peor caso; que la tarjeta quede mal colocada o que la motherboard no la soporte, el riesgo de que la tarjeta o el equipo sufran daños, es mínimo; así que creo que vale la pena intentarlo.

Llevo ya aproximadamente dos meses usando este “hack” para instalar la tarjeta de red y no hay señales de que malfuncione o se esté desconectando; al contrario, creo que funciona mejor la vieja Intel.

Bueno, ya, ya me desquité. Estoy feliz porqué el próximo semestre podré usar todas las herramientas de colaboración en el laboratorio de forma más eficiente para los alumnos.

Si estás interesado en conocer el procedimiento para sustituir la tarjeta de red en una máquina como en la mía, estoy trabajando en un post al respecto que aparecerá en el futuro.


Que el límite sea la imaginación… Y el alcance del WiFi pese a la interferencia que causan los muros y los muebles…

Memory Rhapsody: un tributo a la nerdancia

30 marzo, 2017

Hola a todos!

En un intento más por parecer divertido; hace ya un año o más, escribí después de una noche de insomnio forzado (que casi no me tocan) esta adaptación del eterno clásico de Queen “Bohemian Rhapsody”; donde el personaje le anuncia a su madre que debe huir y esconderse por haber asesinado a alguien de un disparo y comienza a suplicara por su libertad mientras expresa su miseria y arrepentimiento.

Aquella noche de insomnio forzado, trabajaba en un programa en C que resolvía el problema del consenso para dos procesos (procesos de UNIX reales y no nada más los que se pueden modelar con hilos o procesos ligeros). Aprendí varias cosas aquella noche; cómo porqué no siempre es buena idea permitir que el compilador optimice ciertas variables o que usar registros como memoria compartida es mala idea. Pueden ver el post que publiqué en su momento aquí.

A la mañana siguiente; iba con el miedo de quedarme dormido en el metro y darle varias vuelta a la ciudad, cuando debería de haber estado en el trabajo. Así que tenía que mantener la mente suficientemente ocupada como para no dormirme sin un expendio de café a la redonda. No podía dejar de pensar en lo que había estado haciendo durante la noche mientras escuchaba música. En eso, escuché Bohemian Rhapsody y no pude evitar imaginar que el personaje era un proceso pidiendo clemencia al sistema operativo por haber efectuado una operación ilegal; y después empieza a expresara que su miseria se origina en sus “errores de programación”… Y así fue, como escribí esta burda adaptación “Memory Rhapsody”.

Espero les guste y les cause una sonrisa; como a mi siempre me la causa la oración al C.

Is this a real space? Or is just a null pointer? Caught in a bus flow, No escape from user misspells.

Open a file, Look for a EOF, And read…

I’m just a user process, I need no privileges.

Because I easy fork, Easy goto, Little time, Little address.

Any way the scheduler works, Doesn’t really bother to me, To me.

Papa, Just kill a child, Call a kill against his will, System accepted, now its dead.

Papa, Processor time had just begun, But now I’ve created a system inconsistency.

Papa… Oh… Didn’t meant to SEGFAULT, If I’m not responsive again next round.

Carry on, carry on, As if were hosted by Windows…

Too late, The ticks are gone, SYSTERM returned successful, Messages run down through my pipe.

Goodbye whole system, I’ve goto, Gotta leave behind a corrupted memory.

Papa… Oh… I don’t want to die, Sometimes I wish I’ve never been forked at all…

I see a little siluetto of a thread, Scaramouche Scaramouche will you do the system call?

5 to 0 V very very frightening me! Dennis Ritchie! Dennis Ritchie! Dennis Ritchie let me go! Magnifico!!

I’m just just a user process, No body loves me, He’s just a user process, from a user application, Spared from the system by his coding errors!

Easy goto Easy return, Will you let me go?

Bismillah no! Do you think this’ NT? Let me go! Bismillah no!

Kernel’ll no let you go! Bismillah no! Kernel’ll no let you go! Let me go… No! No! No! No! No! No! No!

Oh papa mio papa mio, Papa mio let me go…

Beelzelebub has a loader aside for me, For me, for me, for me!

So you think you can block me and change my stats?

So you think you can instance me and let me to die?

Oh! System! Can you do this to me system?

I just wanna get out I just wanna get messaged remotely

Oh… Oh yeah! Oh yeah!

Nothing really bothered me… Any one can read.

Nothing really matters, Nothing really matters to me…

Any way the scheduler works…


A %d blogueros les gusta esto: