tag:blogger.com,1999:blog-57571337195653872452024-03-05T19:39:40.888-03:00equiscentricoAnálisis, opinión y noticias sobre Código Abierto y la Cultura LibreMatías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.comBlogger141125tag:blogger.com,1999:blog-5757133719565387245.post-34015212429776862202023-12-08T21:18:00.010-03:002023-12-24T19:34:50.365-03:00Arthur McBride: una historia de Navidad. Lo global en resguardo de lo local <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmoqLNM4ei79cpjQff5nXL3hzDbQceqcg_M68gNtSLvkAcULZ6PU4Da3klxoTzF3gT6JdI8VOVMoyqJawjRU5D7nEB-KTjwwuxa1gvJkhZatNFs_AfbMsiDqyKAjdIqqO7MCRBqj7bERRf0zPPmLagqyDfxsON65OW5XFleZFI-u2ZQY5kTrDzxMflKz8/s1280/photo_5158935616275197185_y.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="960" data-original-width="1280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmoqLNM4ei79cpjQff5nXL3hzDbQceqcg_M68gNtSLvkAcULZ6PU4Da3klxoTzF3gT6JdI8VOVMoyqJawjRU5D7nEB-KTjwwuxa1gvJkhZatNFs_AfbMsiDqyKAjdIqqO7MCRBqj7bERRf0zPPmLagqyDfxsON65OW5XFleZFI-u2ZQY5kTrDzxMflKz8/s320/photo_5158935616275197185_y.jpg"/></a></div>Se acerca Navidad. A lo largo de la historia, la música folclórica tuvo a la Navidad como un tema que siempre ha sido central.
Hoy revisamos una historia de Navidad algo diferente, la que narra la canción tradicional, presumiblemente de origen irlandés titulada "Arthur McBride".
<span class="fullpost">
<br />A principios de 1993 compré una copia del CD de Dylan que llevó por título "Good As I Been to You". Aquel disco, el número 28 en la carrera del músico fue el primero en su carrera en contener únicamente versiones de canciones folclóricas, algunas de ellas irlandesas, otras británicas, de la tradición del bluegrass y del blues de los '20 y '30. <br />
En aquel tiempo, habían pasado solo un par de años desde que escuchara a Dylan por primera vez en vivo, en el show que se hizo en el estadio Obras. <br />
"Good as I Been to You" borra los rastros de los orígenes de las canciones, algo que Dylan se encargó de hacer durante los siguientes treinta años y que le rindió enormes dividendos musicales. A menudo la crítica ha dicho que discos de Dylan como el mencionado, al igual que el que le siguió, "World Gone Wrong" fueron meros "rellenos" en su carrera, grabaciones que él hizo para cumplir sus obligaciones contractuales, bebiendo de las fuentes de la tradición sin demasiado esfuerzo compositivo. <br />
Sin embargo esos argumentos pasan por alto todo lo que una nueva versión, un cover tiene de nueva composición. Eso es en efecto lo que Dylan empezó a desarrollar a partir de entonces: a transfigurar <i>a piacere</i> la tradición, del blues, el bluegrass, las baladas irlandesas, etc. <br />
Quizá el efecto de ocultar sus orígenes antiguos es disco abra toda una serie de conexiones musicales, muchas de las cuales, al menos a mí en aquel tiempo me resultaban desconocidas. <br />
Años después Internet permitió unir algunos de los puntos que conectan esas distintas tradiciones. <br />
Me detengo hoy en una de las canciones del álbum, "Arthur McBride" con la excusa de su tema navideño. O, podría decirse solo lateralmente navideño. La voz que narra la historia de "Arthur McBride" sitúa los hechos en la mañana de Navidad, en alguna costa de Irlanda, presumiblemente. Porque la canción no habla de la Navidad, sino del violento encuentro entre dos jóvenes de a pie (Arthur y su primo) y dos oficiales del ejército (presumiblemente británico). Lo que no debía ocurrir una pacífica de Navidad, finalmente ocurre. <br />
Ya en la primera estrofa se establece el marco espacio temporal donde transcurrirán los hechos: <br /><br />
"Oh, me and my cousin one Arthur McBride <br />
"As we went a-walking down by the seaside<br />
"Now mark what followed and what did betide<br />
"For it being on Christmas morning".<br />
<br /><br />
"Mi primo, un tal Arthur McBride y yo <br />
"Mientras caminábamos a lo largo de la playa <br />
"Ahora, miren lo que siguió y lo que ocurrió <br />
"Por haber sido en la mañana de Navidad". <br /><br />
"Out for recreation we went on a tramp <br />
"And we met sergeant napper and corporal vamp <br />
"And the little wee drummer intending to camp<br />
"For the day being pleasant and charming".<br />
<br /><br />
"Salimos para pasar el rato y caimos en la tampa / <br />
"Nos encontramos al sargento Napper y al cabo Vamp / <br />
"Y un tamborillero pequeñito quienes querían acampar <br />
"Por ser un día agradable y encantador". <br /><br />
Ese es el espacio y los personajes de esta historia. Acto seguido el sargento los saluda y rápidamente intenta convencer a los jóvenes acerca de las bondades de la vida militar, como para que se unan a las filas. A lo que el narrador responde:<br />
<br />
"Sin ánimo de ofender, pero con ganas de seguir de largo, <br />
"Por ser la mañana de Navidad". <br />
<br />
Estos versos dan que pensar que Arthur y su primo eran gente propensa a la riña, pero que se estaban comportando aquella mañana de Navidad. <br />
<br />
"Un soldado siempre lleva una vida muy buena <br />
"Y siempre es bendecido por una joven y adorable esposa <br />
...
"Un soldado siempre se ve limpio y decente <br />
"siempre se lo ve con las más finas ropas <br />
"Mientras que otros van sucios y andrajosos <br />
"y apenas si toman algo de avena en la mañana". <br />
<br />
<br />
Con esto los muchachos irlandeses se sienten ofendidos y Arthur responde que no tienen ningún admiración por las vestimenta de los militares y no tienen ninguna intención de enlistarse, porque disfrutan de la vida libre y despreocupada. <br />
<br >
"No nos interesa tomar su adelanto" (El sargento les había ofrecido diez guineas de oro si se enlistaban) <br />
"No trocaríamos nuestra suerte por un montón de riesgos y peligros <br />
"Ustedes no tendrían escrúpulos en mandarnos a Francia <br />
"Donde nos matarían de un tiro sin ningún aviso". <br /><br />
De allí en más la animosidad entre ambos grupos va en aumento y el sargento amenaza a Arthur que si lo insulta con alguna palabra más les mandaría a cortar la cabeza la mañana siguiente. <br />
Con sigilo, los irlandeses se quitan sus capas, y blanden en silencio pero firmemente sus <i>shillelaghs</i><b>*</b>, antes de que el sargento y el cabo llegaran a desenvainar sus espadas los nobles <i>shillelaghs</i> irlandeses cayeron sobre sus cabezas. Acto seguido patean el tambor del niño tamborillero. <br />
Las espadas de los militares las arrojaron al mar, tan lejos como pudieron y Arthur gritó "Llévenselas, demonios". Y para concluir la disputa, dejan a esos dos como "un par de sacos húmedos en la orilla". <br />
<br /><br />
La versión de "Arthur McBride" de Dylan del '92 se basa sin ocultamientos en la que grabara Paul Brady, un músico irlandés que grabó la canción a mediados de la década de los '70.<br />
Brady nació en Belfast, Irlanda del Norte, pero se crió en un pequeño pueblo rural, cercano a la frontera con el condado de Donegal, perteneciente a la república de Irlanda <br />
Entre las diversas teorías de los orígenes de "Arthur McBride" algunas versiones la ubican justamente en el condado de Donegal, si bien, como toda canción folclórica viajó de aquí a allá, modificándose a lo largo del camino. <br />
Pero Brady no descubrió la versión que grabó en Irlanda, sino en los Estados Unidos, mientras estaba en un viaje en 1973. Allí un amigo le compartió un libro titulado "A Heritage of Songs", en el que que Carrie Grover, natural de Nova Scotia, recopiló un cancionero popular que había escuchado de sus padres. El libro tuvo una tirada sumamente escasa de ejemplares. <br />
Grover, se estableció más tarde en el estado de Maine, en los Estados Unidos, y entró en contacto en los años '40 con Alan Lomax, el etnomusicólogo que siguiendo los pasos de su padre, John Lomax Sr., realizó una multitud de grabaciones de campo a lo largo y ancho de los Estados Unidos y que pasaron a formar parte para siempre del acervo de la Biblioteca del Congreso de los Estados Unidos. <br />
Brady no escuchó la grabación<i> a capela</i> de Grover hecha por Lomax, sino que solo leyó "A Heritage of Songs". Por tanto, los arreglos son de su propia autoría. Algunas palabras de la versión de Grover le resultaban incomprensibles, de modo que Brady las retocó a su estilo. <br />
Algunos pueden hacer una "escucha" nacionalista de "Arthur McBride" en donde los irlandeses resistirían el poderío de los británicos. Sin embargo, esa lectura no aparece habilitada de forma explícita, por lo menos en la letra que nos llega por vía de Grover. Más bien, como se sugirió, los muchachos irlandeses parecieran ser en ocasiones pendencieros, pero que aprecian su libertad individual y la vida despreocupada. Como alguien escribió "Arthur McBride" es una "canción belicosamente pacifista".<br />
"Arthur McBride" es una canción folclórica con siglos de vida. Parece ser apenas eso, una canción, pero también es un documento que está allí para decirnos muchas cosas más. <br />
Antes que leer la canción en clave nacionalista, se pueden extraer algunas otras conclusiones: desde que se viene hablando acerca de la "globalización", se insiste en que lo "global" matará lo "local", "aquello matará a esto", parafraseando al Victor Hugo de Nuestra Señora de París. Pero en este caso el recorrido que parte de Grover, en Canadá, llega a Brady, vuelve a América vía Dylan y las conexiones se multiplican. Nótese que Brady no descubre la canción en su tierra natal, de donde habría surgido inicialmente. Lo "local" fue conservado -con las alteraciones del añejamiento que el tiempo inexorablemente impone- gracias al reservorio del libro y la grabación. El reservorio de la memoria de Grover en Canadá. Gracias a la publicación y a la grabación de Lomax se produce nuevamente el salto de lo "local" a lo "global". En el caso de "Arthur McBride", como de seguro en muchísimos otros, lo "global" terminó por salvar a lo "local". <br />
<br />
<br />
------<br />
(*) "Shillelagh" era un bastón hecho con madera de endrino, el cual se utilizaba en el campo en Irlanda, no solo de ayuda para caminar, sino que también se lo usaba para batirse a duelo y resolver disputas. Véase entrada <a href="https://en.wikipedia.org/wiki/Shillelagh" target="_blank" rel="nofollow">Shillelagh</a> en Wikipedia.
Fuentes: <br /><br />
<a href="https://youtu.be/ZemDjFW_2Ko?si=XrvYv3jkMMXD5yiG" target="_blank" rel="nofollow">Paul Brady: "Arthur McBride" [Dylan's Eightieth Birthday celebrated from Ireland]</a><br />
<a href="https://youtu.be/j9K8OuhNsnc?si=QjS1Wjffgws7C6Gs" target="_blank" rel="nofollow">Bob Dylan: "Arthur McBride"</a> <br />
<a href="https://en.wikipedia.org/wiki/Arthur_McBride" target="_blank" rel="nofollow">Entrada "Arthur McBride" en Wikipedia</a><br />
<a href="https://blogs.loc.gov/folklife/2015/12/paul-brady-carrie-grover-bob-dylan-and-arthur-mcbride/" target="_blank" rel="nofollow">Winick, Stephen (24 December 2015). "Arthur McBride, Carrie Grover, Paul Brady, and Rosanne Cash: More About a Classic Song". Folklife Today. Library of Congress. ISSN 2692-1731</a><br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-6229326998686534452023-06-25T20:42:00.005-03:002023-06-26T09:43:34.036-03:00Los 40 años de "Juegos de Guerra": la película que nos hizo soñar con la computadora<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqUQFU3MBfOj9CX5uZoWgHrYqi6ZdcbHphfnhuKeICddrmJtFgzuaVaZg6qmkJgkOOCskWj5pN9b4u7DmsVNEdCqB7XcR93ZZhcjUfKFB-Lf_5Cnhrwje-LSbgXXlnYf4h4EKwe_EggQE_VznRHELNOaco1vUweNYa_3fNRYPxUs2QckioBY5KngApNVI/s1000/wargames_war_games-169101753-large.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" height="320" data-original-height="1000" data-original-width="666" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqUQFU3MBfOj9CX5uZoWgHrYqi6ZdcbHphfnhuKeICddrmJtFgzuaVaZg6qmkJgkOOCskWj5pN9b4u7DmsVNEdCqB7XcR93ZZhcjUfKFB-Lf_5Cnhrwje-LSbgXXlnYf4h4EKwe_EggQE_VznRHELNOaco1vUweNYa_3fNRYPxUs2QckioBY5KngApNVI/s320/wargames_war_games-169101753-large.jpg"/></a></div>Este mes de junio de 2023 se cumplieron 40 años del estreno de la película "WarGames" o "Juegos de Guerra", como se la conoció en países de habla hispana. La película capturó con acierto los momentos en que la computadora se estaba volviendo "personal" y nos sumergió en un largo sueño digital: querer tipear en un teclado de una computadora, entender de qué se trataba todo aquello. Cuarenta años después sigue siendo un filme de culto, que vale la pena volver a ver. Algunos temas de la película tienen hoy un valor muy actual, como la Inteligencia Artificial.
<span class="fullpost">
<br />
Alguien alguna vez escribió que salir del cine (dejar el recinto de la sala para salir a la calle) guarda alguna similitud con el despertar de un sueño: el cuerpo, que por un cierto tiempo se ha sometido a un estado submotricidad, se pone lentamente en movimiento. En el paso del sueño a la vigilia intentamos a veces perdurar el sueño si aquel fue placentero, de la misma forma que para nosotros "reproducimos" internamente algo de las imágenes que por cierto tiempo se han desarrollado frente a nuestra vista cuando dejamos el cine. <br />
En 1983 yo tenía nueve años, estaba en cuarto grado de la escuela primaria. Tan solo un año antes había sido la trágica experiencia colectiva de la guerra de Malvinas. En Buenos Aires "Juegos de guerra" se estrenó a principios del mes de julio de 1983. <br />
Mi padre me llevó a ver la película a un cine del Centro un domingo de aquel invierno, pudo haber sido el cine Metro de la avenida Cerrito. Liberados ya de la tensión del relato en virtud del final catártico, cuando a la tardecita dejamos la sala ya era noche cerrada. El "sueño" del relato cinematográfico terminaba, volvíamos a la vigilia de la vida cotidiana, sin embargo la película consiguió construir en muchos de nosotros, apenas niños por entonces, el deseo desesperado de poner nuestras manos en una computadora real. Por largos años, echamos mano a todo aquello que pudiera seguir alimentando ese sueño: libros, revistas, etc. <br />
Cinematográficamente hablando 1983 fue un año fecundo: se estrenaron, entre otras, "El regreso del Jedi", "007: Octopussy" y "Rambo". Todas ellas siguen siendo buenos clásicos, cuarenta años después. Pero "WarGames" creo que consiguió algo más: años después se convirtió en una película de culto porque condensó emotivamente de una forma muy poderosa el momento en que la computadora estaba volviéndose "personal". Tarde o temprano, el sueño de tener una computadora (poco importaba cuál) en nuestros cuartos podría hacerse realidad. Si eso estaba ocurriendo en los países centrales, tenía finalmente que ocurrir en los nuestros también.<br />
De un primer vistazo "Juegos de guerra", pareciera tener todos los elementos necesarios para llegar a una audiencia de adolescentes, es sin dudas una "película para adolescentes", sin embargo terminó trasponiendo las fronteras demográficas de ese público acotado. Se transformó en un filme de culto. Algunas de las técnicas usadas en la película como el <i>war dialing</i> terminaron inspirando las técnicas de ciber seguridad, cracking y hacking "etico" que se desarrollaron posteriormente. <br />
En la pantalla chica de la tele (solo había cuatro canales) y uno que desde la ciudad de Buenos Aires se veía siempre con algo de "lluvia" y "fantasmas" (literalmente) porque era de la ciudad de La Plata. El año siguiente, 1984, se realizó en los Estados Unidos una serie llamada "Whiz Kids", la que la televisión local emitió en su totalidad (solo duró una temporada), y que en castellano se llamó "La pandilla de la computadora". La serie fue una derivación <i>ex profeso</i> de "Juegos de Guerra", en la que la computadora, los modems y el acceso a sistemas remotos ocupaban un lugar central en esa ficción televisiva. <br />
Las revistas que de a poco llegaban desde los Estados Unidos, como <i>Byte</i> o <i>Rainbow</i> que se exhibían en los kioscos "grandes" de la ciudad y las que pronto empezaron a aparecer en español, como <b>Programación Popular</b> o <b>K64</b>, que vieron la luz en el año 1984, nos hicieron perdurar el sueño de teclear sobre las teclas de una computadora real.<br />
<br />
<br />
<b>Esa máquina: IMSAI 8080</b>
<br />
<br />
La computadora de David Lightman, el personaje principal de "WarGames" que protagonizó Mathew Broderick era una IMSAI 8080, contaba con una doble unidad de discos floppy, una terminal, el modem se acoplaba físicamente a un teléfono de "Ma Bell" por medio de un acoplador acústico. Para el año 1983 la computadora era algo obsoleta: se había dejado de producir en 1978. <br /> Para 1983 la PC de IBM estaba comenzando a abrirse paso (terminaría de hacerlo por completo cuando proliferaron los clones). La computadora personal por excelencia en 1983 era la Apple II, una creación de Steve Wozniak y el producto primogénito con el que Apple levantó vuelo. <br />
La IMSAI podía parecer algo vetusta para 1983, pero resultaba icónica. Su panel central de "blinkenlights" (en el argot hacker, "lucecitas titilantes") le daba un indudable aire "hacker", en el antiguo sentido del término. La IMSAI fue uno de los primeros clones de la historia: el fabricante (IMS Associates Inc) "clonó" la computadora de su principal competidor, la Altair 8800, que fabricó desde mediados de los '70 la firma MITS de Nuevo México. En un principio esa compañía vendió la computadora como un kit, que los usuarios debían ensamblar. Para proveer al incipiente mercado de hobistas con un lenguaje de programación interpretado y de alto nivel, los jóvenes Paul Allen y Bill Gates consiguieron escribir un intérprete basic que pudiera correr en los escasos 4K de ram de la Altair. Así fundaron, en Albuquerque, Nuevo México, cerca de la fábrica de Altair la firma <b>Micro-Soft</b>. Con el tiempo el guión intermedio desaparecería y la empresa se establecería definitivamente en Redmond, en los suburbios de la ciudad de Seattle. <br />
Altair o IMSAI, ambas máquinas buscaban satisfacer el incipiente mercado de hobistas que estaban buscando hacer realidad el sueño de la computadora personal, una máquina que cualquiera de nosotros pudiera tener en su casa. Porque hasta entonces, la computadora era un bien escaso y solo accesible para universidades, grandes empresas o ciertas organizaciones estatales en los países centrales. <br />
A principios de los años '70, en Menlo Park, en el llamado Silicon Valley se estableció el <i>Homebrew Computer Club</i>, allí confluyeron la mayoría de los pioneros de la llamada "micro-computadoras": Steve Wozniak, Steve Jobs, Lee Felsenstein, Thomas Fischer, Nancy Freitas (ambos empleados y luego dueños de IMS Associates/IMSAI), entre otros. Firmas como Apple, IMSAI, Cromenco entre otras derivaron de las reuniones de esa comunidad DIY ("hágalo usted mismo"). <br /><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUwG464STOLHKyZg0kvp3fuvLS5zvQiYzBPXVK9b387kH3epRpGhiZ7SEbtJvMXWfAT16NIMMLisGgAPzkY4rnmj_b-wyXVZt_hX38EtR_LoXttjW8k1u0RWA5QszH2Ym5-G3zFtykZXpd5-GZT-i01XiWAIOhLfBzw5Wxje1QVqFP1uwsm3XZrneJGp0/s890/imsai8080.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="455" data-original-width="890" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUwG464STOLHKyZg0kvp3fuvLS5zvQiYzBPXVK9b387kH3epRpGhiZ7SEbtJvMXWfAT16NIMMLisGgAPzkY4rnmj_b-wyXVZt_hX38EtR_LoXttjW8k1u0RWA5QszH2Ym5-G3zFtykZXpd5-GZT-i01XiWAIOhLfBzw5Wxje1QVqFP1uwsm3XZrneJGp0/s320/imsai8080.jpg"/></a></div>
La arquitectura de la Altair 8800 (que al igual que la máquina de David en el filme estaba equipada con un procesador Intel 8080), se basó en el bus S-100. Ese mismo bus fue un estándar de facto en aquella primera generación de computadoras personales: la Altair y la IMSAI, pero también la Apple II. Esa arquitectura abierta hizo de aquellas computadoras un hardware abierto para el que otras empresas pudieron desarrollar placas de expansión y periféricos. Al igual que la Apple II la IMSAI resultaba altamente "customizable" y el usuario entusiasta (hacker) tenía al alcance de sus manos la potencialidad de expandir su hardware. <br />
La IMSAI 8080 fue de las primeras máquinas en utilizar el sistema operativo CP/M, escrito por David Kildall, que luego sería la inspiración para el conocido DOS. <br />
La IMSAI de David (Mathew Broderick) era una computadora para entusiastas, "entendidos" o hackers. No era como la Apple II, un dispositivo listo para que el usuario conectase y encendiese tan fácilmente como un electrodoméstico más. Su display de "Blinlenlights" resultaba además visualmente atractivo. Al igual que el display de la computadora del NORAD/DoD, denominada en la ficción como WOPR (<i>War Operation Plan Response</i>), y que se pronunciaba igual que la hamburguesa de Burger King. <br />
A partir del hardware del cuarto de David, de los motivos visuales que se le aparecen al espectador en pantalla: ese "setup" de IMSAI, terminal, floppy, etc se puede decir que el personaje de Broderick es una representación fílmica de una generación de hackers que siguió a los pioneros de los microprocesares de 8 bits, del <i>Homebrew Computer Club</i>. Con ese personaje nos podíamos identificar plenamente, él era uno de los primeros usuarios de esas primeras computadoras "personales". Uno de nosotros, o aquello a lo que aspiraríamos a ser. <br />
<br />
<br />
<b>David Lightman</b>
<br />
<br />
En <b><i>WarGames</i></b> no hay mención explícita del término "hackers". Si bien se puede inferir en base al hardware que David, el personaje encarnado por Mathew Broderick, tenía conocimientos bastante avanzados, y una red de amigos "hackers", a quienes consulta sobre <i>backdoors</i> y recopila datos que le servirán para la principal técnica que utiliza para introducirse en sistemas remotos, la denominada "ingeniería social". Para conseguir la contraseña del usuario del profesor Falken David realiza una cuidadosa investigación en base a datos públicos sobre la vida del profesor.<br />
Pero otro de los rasgos de la personalidad de David es el hecho de ser un <i>gamer</i>. Lo vemos jugando al Galaga en un arcade antes de entrar a clase. Su motivación principal para hacer el "war dialing", es decir, la búsqueda ya sea por fuerza bruta o guida, realizando llamadas hasta que un modem responda. Esa técnica debía estar acompañada por el tono de 2600 Hz que descubrieron los <i>phreaks</i> (hackers de la red telefónica estadounidense). Aquel descubrimiento les permitió hacer llamadas de larga distancia a un costo cero. <br />
La principal motivación de David, para nada contradictoria con su "estilo" hacker, es el <i>gaming</i>. Por la vía del escaneo de los teléfonos de una localidad ("war dialing") David busca conectarse a la computadora (nótese que aún no se las denominaba "servidores") de una compañía de video juegos, que se preparaba para lanzar un nuevo título al mercado. Él tenía que jugar a ese juego. <br />
Una de las características del modo de hacer "hacker" es que la frontera existente entre el trabajo y el juego se desdibuja, porque el hacker está haciendo algo que encuentra inherentemente divertido y desafiante. <br />
<br />
<b>Los primeros ecos</b>
<br /><br />
El programa televisivo "The Computer Chronicles" (en lo sucesivo, TCC) se emitió desde 1983 hasta 2002 por la cadena televisiva pública estadounidense, PBS. El programa semanal tuvo como presentadores y columnistas a profesionales destacados del Silicon Valley. La emisión del 26 de marzo de 1984, poco más de medio año después del estreno de la película y solo dos meses después de que comenzara la primera temporada del programa, tuvo como tema central "Computer Security" ("la seguridad de las computadoras"). Para quien vea retrospectivamente el programa, resultará evidente que el traje y la corbata eran por lejos la vestimenta obligada en aquel tiempo. Sin embargo, el argot de ciberseguridad ya estaba allí, con muchos de los términos que aún siguen usándose en la actualidad. <br />
<br />
De esta forma comenzaba la emisión de TCC del 26 de marzo de 1984: <br />
<br />
<blockquote>"En nuestro programa de hoy estaremos conversando acerca de los problemas de la seguridad de computadoras. Imagino que a esta altura la mayoría debe haber oído acerca de la película 'Juegos de Guerra' y los diferentes tipos de problemas de seguridad que presenta la historia del film, pero tipicamente los problemas de seguridad de computadoras no suelen implicar cosas tan espectaculares como una guerra nuclear sino cosas mucho más mundanas, como el robo de dinero o información".
</blockquote>
<br />
WarGames y la técnica de <i>war dialing</i> que David utiliza en la ficción aparecen como ejemplo de cómo podrían operar los <i>crackers</i> del mundo real. En aquella emisión de TCC no se hablaba acerca de redes, sino que el objetivo de los intrusos o delincuentes era la "computadora", que todavía no se había convertido en "servidor" o "clientes". <br />
La visión técnica o hacker de WarGames no hizo foco en los riesgos y temores globales acerca de un conflicto nuclear sino en las técnicas de descubrimiento de objetivos y acceso no autorizado a sistemas remotos. Los presentadores se referían a "hackers" como personas que intentaban romper las credenciales de sistemas de tiempo compartido para conectarse a ellos.<br />
La comunidad técnica veía WarGames como una forma de explorar accesos genuinos y de otro tipo a un recurso que si bien comenzaba a convertirse en un bien accesible, continuaba siendo un recurso escaso: la computadora. Esta visión de la película tal vez descuidó dos de los otros temas que la película trataba: los videojuegos y la inteligencia artificial. Aunque pueda resultar extraño, la IA era un tema de moda en 1984, quizá tanto como lo es hoy, cuarenta años después. De hecho la emisión siguiente del programa TCC estuvo dedicada a la inteligencia artificial, y tuvo entrevistados como John McCarthy, pionero de la IA, creador del lenguaje de programación LISP y profesor en Stanford.<br />
Las críticas de cine generales, las que se publicaron en los diarios y a los que hoy podemos acceder gracias al archivo de la web, no hicieron el mismo foco en el tema del acceso (autorizado o no) a sistemas de tiempo compartido remotos, por el contrario se enfocaron en el papel de la inteligencia artificial en la historia que la película cuenta y el peligro de un conflicto nuclear, que sin duda movilizaba una dosis importante de preocupación en la audiencia de 1983. <br />
Por ejemplo la crítica que Rita Kempley escribió para The Washington Post ubicó a WOPR en la misma serie que HAL, la computadora mentalmente "enferma" de 2001 Odisea en el Espacio y su secuela 2010:<br />
<blockquote>"WOPR se ve como un horno homicida con ojos digitales, hijo antropomórfico de HAL, cuyo creador le enseñó no solo a jugar duro, pero también le enseñó a aprender de sus errores.</blockquote>
La crítica de Kempley concluía de manera favorable:
<blockquote>"WarGames presenta sutilmente una protesta, a favor de la gente, anti-nuclear y <b>anti-máquina</b> que entretiene. No vende ni la histeria de Jane Fonda en <i>El sindrome de China</i> ni la desesperanza de <i>Dr. Strangelove</i>. Es un llamamiento por la paz que resulta bueno hasta el último byte". </blockquote>
Por su parte, el crítico Roger Ebert, en su reseña del Chicago Sun-Times en 1983: <br />
<blockquote>"Tarde o temprano una de estas máquinas inteligentes nos va a hacer volar de la superfície de nuestro planeta. Ese es el mensaje de WarGames, un escalofriante e inteligente thriller, que es una de las mejores películas de este año".</blockquote>
La crítica habló, de manera contemporánea al estreno de la película de los peligros de la IA, y de cómo el film podía ser visto como un alegato para la paz.<br />
La teoría de los juegos (incluyendo al subconjunto juegos de video) y su relación con la Inteligencia Artificial es uno de los temas centrales de la película. La pregunta que deja planteada la historia es ¿Pueden las máquinas tomar decisiones tan trascendentales para el destino de la humanidad como lanzar una ojiva nuclear? El relato debate ese asunto, con personajes como el general Beringer, un militar de vieja escuela, campechano y de pocas pulgas, que desconfía abiertamente de las ventajas de la IA y sus antagonistas, como el Dr. McKittrick, jefe e impulsor del proyecto WOPR. <br />
De manera parecida a HAL en la ficción de Arthur C. Clarke y Stanley Kubrick, WOPR también termina sufriendo algún problema de "psíquico". Pero otro aspecto interesante de la película viene dado por cierta ambigüedad: como espectadores no podemos saber si WOPR confunde la realidad, es decir descree de las señales que provienen de sus sensores externos (sentidos) para dejarse llevar por el mecanismo interno de su algoritmo ¿Confunde WOPR el juego con la realidad? ¿Alucina? (un concepto que hoy es actual en relación a la IA, pero en sentido más laxo). O por el contrario WOPR sabe que está jugando una simulación y son los personajes los que creen asistir a una escalada peligrosamente real. No podemos asegurar si WOPR habría llegado a accionar el misíl que la película nos muestra, aunque tememos que sí lo habría hecho y que la simulación no era tan solo eso, un juego en modo <i>dry-run</i>. Esta ambigüedad se cierra hacia el fin del film, para liberarnos de la tensión a la que el relato nos tuvo sometidos durante largo rato.<br />
<br />
<b>Los efectos</b>
<br />
<br />
Hemos revisado algunos efectos de la película, en las críticas de cine y en un programa especializado de 1984, <i>The Computer Chronicles</i>. <br />
El hecho de que rápidamente la película apareciera en emisiones o medios especializados es una muestra de cómo iría convirtiéndose en una referencia o en una "peli de culto" para la comunidad técnica. Los hackers no veían ninguna poesía anti-máquina en la película, por el contrario podían considerar todo eso como la exageración que hace de toda historia atractiva. Lo que más importaba para ellos eran las capacidades de acceso e intercambio (autorizado o no), es decir toda la potencialidad de la computadora, el objeto de deseo. <br />
Otra muestra de la fuerza con que la película dejó su impronta en la imaginación y los productos de las comunidades científicas y técnicas en los años '80 y posiblemente en lo sucesivo la encontré recientemente cuando analicé el sistema operativo <b>4.2BSD</b> de 1983. Esa versión de la distribución Unix desarrollada en la Universidad de California en Berkeley (De allí sus siglas> <i>Berkeley Software Distribution</i>) fue liberada en agosto de 1983, unos pocos meses después del estreno de la película. Como particularidad, esa versión de BSD fue la primera en incluir la pila de protocolos TCP/IP. La agencia DARPA (dependiente del Departamento de Defensa de los Estados Unidos) había elegido a BSD como el UNIX en el que se implementaría oficialmente el nuevo protocolo TCP/IP. Aquel año, 1983 DARPA estableció que ocurriría la transición de los antiguos protocolos de ARPANET (NCP y BBN 1822) a TCP/IP. Internet como la conoceríamos estaba tomando forma.<br />
En otro lugar he analizado algunas de las particularidades históricas de 4.2BSD, el resultado de esa experiencia puede verse en este video: <a href="https://www.youtube.com/watch?v=qEo2qSDa0Qc">"El primer TCP/IP productivo corriendo en 4.2 BSD y funcionando, 40 años después".</a> La experiencia fue realizada a partir de cintas originales que se preservaron con 4.2BSD. <br />
En lo que respecta a 4.2BSD y WarGames, lo interesante es que el equipo de científicos que trabajó en la creación de la distribución incluyó algunas referencias a la película. El "Mensaje del día" (MOTD) que se mostraba a cada usuario luego de que hubieran ingresado exitosamente sus credenciales era "¿Querés jugar a un juego?". El mismo que recibió David en la ficción, luego de que consiguiera acceder a WOPR. <br />
Otro hecho también resulta sumamente interesante. El archivo de usuarios /etc/passwd contiene los nombre de varias celebridades de la historia de Unix, por ejemplo Dennis Ritchie, Kirk McKusick, Bill Joy, Eric Alman, entre otros. <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiREWREuyNWumLzb3R5gA2l5oW4_DKC86OaPmBYXXgNph2Uqnj7JprhNCyWB5Y2pH54AlX7j6-V6OB8up9sTWzpWxd6kEWuoBSeYcsJS0NVfkQt-Q82fzZhnYNaNP-NegglRjXT2s-rGRbk4WJZ9bj2A2IJpezaw_kWWZuY2Z5qigaG37msdD28w-GruEs/s503/42bsdwelcome-zoomed.png" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" width="320" data-original-height="246" data-original-width="503" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiREWREuyNWumLzb3R5gA2l5oW4_DKC86OaPmBYXXgNph2Uqnj7JprhNCyWB5Y2pH54AlX7j6-V6OB8up9sTWzpWxd6kEWuoBSeYcsJS0NVfkQt-Q82fzZhnYNaNP-NegglRjXT2s-rGRbk4WJZ9bj2A2IJpezaw_kWWZuY2Z5qigaG37msdD28w-GruEs/s320/42bsdwelcome-zoomed.png"/></a></div>Pero hay un usuario más en la lista, llamado "falcon", fonéticamente muy similar a "falken" (el científico de la ficción). Su contraseña además es la misma que en la película, es decir uno puede "loguearse" en 4.2BSD usando las mismas credenciales que David dedujo en la ficción aplicando hoy las técnicas que denominamos como "ingeniería social". <br />
"Juegos de Guerra" dejó una huella profunda no solo en la imaginación hacker (lo que sería difícil de demostrar) sino también en sus sistemas operativos. A partir de aquellos años BSD se convertiría en el UNIX "hacker" por antonomasia, hasta la llegada de Linux/GNU a principios de los años '90. <br />
<br />
<b>Cierre: "la única forma de ganar es no jugar"</b>
<br />
<br />
En 4.2BSD (agosto de 1983) un usuario cualquiera podía identificarse con las credenciales del Profesor Falken e inmediatamente después aparecía en la consola la pregunta "¿Querés jugar a un juego?", si su respuesta era afirmativa seguía el mensaje: "Curioso, la única forma de ganar es no jugar". Aquella frase extraída de la película, parece referir a la situación conocida como "Zugzwang" en ajedrez. <br />
En los años '80 ya se pensaba que la Inteligencia Artificial había llegado a un estadio de su desarrollo que podría ser explotada comercialmente. En aquel tiempo se denominaba a algunas de esas aplicaciones como "sistemas expertos". Pero aún no podía interactuar con alguna aplicación de IA utilizando el lenguaje natural. No había capacidad de cómputo aún para semejante cosa. <br />
Hoy las aplicaciones de IA generativa, basadas en grandes modelos de lenguaje (chatGPT es la cara más visible) están en el centro de la escena. Curiosamente, hemos llegado al punto en que voces destacadas están advirtiendo sobre algunos peligros de la IA, con una situación similar al "Zugzwang". Para ellos sería necesario parar la pelota: no jugar por un tiempo como una forma de salir indemnes colectivamente ¿Será porque acaso se habría ido demasiado lejos? <br />
De momento, pareciera que estamos lejos de HAL o de WOPR, pero siempre es difícil hacer predicciones, en especial hablando del futuro. <br />
<p align="right">Matías Gutierrez Reto (retux), junio 2023</p>
<b>Referencias:</b> <br />
<a href="https://www.youtube.com/watch?v=DGBLzYyHBJk&t=821s" target="_blank">The Computer Chronicles "Computer Security", marzo 1984.</a>
<br /><a href="https://www.rogerebert.com/reviews/wargames-1983">Roger Ebert: Wargames Review (1983)</a>
<br /><a href="https://www.washingtonpost.com/archive/lifestyle/1983/06/03/wargames-tense-and-suspenseful/3f923d8c-d719-42b2-81f2-de8f71d0c230/" target="_blank">Rita Kempley: "WarGames: Tense and Suspenful".</a>
<br /><a href="https://twobithistory.org/2021/03/08/arpanet-protocols.html">How the ARPANET protocols worked</a>
<br /><a href="https://www.piensa-abierto.com.ar/" target="_blank">Si te interesa la historia de la tecnología, quizá te interese "Piensa Abierto: Una historia del software de código abierto y libre.</a>
<br />
<p>"WarGames" o "Juegos de Guerra" es copyright de MGM/UA, dirigida por John Badham con guión de Lawrence Lasker y Walter F. Parkes, estrenada en junio de 1983</p>
</span> Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-55397780639833120132023-05-28T11:31:00.011-03:002023-05-28T17:18:12.033-03:00Las cosas que aprendí en los discos (Parte 2): la escucha y los puentesEn esta serie de artículos, titulada "Las cosas que aprendí en los discos" me permito ver el mundo, sentado en camiseta desde mi propio patio mientras me tomo un vermout.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiFbCRXtmaWV-qEZ-4sOuFZTQxbsCC-qXuP8g4cLTzKY0sor7jHpDxeSe5uq0t-f2RgRnc_hEFSkqBsosGBWlb__lokr6zdAbVNUhG626BjlBHgRdfJd6OqRwQ2TfyNlKKeZAdQRh6Q41WoIXDVw4W-B1JZVP3wLyGPBLeDIP8pbZ_8lLPoQ8PNTmJ/s1280/the-who-sings-my-generation.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" height="200" data-original-height="1280" data-original-width="1194" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiFbCRXtmaWV-qEZ-4sOuFZTQxbsCC-qXuP8g4cLTzKY0sor7jHpDxeSe5uq0t-f2RgRnc_hEFSkqBsosGBWlb__lokr6zdAbVNUhG626BjlBHgRdfJd6OqRwQ2TfyNlKKeZAdQRh6Q41WoIXDVw4W-B1JZVP3wLyGPBLeDIP8pbZ_8lLPoQ8PNTmJ/s200/the-who-sings-my-generation.jpg"/></a></div>
A veces intentando evitar la auto-referencialidad aunque en ocasiones haré lo contrario de manera deliberada, no como licencia sino como un intento de encontrar qué puede haber de común o de diferente entre nuestras maneras de ver y estar en el mundo.
<br />
<p align="right">
"Nao quero lhe falar meu grande amor, <br />
Das coisas que aprendi nos discos. <br />
Quero lhe contar tudo o que eu vivi <br />
E tudo o que aconteceu comigo" <br />
</p>
<p align="right">(Belchior)</p>
<span class="fullpost"><br />
<br />
<b>¿Qué era ser joven?</b>
<br />
<br />
Ser joven debió haber sido una experiencia muy diferente para la generación de nuestros padres. Cuando hablo de "mi generación", me refiero a aquellos que nacimos entre los años '70 y mediados de los años '80 del siglo pasado.
Para la generación de nuestros padres "ser joven" suponía la existencia de una brecha insalvable entre ellos y las generaciones que los precedieron. En relación a la música, el tango les podía resultar absolutamente ajeno, quizá con alguna excepción del tango más experimental de Piazzolla y Rovira. Como música de consumo, el tango no era algo que sintieran que les pertenecía, más bien al contrario.<br />
"Ser joven" resultaba acaso una experiencia dolorasamente de choque. En carne propia percibían que sus libertades estaban directamente limitadas por el simple hecho de ser jóvenes. En países con democracias atrasadas o lisa y llanamente sin demasiada democracia, ser joven era penosamente entrar en choque con una sociedad que veía al cambio como algo hostil. Bastaba llevar el pelo largo. <br />
La canción de Belchior, un patriarca de la MPB (Música Popular Brasileira), que sirve de título para esta serie de textos decía: <br />
<br />
<br />
"Ellos vencieron,<br />
Y el semáforo está cerrado, para nosotros<br />
que somos jóvenes". <br />
<br />
<br />
Existía pues una enorme brecha generacional en términos de estilos de vida y maneras de ver el mundo. <br />
Belchior podía lamentarse: <br />
<br />
"A pesar de todo lo que hemos hecho,<br />
Todavía somos los mismos y vivimos,<br />
como nuestros padres". <br />
<br />
En su canción -la cual fue amplificada por los ecos masivos que tuvo la versión que de ella hiciera Elis Regina, y muchos años después también su hija, Maria Rita- se siente en el viento la llegada de algo nuevo ("una nueva estación"), seguramente una huella del Dylan "profeta de una generación", el de "The Times They are a-changing" y de "Blowin' in the Wind". <br />
Incluso en las sociedades con democracias más avanzadas el panorama en ciertos aspectos no era diametralmente opuesto, en algunas de ellas llevar el pelo largo no te haría objeto de persecución policial. <br />
Al respecto se puede escuchar a The Who: <br />
<br />
<br />
"People try to put us d-down<br />
Just because we get around<br />
Things they do look awful c-cold <br />
Yeah, I hope to die before I get old" <br />
<br />
"La gente trata de ningunearnos <br />
solo porque nos movemos <br />
Las cosas que hacen se ven feas y frías <br />
Espero morir antes de llegar a viejo" <br />
<br />
Se trata de "My Generation", canción que The Who grabó primero como simple en 1964, que poco después dio título al álbum "The Who sings My Generation". En ese momento, Roger Daltrey y Townshend tenían 19 años. <br />
Como tantas otras, la canción convoca el tema de cómo alguien joven puede hacerse de un lugar propio en una sociedad, que a los 20 te parece de gente "vieja". Y ellos (The Who) eran crudamente directos: sería mejor morir antes que llegar a parecerse a ellos. Las generaciones previas los "ninguneaban" o simplemente no los entendían. <br />
Yo descubrí ese disco cuando también tenía 18, solo que habían pasado unos treinta desde que ese álbum se había lanzado en el Reino Unido. Y esas mismas preguntas te acompañan a esa edad ¿Qué diablos voy a hacer? ¿A qué me voy a dedicar? O incluso más existencialmente tu propia identidad aún está "en construcción" (si es que acaso esa construcción cesa alguna vez). Como parte de una beca que mi escuela secundaria tenía (la escuela técnica 28, República Francesa) estabamos comenzando a tener nuestros primeros trabajos rentados como técnicos en electrónica. Fue el último año que en la Argentina hubo servicio militar obligatorio y recuerdo bien canturrear "The Kids are Alright" mientras iba en colectivo al regimiento de Patricios. Pero volvamos a la música.<br />
El simple "My Generation" de The Who muestra a las claras haber sido grabado con urgencia. Con algunos "descuidos" o errores, que de manera algo fortuita le vinieron bien a ese caracter crudo, duro y urgente de la canción: las cosas hay que decirlas como sea, hacerla prolija hubiera supuesto parecerse a "ellos", los que estuvieron aquí antes, los "viejos". Incluso dice la historiografía que Daltrey tartamudeó mientras la grababa, porque no había ensayado demasiado el tema. Para los productores ese tartamudeo fue un hallazgo inesperado y la versión definitiva lo incluyó sin dudarlo. Se dice además que la BBC no difundía en un principio el simple porque podía llegar a ofender a las personas tartamudas. Por supuesto más tarde revisó esa decisión y dió marcha atrás con la medida cuando el tema comenzó a ganar populararidad. <br />
La letra de la canción es urgente en el mismo sentido, es el manifiesto crudo y duro de una generación. Lo que importaba era enunciar el manifiesto: "estos somos nosotros (mi generación)", del otro lado de la frontera están los otros. Ese gesto, seguramente entre algunos otros, tiempo después sentó las bases del punk. <br />
"My Generation" dinamita puentes. La imagen de Townshend en escena, rompiendo guitarras y amplificadores, contribuyó a construir ese retrato: una forma de dinamitar en escena, romperlo todo. El sentimiento todos lo reconocemos bien, querer dinamitar puentes es propio de nuestra/s adolescencia/s.<br /> En algunos países de América Latina, como el mío, ese sentimiento adolescente derivó en muchas tragedias individuales y algunas colectivas. <br />
En cambio, Belchior no quería dinamitar los puentes que podrían cerrar la brecha generacional. Lamentaba: <br /><br />
"Todavía somos los mismos y vivimos,
como nuestros padres.
Nuestros ídolos
todavía son los mismos,
y las apariencias, las apariencias,
no engañan, no".
<br />
<br />
El cantor cearense señalaba la tensión entre el pasado y lo "nuevo", junto a las dificultades para que al fin esa "nueva estación", el tiempo de los jóvenes, llegara.<br />
Exacerbar las diferencias siempre lleva a dinamitar puentes. <br />
Entre la generación de los jóvenes The Who, la cual podemos identificar aproximadamente con la de nuestros padres, y nuestra generación, los que nacimos posiblemente entre mediados de los años '70 y principios de los '80 algo ha cambiado. La brecha generacional entre nosotros y las generaciones de nuestros hijos se ha acortado. Por supuesto, no sin que persistan algunas diferencias, que siempre las habrá. Pero la brecha como tal ya no es la misma. <br />
La música nos ha ayudado a tender puentes entre nuestra propia generación y la de nuestros hijos. Posiblemente el <i>gaming></i> (el hecho de compartir jugar videojuegos) también haya contribuido en la misma dirección. <br />
<br />
<b>My Back Pages</b>
<br /><br />
Con toda canción siempre existe una pluralidad de escuchas, determinadas formas en que el intéprete final, el sujeto que escucha, construye el sentido de ese tema musical, como resultado de lo puramente musical, la letra de la canción, las críticas, y un largo etcétera. Que haya una pluralidad de "escuchas" posibles (como son variadas las lecturas de una novela literaria, por ejemplo) no significa que aquellas sean infinitas. <br />
Respecto a esta canción de Bob Dylan que es contemporánea de "My Generation" (fue publicada en 1964) existen algunas "lecturas" biograficistas que tienden a escuchar en esa canción la voz de un Dylan que pone en términos poéticos su adiós definitivo a su pasado de "profeta" de la canción de protesta, y transitivamente como profeta de toda una generación. <br />
Otra lectura es igualmente factible: la que implica pensar que el "yo" (poético) de "My Back Pages" no tiene por qué coincidir con el Dylan de carne y hueso que en 1964 tenía 23 años. <br />
Considerar la posibilidad de ese desdoblamiento entre la voz cantante y el "yo" coyuntural del autor es perfectamente válido y de hecho acerca la canción popular a otras artes, por ejemplo, al teatro o el cuento. Nadie en su sano juicio confundiría la voz del personaje, con la del "yo" biográfico de un actor o una actriz en escena. La voz, en algunas de las canciones populares puede tener un funcionamiento similar. <br />
Habrá pues voces "testimoniales" en las que el "yo" cantante tiende a coincidir en apariencia con el "yo" contemporáneo del intérprete. Por supuesto, el paso del tiempo hará más complejo ese juego de relaciones. <br />
Con la interpretación biograficista de "My Back Pages" se puede coincidir en el hecho que en que la canción marca un antes y un después en la carrera de Dylan. Probablemente muestra a las claras cómo a partir de ese momento las "voces" y los "yos" que el Dylan intéprete irá construyendo a lo largo de su carrera se iría constituyendo en una lista larga de enumerar. <br />
Nadie duda tampoco que la "voz" del narrador de una novela no tiene por qué coincidir necesariamente con la de su autor. Resulta pues factible suponer que la voz de "My Back Pages" es la de otro Dylan, no la de aquel joven de 23 años, sino alguien que en su madurez observa cuánta agua del río ha visto correr bajo el puente: <br /> <br />
"Prejuicios medio arruinados saltaban a la vista <br />
¡Expulsen todo el odio! Grité.<br />
Mentira que la vida sea en blanco y negro,<br />
Habló mi cabeza, soñé,<br />
aventuras románticas de mosqueteros<br />
de algún modo, profundamente asentadas.<br />
Ah pero yo entonces era mucho más viejo,<br />
soy más joven que eso ahora". <br /> <br />
La vida no es en "blanco y negro" (como sí lo era en "My Generation"), "antes yo era más viejo, ahora soy más joven". Es la voz de un hombre en su madurez. <br />
Ambas lecturas son posibles, tal vez no excluyentes: la biograficista y la del yo desdoblado. <br />
La canción que Dylan grabó en 1964 y se incluyó en el álbum "Another Side of Bob Dylan", también produce un cierto efecto de urgencia. Como fue grabada en directo, contiene algunas imperfecciones. En ese aspecto se asemeja a "My Generation". Sin embargo, el resultado producido es muy diferente a los sentidos que pone en movimiento la canción de The Who. En "My Back Pages" se puede envejecer rejuvenecido. Se podría rejuvencer en la madurez a partir de las experiencias no reveladas por los relatos ajenos. Está claro que este "rejuvenecer" no tiene nada que ver con el cuerpo, sino que sería resultado de la experiencia en recorrer el camino. <br />
De ese modo, esa lectura de "My Back Pages" tiende puentes: no hay que morir antes de llegar a viejo, se puede ser cada vez más joven ¿Cada vez más sabio? <br />
Posteriormente, la versión original grabada por Dylan, en su aparente crudeza y urgencia fue realimentada a lo largo de los años con los <i>covers</i>. Cuando The Byrds grabó la canción en 1967 ya no fue la misma en lo sucesivo. De hecho, cuando el <i>dream team</i> compuesto por Petty, Young, Harrison, McGuinn, Clapton, entre otros la tocaron en vivo para el concierto que conmemoró los treinta años de carrera de Dylan en 1992, la versión que pusieron en escena fue la de The Byrds. <br />
Ese efecto de desdoblamiento de la voz, no es para nada exclusivo de las canciones que revisamos. Un efecto similar por ejemplo puede escucharse en otra canción de la misma época: "In My Life" de The Beatles. Un Lennon que para la época de Rubber Soul tiene apenas algo más de veinte años. Sin embargo en el "yo" de la canción, esa voz mira retrospectivamente sus páginas pasadas ¿De juventud?. Es acaso por ello que la canción cobra un espesor muy diferente y complejo cuando la grabó Johnny Cash para la serie de "American Recordings" hacia el final de su carrera. <br />
Ciertas canciones populares, como las citadas tienen la capacidad de envejecer mejor con nosotros. Las razones por las que no es el caso de "My Generation" saltan a la vista (o al oido). Por supuesto ese hecho no implica un juicio de valor, no es que unas canciones sean "mejores" y otras "peores". Simplemente ponen en escenas diferentes miradas del mundo, unas pueden tender puentes, otras dinamitarlos. Recuérdese si no aquella canción de Sumo "Estoy rodeado de viejos vinagres". <br />
La música nos viene ayudando a tres o cuatro generaciones a achicar la brecha generacional, entre abuelos, hijos y nietos. Vieron, los Who podían estar equivocados, pero ¿Quién no lo estuvo alguna vez durante su adolescencia? <br />
<br />
<p align="right">Matías Gutierrez Reto</p>
<br />
<br />
<b>Las canciones:</b> (Los derechos corresponden a sus propietarios) <br />
<a href="https://youtu.be/f-p_oyMYPP4" target="_blank" rel="nofollow">My Generation (Pete Townshend)</a><br />
<a href="https://youtu.be/BnlhChKEmbE" target="_blank" rel="nofollow">Como nossos pais (Belchior)</a><br />
<a href="https://youtu.be/rEoZfu-XNZc" target="_blank" rel="nofollow">My Back Pages (Dylan). Interpretada por el dream team.</a><br />
<a href="https://youtu.be/uE7E3fj0kVs" target="_blank" rel="nofollow">In My Life (Lennon-McCartney). Interpretada por Johnny Cash.</a><br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-49057578554640495932022-07-17T23:15:00.001-03:002023-05-28T17:11:55.130-03:00Aquello que aprendemos en los discos y esas experiencias-cumbreA menudo suele decirse que las canciones populares son la banda de sonido de nuestras vidas. Creo de veras que son mucho más que solamente eso. Aprendemos de los discos, aprendemos de la canción como aprendemos de otras experiencias estéticas o de otro tipo. Las canciones no son solo la banda sonora de lo que vivimos, son parte inseparable de cómo aprendemos a vivir y a realizarnos.<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKtN69OZsEQbrNLsTmotTX--w88nukclb8YQsdSRtLYiiaOAz9Hjsfcw02ePr8T1ZM8AFLEbdJmqfFE8WbdX5Q-0yCiUeCic4Moz4BJFo91bG7ym40OWawaqpr9ScO9jSw920x31YKSD4vc1s5rb7y_lP6u0W6HJwrOURS-MP-3w7MhRvOCaSeH4ce/s516/comoosnossospais.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" height="320" data-original-height="516" data-original-width="498" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKtN69OZsEQbrNLsTmotTX--w88nukclb8YQsdSRtLYiiaOAz9Hjsfcw02ePr8T1ZM8AFLEbdJmqfFE8WbdX5Q-0yCiUeCic4Moz4BJFo91bG7ym40OWawaqpr9ScO9jSw920x31YKSD4vc1s5rb7y_lP6u0W6HJwrOURS-MP-3w7MhRvOCaSeH4ce/s320/comoosnossospais.jpg"/></a></div><br />
<span class="fullpost"><br />
Nick Hornby es el autor de la novela "Alta fidelidad". Ese trabajo tuvo una versión cinematográfica, el film dirigido por Stephen Frears que tuvo a John Kusack en el rol del personaje principal.
Hornby también escribió "31 Canciones", que es un poco posterior a "Alta Fidelidad". "31 Canciones" resulta más directamente desgarrador por su caracter más directamente personal y en algunos pasajes autobiográfico. El libro no es solamente una autobiografía de la escucha musical, trata acerca algunas otras cosas relativas a ser padres, y por ello me refiero también, claro, a ser madres. Escribió Hornby: <br />
<br />
"Yo intento no creer en Dios, por suerte, pero a veces en las canciones pasan cosas que me hacen pensarlo dos veces. Cuando las cosas suman más que la adición de las partes, cuando los efectos conseguidos son inexplicables, los ateos como yo entran en terreno difícil". <br />
<br />
Hornby narra de esa forma su experiencia de escucha de la canción de Rufus Wainwright <i><b>One Man Guy</b></i> y detalla con precisión cuándo Dios entra en escena: "Para mí Dios aparece al principio de la segunda estrofa, justo cuando Rufus y su hermana Martha empiezan a cantar en armonía".
<br />
Con el correr de los siglos la música occidental ha establecido una conexión estrecha e inextrincable entre la armonía vocal y el sentimiento religioso. Sea música culta o popular, Bach o Gospel, la armonía vocal parece ser la técnica coral que mejor se ajusta a la creencia humana en algo superior, perfecto o eternamente duradero. <br />
Sin embargo, como el propio Hornby sugiere, en <i>One Man Guy</i> la entrada de Dios no tiene que ver con ningún tema religioso, ni porque la canción hubiera sido compuesta para agradar deliberadamete al Supremo. Dios, o la idea que para cada se haga de Él, simplemente se aparece cuando Martha y Rufus comienzan a cantar en armonía. Dios se le aparece en la escucha. <br />
La lectora o el lector pueden buscar <i>One Man Guy</i> en YouTube y, creo poder arriesgar, que es altamente probable que tendamos a coincidir con Hornby. <br />
Creo además que lo que sucede con esa canción -y con muchas otras desde luego- tiene que ver con los caracteres propios de la canción y no tanto con las historias "laterales" o discursos acerca de ella. <br />
<i><b>One Man Guy</b></i> fue compuesta por el padre de Rufus y Martha, Loudon Wainwright III. Hay un aire de familia en la canción, ya que la de Rufus viene a ser un cover de la canción de su padre. <br />
Esos instantes, "ciertos momentos musicales que te dan un escalofrío se hace muy difícil mantenerse en la interpretación literal" (Hornby), tal como los describe Hornby resultan similares, si mi lectura es correcta, a los que el psicólogo Abraham H. Maslow ha denominado como <i><b>experiencias-cumbre</b></i>: momentos de extrema felicidad y plenitud en diversas ocasiones asociados a la experiencia de la paternidad, de la naturaleza, de la inmensidad, del momento creativo, de la percepción estética, de la comprensión intelectual o terapéutica, la experiencia orgástica, ciertas formas de hazañas deportivas, etc. <br />
Pero además para Maslow, esas experiencias-cumbre tienden a producir un tipo determinado de conocimiento, que él denomina como conocimiento del Ser. Por tal motivo, la repetición de la experiencia-cumbre se ubica en el polo opuesto a la repetición como rutinaria y tediosa. Por el contrario, si contemplamos repetidamente la pintura que nos gusta, el rostro de la persona que amamos, o la canción que amamos, la escucha repetida de la misma, habrá una alta posibilidad que la escucha nos revele aspectos nuevos, que antes no habíamos entrevisto (o entreoído), es lo que Maslow sugiere.
Si nos restringimos al dominio de la canción popular, cada uno podría arbitrariamente hacer una lista de sus propias canciones que nos llevan al "escalofrío superior" de Hornby o a la experiencia-cumbre de Maslow. <br />
La lista podría ser antojadiza y quizá más o menos subjetiva. Sin embargo quisiera invitarte a escuchar una canción que puede quizá producir efectos parecidos a los que señaló Hornby en <i>One Man Guy</i>. La canción a la que me refiero es la versión que Johnny Cash grabó en 2002 junto a Fiona Apple de "Bridge Over Troubled Water" de Paul Simon y Art Garfunkel. <br />
Al igual que <i>One Man Guy</i>, <i>Bridge Over...</i> es también un cover, que la interpretación de Cash, como ocurre con cualquier cover, transfigura o recompone en una nueva canción. En su literalidad, el "contenido" de la canción es el mismo, pero en el cover la canción ya es otra. Como lo he sugerido en otros artículos, muchos autores han insistido sobre el hecho de que siempre una nueva interpretación es una nueva composición, entre ellos el antropólogo Levy-Strauss. <br />
La letra de Paul Simon dice: <br />
<br />
<br />
"Cuando estés agotada, <br />
te sientas pequeña,<br />
cuando haya lágrimas en tus ojos<br />
Yo las secaré todas.<br />
Estoy a tu lado<br />
cuando los tiempos se ponen duros,<br />
y no puedas encontrar amigos.<br />
Como un puente sobre aguas agitadas<br />
yo me recostaré."<br />
<br />
Si nos guiáramos por los discursos acerca de la canción de Paul Simon y la historia acerca de su desarrollo, suele señalarse que la canción sí ha tenido una cierta inspiración religiosa, ya que el propio Simon declaró que el título y ciertas ideas para componerla se le presentaron a partir de un tema Gospel, de Swan Silvertones "Mary Don't You Weep" que en uno de sus versos dice "I'll be your bridge over deep water, if you trust in my name" ("Seré tu puente sobre aguas profundas, si crees en mi nombre"). <br />
Sin embargo, en esta canción el "escalofrío superior" (<i>alla</i> Hornby) o la "experiencia-cumbre" (<i>alla</i> Maslow) no viene dado por su pretendida inspiración religiosa o por el <i>story-telling</i> acerca de su génesis creativa. <br />
Cash canta a dúo con Fiona Apple en la versión del tema de Simon. En 2002, al momento de entrar al estudio, Cash tenía alrededor de 71 años, Apple unos 25. <br />
El "escalofrío superior" puede acaso sorprender al oyente de "Bridge Over..." cuando Apple y Cash comienzan a cantar en armonía, alrededor de la segunda estrofa: <br />
<br /><br />
"Estaré de tu lado, <br />
Cuando oscurezca.<br />
Y solo haya dolor todo a tu alrededor.<br />
Como un puente sobre aguas agitadas<br />
..." <br />
<br />
Las voces tienen características complementarias en la canción en lo que hace a la tonalidad: el bajo/barítono de Cash y el alto o contralto de Apple. Si las voces son distintas también lo son los cuerpos que las producen: Fiona Apple es una joven mujer, Cash un hombre en su madurez. <br />
El momento de la armonía nos revela que en esta versión de "Bridge Over Troubled Waters" la voz de un padre (Cash) puede estar dirigiéndose a una hija (Apple). No es que dicha ambigüedad se encontrara ausente en la versión "original" de Simon & Garfunkel, pero la interpretación de Cash definitivamente plantea y estabiliza esa posibilidad. Cuando no hay amigos, cuando los tiempos se ponen duros, cuando solo hay dolor alrededor, ahí puede estar una madre o un padre. Cuando la entrada de Apple revela ese sentido se produce posiblemente el escalofrío revelador <i>alla</i> Hornby. <br />
Sobre todo en esta versión de Cash, la canción nos habla acerca de algunos aspectos de la paternidad. Qué puede hacer un padre sino "navegar justo atrás de la hija/o"? <br />
<br />
"Todos tus sueños están en camino<br />
Mira cómo brillan,<br />
Oh, si necesitas un amigo,<br />
Estoy navegando justo atrás de ti.<br />
Como un puente sobre aguas agitadas,<br />
Yo voy a aliviar tu mente". <br />
<br />
Como hemos visto, de maneras algo diferentes, tanto <i>One Man Guy</i> como la <i>Bridge Over Troubled Water</i> de Cash hablan sobre algunas cosas relativas al ejercicio de la paternidad (y la maternidad, claro). En ambas la armonía vocal juega un papel central y ambos son covers. <br />
Con este texto no pretendo racionalizar aquello que normalmente sentimos, por el contrario pretendo poner en evidencia todo aquello que naturalmente aprendemos de las <b>experencias-cumbre</b>, porque como sugiere Maslow no somos los mismos antes y después de una experiencia que nos revela nuevos sentidos.<br />
Puede ser en este par de canciones o en nuestra propio <i>playlist</i> de experiencias-cumbre. Aprendemos <b>en</b> ellas (las canciones), aprendemos escuchando discos.<br />
Aquí tomo prestada la expresión del cantor cearense (nordeste de Brasil), "las cosas que aprendí en los discos", la canción <b>Como os nossos pais<i></i></b>, la popularizó mundialmente Elis Regina.
<br />
<p align="right">Matías Gutiérrez Reto</p>
<br /><br />
<b>Las canciones:</b> <br />
<a href="https://youtu.be/EPT_RjpVuv8" target="_blank" rel="nofollow">Bridge Over Troubled Water</a><br />
<a href="https://youtu.be/VZsfU3Eotao" target="_blank" rel="nofollow">One Man Guy (Rufus Wainwright)</a>
<br />
<b>Los libros:</b>
Hornby, Nick: "31 Canciones", Barcelona, Anagrama, 2004. <br />
Maslow, Abraham H.: "El hombre autorealizado", Barcelona, Kairos, 1983.<br /> <br />
Matías Gutiérrez Reto, julio 2022.
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-74250376439537203482022-02-03T21:27:00.007-03:002022-02-04T09:05:11.271-03:00Optimizando el kernel de Linux para el escritorio (desktop) con xanmod<div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg_EyNsKlTkj3-_799mL5zNA2C2St-b38ZR3rdTLLYeTBX629c_cRfMIn-KOABDJ8XI3O5LpSJ-eNM5zt-8DoRYgwNu7MPO167a5FsyyTzbHhFJ8VP1DPDQO5NZsioO96Ot5vqPFdLA-QQ5E79GczD7s0XevAu-3GYgdZJYA83TuNNSR-5k-dTjTFXN=s1516" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img alt="compilar kernel" border="0" data-original-height="723" data-original-width="1516" height="153" src="https://blogger.googleusercontent.com/img/a/AVvXsEg_EyNsKlTkj3-_799mL5zNA2C2St-b38ZR3rdTLLYeTBX629c_cRfMIn-KOABDJ8XI3O5LpSJ-eNM5zt-8DoRYgwNu7MPO167a5FsyyTzbHhFJ8VP1DPDQO5NZsioO96Ot5vqPFdLA-QQ5E79GczD7s0XevAu-3GYgdZJYA83TuNNSR-5k-dTjTFXN=w320-h153" title="Animarse, si es que tienen tiempo" width="320" /></a>En ocasiones customizar y compilar el kernel de Linux/GNU puede ser una tarea que lleve mucho tiempo, no siempre invertir ese tiempo se justifica.</div><div>Eso se aplica si el hardware de tu PC es actual o si no querés sumergirte un poco en cómo el sistema funciona "bajo el capot".</div><div>Para quienes deseen exprimir su hardware al máximo y optimizar el comportamiento del sistema operativo para ciertos usos, por ejemplo optimizarlo para funcionar con aplicaciones "de escritorio" este post puede resultarles útil.</div><div>Hoy en día compilar el kernel del Linux es mucho más fácil de lo que acostumbraba ser. Xanmod o Liquorix ofrecen una serie de parches y optimizaciones que se aplican por sobre el kernel "vainilla" de Linux y que procuran optimizar el kernel para diferentes casos de uso.
</div><span class="fullpost"><div><span class="fullpost"><br /></span></div><br />
Respecto de utilizar un kernel "de stock" provisto por nuestra distribución favorita, compilar el kernel nosotros mismos es una tarea que requiere invertir de cierto tiempo. Requiere al menos familiarizarse con el hardware en donde vamos a ejecutar ese kernel.
Mi modesto consejo es configurá tu kernel si: <br />
<br /><ul style="text-align: left;"><li><span class="fullpost">
Estás buscando optimizarlo para ciertos casos de uso. </span></li><li><span class="fullpost">
Si tu hardware es raro y requiere soporte que no estuviera ya presente en el kernel de tu distribución. </span></li><li><span class="fullpost">
Si por ejemplo un sistema embebido tiene relativamente pocos recursos y hay que reducir la "pisada" del sistema. </span></li></ul>
<br />
En mi caso más o menos recientemente solo necesité compilar el kernel cuando utilizo hardware antiguo. Por ejemplo si quisiéramos utilizar una unidad floppy o una interfaz ide un kernel estándar actual nos va a dejar a pie.
Tengo una máquina que ya tiene cerca de doce años, es una pequeña netbook de las que el Gobierno de la Ciudad entregó a los alumnos de las escuelas primarias. Ya mis hijos no la utilizaban, porque quedó bastante rezagada para correr soft actual. <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjvvW2BxYjASyxm7HYz1_LBDJQRqglxBUBCeiHDEXdUxB227ktbiWzgseLGeKXNQHFukEuMUTyav1e7aQAEp-IaFi8PiUyFBeGFezjBF2YBHEwaYNPFqdDEIkQy53HB5GdVDevK1BQCzAv1wP99T5urfEYCORigf6v1iVhl-LnuQAu-5V_ll3BcSu2S=s613" style="clear: right; display: block; float: right; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="524" data-original-width="613" src="https://blogger.googleusercontent.com/img/a/AVvXsEjvvW2BxYjASyxm7HYz1_LBDJQRqglxBUBCeiHDEXdUxB227ktbiWzgseLGeKXNQHFukEuMUTyav1e7aQAEp-IaFi8PiUyFBeGFezjBF2YBHEwaYNPFqdDEIkQy53HB5GdVDevK1BQCzAv1wP99T5urfEYCORigf6v1iVhl-LnuQAu-5V_ll3BcSu2S=s320" width="320" /></a></div>A mí me gusta por su diseño y su robustez. Puedo usarla a la intemperie, en cualquier clima. Y con Linux tiene una vida algo extendida, de otro modo ya habría ido a parar al callejón del olvido. Si bien el teclado no es cómodo, usé esa máquina para transcribir mi libro ("Piensa Abierto") de mis cuadernos manuscritos a archivos markdown, que fueron la base para su composición tipográfica.
Demás está decir que navegar la web no es una experiencia llevadera en esa máquina, pero para escribir con visual studio o codear algunos script o aplicación simple resulta utilizable.
Por eso me propuse hace unos días tratar de optimizarle algunos pocos ciclos de cpu a ver si podía reducir la latencia de ciertas aplicaciones. Pese a tener solo 1GB de ram, utilizo allí debian con enlightenment como gestor de escritorio, lo que hace al desktop elegante y liviano. El principal cuello de botella de la máquina es sin dudas su CPU, un antiguo Atom de Intel.</span><div><span class="fullpost"><br /><b>Xanmod y la optimización del kernel</b></span></div><div><span class="fullpost"><br /></span></div><div><span class="fullpost"><br />
<a href="https://xanmod.org/" rel="nofollow" target="_blank">Xanmod</a> es una distribución de software, en este caso una distribución del kernel Linux que incluye varios parches y mejoras, algunas de las cuales no se incluyen en el kernel estándar.
En general el fuerte de Linux/GNU desde su edad temprana ha sido correr en el servidor. Es por ello que con cierto grado de solución de compromiso, el kernel suele incluir una configuración que resulte estable para el servidor, pero no necesariamente está optimizada del todo para software de escritorio.
Entre otros usos xanmod procura facilitar esos ajustes y "tweaks" para que uno pueda optimizar el kernel para el escritorio. Otra distribución alternativa es <a href="https://liquorix.net/" rel="nofollow" target="_blank">Liquorix </a>.
Estas distribuciones suelen incluir binarios ya compilados del kernel, empaquetados en paquetes .deb, por ejemplo utilizables en Debian o Ubuntu. Además existen paquetes para Arch, Fedora, etc.
Un problema es que ya es raro que se incluyan binarios 32bits en estos builds, y el Atom de mi vieja netbook no es 64 bits. Compilar el kernel tenía entonces algo más de sentido. Además podría incluir algunos ajustes más para reducir la latencia, en particular me interesaba ajustar la "preferencia" del kernel (en inglés "preemption" para intentar reducir en algo la latencia del escritorio). Además podría seleccionar schedulers alternativos para controlar la Entrada/Salida de disco (este fierro viejo tiene hdd).
<br />
<br />
<b>Compilando el kernel (usando el código fuente de xanmod) a la manera de Debian</b> <br />
<br />
Para comenzar, obviamente se requiere descargar el código fuente del kernel, en la distribución provista por xanmod.
Como he descripto en una entrada en este blog hace ya varios años atrás voy a compilar el kernel a la Debian, eso quiere decir que los artefactos que resulten del build serán un puñado de archivos .deb (el kernel en sí, sus headers y al librería de C). De esa forma uno puede distribuir esa versión de su kernel "custom" de forma fácil. La manera en como se compila a la Debian ha cambiado hace un tiempo y hoy es incluso más fácil. Manos a la obra.
Por supuesto no iba a compilar mi kernel en la vieja netbook, porque allí demoraría días, o quizá semanas. De forma que es mejor utilizar el hardware más potente que tengamos a mano. En mi caso, la PC de mi escritorio tiene un procesador AMD de 64 bits, de modo que es necesario hacer un cross-compiling para que los binarios resultantes sean de 32 bits. Pero eso no es más que pasarle un parámetro al compilador.<br />
Si uno quiere empezar a jugar con la configuración y no invertir horas de prueba y error, lo más seguro es partir de una configuración conocida. En el directorio /boot tenemos la configuración del kernel que estamos utilizando y podemos partir de esa configuración para empezar a hacerle algunos cambios.<br />
<br />
1) Instalar dependencias, si es la primera vez que vamos a compilar el kernel necesitaremos las herramientas de desarrollo:
<div class="code">$ sudop apt-get install build-essential bison flex<br /></div>
<br />
2) Para partir de una configuración "conocida", desde dentro del directorio de las fuentes de xanmod:
<br />
<div class="code">$ make localmodconfig<br /></div>
Con esto lo que haremos es crear el archivo de configuración del kernel (.config) a partir de la configuración del kernel actual y de los módulos que éste contiene.
<br /> <br />
3) Luego, copiar el directorio de xanmod a la máquina (más potente quizá) que utilizaremos para la compilación.
<br /> <br />
4) En este punto, previo a la compilación es cuando -si queremos- podemos hacer algunos ajustes. A mí me interesaba, como comenté antes, cambiar la preferencia del scheduler del kernel:
<br /> <br />
<div class="code">$ make menuconfig<br /></div>
<br />
Ese comando abrirá una interfaz ncurses para navegar las diferentes secciones de la configuración del kernel.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjSL-WZXz0S66lOIZvZe7E1kVdEs2T0oLiWD1OOtyoir-zWJE-_M5tSbcS-dX6CjFx81JYyYQb2SclFbF5BXgq92czedrALGyUxCs-DpmCf8SzwuCi7w9OJ-LHXjz5a3uPcrQTQn9T2dkgPUMNclUcWFuJDb7UHlRjmhyeUwii93I_S1PFgeJjSH86O=s1419" style="clear: left; display: block; float: left; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="681" data-original-width="1419" src="https://blogger.googleusercontent.com/img/a/AVvXsEjSL-WZXz0S66lOIZvZe7E1kVdEs2T0oLiWD1OOtyoir-zWJE-_M5tSbcS-dX6CjFx81JYyYQb2SclFbF5BXgq92czedrALGyUxCs-DpmCf8SzwuCi7w9OJ-LHXjz5a3uPcrQTQn9T2dkgPUMNclUcWFuJDb7UHlRjmhyeUwii93I_S1PFgeJjSH86O=s320" width="320" /></a></div>
En la sección "Preemption Model", selecciné "Preemptible Kernel (Low-Latency Desktop)".
Una nota sobre esto ¿De qué se trata el model de preferencia? Dicho en pocas palabras, define el modo en que el kernel elige entre las diferentes procesos o tareas que deben correrse en un sistema operativo multi-tasking (como todos los actuales). El modo seleccionado procura que las aplicaciones de escritorio puedan correr sin muchos contratiempos, aún cuando el sistema esté bajo una carga pesada, como suele ser el caso de mi netbook.
Por otro lado quería experimentar también con el scheduler de Entrada/Salida, por ello agregué algunos schedulers que no suelen ser tan estándar:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj0ees5P5zQ293t5mF8lWiAGAX5_0k07KQ4FBvdxdo2W8jmLIHS90GtEPcgJLbmCmiy43vp_iYXItlEE1Ik_8hDycmq5j9gS1gWLtmW8cH4Zmxh7GBQGJbar5AR9MyHR_xo-eT_isWLA0VVHynLoLfYX5DGGg8nwU6mb30YEaqdCpJ10ryX23TapGCi=s1419" style="clear: right; display: block; float: right; padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="681" data-original-width="1419" src="https://blogger.googleusercontent.com/img/a/AVvXsEj0ees5P5zQ293t5mF8lWiAGAX5_0k07KQ4FBvdxdo2W8jmLIHS90GtEPcgJLbmCmiy43vp_iYXItlEE1Ik_8hDycmq5j9gS1gWLtmW8cH4Zmxh7GBQGJbar5AR9MyHR_xo-eT_isWLA0VVHynLoLfYX5DGGg8nwU6mb30YEaqdCpJ10ryX23TapGCi=s320" width="320" /></a></div>
Me interesó el scheduler <a href="" rel="nofollow" target="_blank">BFQ</a>. En este caso agregué el scheduler como módulo, de modo que si no lo quiero utilizar luego no ocupe más memoria en la imagen del kernel.
<br /><br />
5) Finalmente (en una máquina más o menos "potente") hacer el build:
<div class="code">$ make ARCH=i386 -j 8 deb-pkg LOCALVERSION=-retux<br /></div>
<br />
Aquí con ARCH= indicamos la arquitectura target, que es i386 ya que se trata de un procesdor Atom de Intel. Con -j N podemos asignar un cierto número de núcleos de CPU disponibles para paralelizar la compilación.
<br /><br />
6) Instalar en la máquina de destino, que usará este kernel instalar los .deb.
<div class="code">$ sudo dpkg -i *.deb<br /></div>
<br />
7) En la configuración del kernel, en los parámetros que grub le pasa en tiempo de boot, se puede seleccionar el scheduler BFQ y deshabilitar watchdog (que en una máquina de escritorio o laptop no es indispensable):
<div class="code">elevator=bfq nowatchdog<br /></div>
<br /><br />
Con justicia, ustedes me preguntarán ¿Y los resultados? ¿Vale la pena el esfuerzo? Algunos mejoras en la netbook, en lo que hace a la latencia fueron perceptibles. No es el día y la noche, solo con esto no vamos a hacer de una pc de 13 o 14 años, pero en algo podemos extenderle la vida. Además puede ser el comienzo de otras experimentaciones para el que le interese.<br />
Existe una analogía entre algo del "hacking" con la práctica de los radioficionados. Entre estos existe una práctica denominada transmisión QRP, que consiste en transmitir con la menor potencia en antena. De esa forma, lo que se procura es optimizar el rendimiento (de la línea de transmisión, de la antena, etc) para obtener el mejor resultado posible. De esa forma, un comunicado QRP tiene otra satisfacción diferente a la de poner 100W en antena.<br />
Espacio para mejoras, siempre suele haber, por pequeño que este sea. Si puedo hacer algunos benchmarks prometo publicarlos próximamente.
</span></div>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com1Buenos Aires, CABA, Argentina-34.6036844 -58.3815591-62.913918236178844 -93.5378091 -6.2934505638211533 -23.225309099999997tag:blogger.com,1999:blog-5757133719565387245.post-47936464139059245812021-12-12T23:36:00.004-03:002021-12-12T23:37:30.342-03:00Prácticas profesionalizantes. Una experiencia personal.Actualmente se discute la implementación de "prácticas profesionalizantes" como parte obligatoria de la currícula de las escuelas secundarias de la ciudad de Buenos Aires. <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4VQK34SQKikyE5IkFOq4ddjCi-9RknH4cOjbRSZTXazJs3nXEXAXoJgQ6YgX7wlbgPuyrxqn7BM4jji72t27npxkitKQdfOX79Gb3qeS-2knf7-Eysmr0eq_NKI-xiYeFaRtfxV9TGvY/s143/distintivo-et28.jpg" style="display: block; padding: 1em 0; text-align: center; clear: right; float: right;"><img alt="" border="0" height="320" data-original-height="143" data-original-width="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4VQK34SQKikyE5IkFOq4ddjCi-9RknH4cOjbRSZTXazJs3nXEXAXoJgQ6YgX7wlbgPuyrxqn7BM4jji72t27npxkitKQdfOX79Gb3qeS-2knf7-Eysmr0eq_NKI-xiYeFaRtfxV9TGvY/s320/distintivo-et28.jpg"/></a></div>Esto no es opinión acerca de política partidaria. Es mi modesta experiencia como técnico en electrónica, y de haber formado parte como alumno del Plan Piloto de la Escuela Técnica número 28 República Francesa, acaso más conocido como "el Cuba". Imagino que la experiencia ha sido compartida por muchos más compañeros, pero por supuesto, las opiniones que siguen son estrictamente personales, no así los hechos. <br />
Esto es hablar de mi generación (Oh The Who!) pero también de las que están por venir. <br />
<span class="fullpost"><br />
No suelo escribir en este espacio artículos de opinión acerca de la actualidad o de la política local. Si este artículo se refiere a temas públicos el lector encontrará mis razones en seguida.
Me sentí inclinado y obligado a hacerlo en relación al proyecto de "prácticas profesionalizantes" en las escuelas secundarias que impulsa el Gobierno de la Ciudad de Buenos Aires, para implementar durante el año lectivo 2022.
El tema me interpela personalmente y a muchos otros amigos de mi generación (oh The Who). Fui alumno de la Escuela Técnica número 28 "República Francesa", conocida como "el Cuba" por estar ubicada en la intersección de Cuba y Blanco Encalada en el barrio de Belgrano.<br />
Como debe ocurrir a mucha gente, las amistades que construímos a la edad (que ya nos parece algo lejana) en la que cursábamos la secundaria, siguen siendo nuestros amigos de hoy. Casi tres décadas después seguimos siendo amigos con el mismo grupo de muchachos con los que cursamos en el Cuba. Con esto quiero decir que mucho de la construcción de nuestra identidad se juega en esos años de adolescencia.<br />
Supongo que a nosotros, los técnicos egresados de las escuelas técnicas este proyecto nos interpela directamente porque en mayor o menor medida podemos dar testimonio de cómo la práctica profesional en empresas tuvo un impacto positivo en nuestras carreras profesionales y en nuestras vidas en general.<br />
Como alumnos de la técnica 28, en actos o discursos escolares escuchamos noticias acerca de su fundación: la escuela se fundó en la década del cuarenta como parte de las llamadas "escuelas fábrica", que posteriormente pasaron a denominarse "industriales" y luego "escuelas técnicas". Esas distintas denominaciones dan cuenta de su propio desarrollo y de las transformaciones de la sociedad de que forman parte.<br />
En los discursos que escuchábamos, especialmente en aquellos que destacaban los inicios como "escuela fábricas" solía subrayarse la conexión directa entre la escuela con eso que genéricamente se denomina "el mundo del trabajo". Ese "mundo" lo conforman las empresas privadas y algunos organismos públicos.<br />
Cuando a nosotros nos tocó cursar en el Cuba, de forma similar a como ocurre hoy en día, el ciclo estaba dividido en tres partes: ciclo básico (3 años), ciclo superior (3 años) en los que se intensificaban el aprendizaje de temas técnicos y el sexto año de la cursada se cursaba en el turno noche, porque durante el día se realizaba una pasantía en empresas.<br />
Hoy a este tipo de planes suelen denominarlos "prácticas profesionaizantes". Cuando a nosotros nos tocó cursar el sexto año, en la primera mitad de los años noventa, aún se denominaba a este programa de pasantías como el "Plan Piloto".<br />
En aquel momento el "Plan Piloto" ya tenía más de dos décadas de desarrollo. Se había puesto en marcha en 1967, como iniciativa del CONET (Comité Nacional de Educación Técnica) e impulsado definitivamente por el profesor Julio E. Ambrosini. También director de la escuela por aquellos años en que nosotros empezamos a cursar si no me equivoco. Hoy una placa en la escuela recuerda el tesón con el que impulsó el desarrollo del Plan.<br />
El Plan surgió a la luz de las teorías y políticas desarrollistas, pero su existencia las trascendió largamente.<br />
Por otra parte, eran aquellos años que se percibían como punto de inflexión en lo relativo a la tecnología. Se percibía que algo nuevo estaba por venir: ya se podían entrever algunos de los efectos duraderos que tendría la microelectrónica y la miniaturización sobre la cultura. La electrónica (hoy podríamos decir el hardware) se volvería ubicuo en nuestras vidas cotidianas. Todavía el equipo liderado por Federico Faggin en Intel no había presentado el 4004, el primer microprocesador. Ese hecho ocurrió en 1971, pero previo a ese hecho fundamental el transistor había delineado el camino de la progresiva miniaturización y el advenimiento de la electrónica de consumo.<br />
Mi amigo y compañero de curso Hernán M. hace unos días nos compartió en nuestro grupo de chat lo que encontró en algún lugar de la web. Se trata del número 4 de la revista de la escuela, la cual se titulaba simplemente "Electrónica". La misma data de 1967 e incluía algunos artículos técnicos sobre las "computadoras digitales", "aplicaciones del rayo láser en comunicación", entre otros.
Sin embargo, el artículo que me interesa aquí es uno que llevaba la firma del profesor Julio E. Ambrosini: "La realidad del Plan Piloto". El citado artículo comenzaba: <br />
<br /><br />
"El mundo vive desde hace algunos años dentro de lo que podríamos denominar una era tecnológica acelerada y, Argentina, país rico y con grandes posibilidades no puede mantenerse al margen de este proceso. Por ello debe preparar a sus técnicos adecuadamente, contando con los recursos materiales necesarios, ya que los humanos existen por la calidad de nuestro pueblo". <br /><br />
Según se señala en la revista, desde los años sesenta la escuela contaba con un comité asesor de ingenieros de IBM, Bull-General Electric y Rand Corporation. Sin embargo para 1967 esa iniciativa estaba institucionalizándose con el apoyo del CONET en el Plan Piloto.<br />
El Plan se basaba en un principio pragmático: por mejor equipados que estuvieran los laboratorios de la escuela, siempre irían a la zaga de la industria. <br />
Aún Neil Armstrong y Buzz Aldrin no habían pisado el suelo lunar, pero podía entreverse la exponencial estampida del progreso que vendría.<br />
Cuando nos tocó cursar el sexto año a nosotros, en 1992, la industria electrónica en Argentina era bastante diferente a la descrita en el número de la revista "Electrónica". <br />
En lo personal ¿Cuáles fueron algunos de los resultados del Plan Piloto para nosotros? El plan establecía una práctica en una empresa que uno como alumno podía elegir y dependiendo de sus calificaciones la empresa realizaba algún mecanismo de selección. Por ejemplo aquellos con mejores calificaciones podían llegar a hacer la práctica en IBM o Hewllet-Packard o alguna otra gran organización. Había un lugar para cada uno en una empresa.<br />
También dependiendo de cada empresa esta podía determinar si la pasantía era rentada o no. Creo que en la mayor parte de ellas lo era. Con 17 o 18 años pasabas a cobrar tus primeros sueldos y eso de pronto te permitía sentirte como un dandy: descubrías que podías tener autonomía e independencia, pagarte las salidas de los sábados, no depender en eso de tus padres. Podías comprarte CDs en las disquerías sin depender de algún peso que te pudiera regalar alguien de tu familia. Eran años de cierta estabilidad monetaria y eso te permitía ahorrar.<br />
Después de aquel primer año de trabajo, algunos nos aventuramos a viajar solos al extranjero por primera vez y conocer otras culturas. Todo gracias al Plan Piloto.<br />
El Plan ofrecía una práctica profesionalizante en un empleo a tiempo parcial.<br />
Ese debió ser para muchos de nosotros, mirándolo retrospectivamente, el primer año del resto de nuestras vidas, en la medida en que ibamos cruzando el puente entre el mundo de la escuela y ese más allá que eran el mundo del trabajo y los estudios universitarios.<br />
Ese año, por otra parte, nos divertimos muchísimo. La empresa significaba conocer personas e interactuar en otras situaciones, hasta entonces desconocidas.<br />
Creo que sin temor a equivocarme la gran mayoría de los que formamos parte de aquellas promociones continuó estudiando en la universidad sin dejar de trabajar. Pero por sobre todo tuvimos la enorme ventaja de no haber parado de trabajar desde entonces.<br />
Por supuesto, nada es perfecto. Pero en líneas generales los efectos del Plan Piloto en nuestras carreras y vidas fueron positivos.<br />
Hoy leo algunos argumentos de los que se oponen al proyecto de las prácticas profesionalizantes y dudo realmente de la buena fe de algunas de ellas. Por ejemplo, se sostiene que los alumnos pasarían a convertirse en "mano de obra barata" que las empresas aprovecharían.<br />
Tengo la impresión, cuando escucho o leo "fuerza de trabajo", "mano de obra", que esas personas tienen una idea del trabajo más propia del siglo XIX que del XXI. Hoy, por elemental que algún trabajo sea este requiere conocimientos y habilidades técnicas y sociales. Por fortuna, la idea del trabajador pegado a la línea de montaje ya no forma parte del paisaje actual. <br />
Otros argumentos simplistas sostienen que los pibes (y pibas) del secundario "van a sacarle el trabajo a trabajadores establecidos". De nuevo, este argumento cae de maduro. Ningún chico que esté haciendo una pasantía puede equiparar en conocimientos a alguien con años de experiencia en un trabajo. Es conocida y probada la teoría que indica que para convertirse en un experto en alguna cosa se requiere 10.000 horas de experiencia. Hagan las cuentas y ningún chico de secundaria podría tenerlas. <br />
Como bien lo señalaba el profesor Ambrosini en 1967 para una empresa, "emplear" a un alumno secundario es más una inversión y un cierto riesgo asociado, que cualquier inversión conlleva. Así lo señalaba el citado artículo de la revista Electrónica: <br />
<br />
"Hoy se encuentran colaborando empresas que se han brindado patrióticamente a poner un patrimonio millonario, una espléndida organización y un esfuerzo creador en pos de la formación de 128 alumnos que egresarán en este año 1967". <br /><br />
En ese proceso y con la capacitación adecuada es probable que un cierto número de alumnos puedan convertirse en empleados de nivel inicial, otros quizá no lo deseen y busquen otros caminos en otras empresas. <br />
El nuestro es un país institucionalmente discontínuo. Primero fueron los gobiernos de facto que interrumpían el desarrollo de políticas a mediano y largo plazo, pero después los diferentes gobiernos democráticos no lograron presentar hasta el momento un panorama diferente en ese aspecto: ha sido habitual que un gobierno borre de un plumazo iniciativas de gestiones anteriores ya sea por pura ideología o por simple narcisismo ("vean ustedes que nosotros no somos aquello"). Hay pocas instituciones que hayan resistido el paso de políticas erráticas, con las que siempre se piensa en el corto plazo. Con todos los altibajos y vaivenes económicos, planes como el mencionado mantienen su relevancia.<br />
Hoy la Argentina no es el país rico al que se refería el profesor Ambrosini en 1967. Pero sin dudas, igual que en 1967 nuestro capital humano sea lo central. Quizá por eso, hoy resulta más relevante que nunca la tarea de fortalecer los puentes entre la educación Pública, sus instituciones y las empresas ¿El riesgo? El capital humano, como el otro, viaja y emigra.<br />
Ese mundo de cintas de montaje, música funcional y Taylorismo industrial que algunos creen que aún existe se desvaneció hace tiempo. En donde permanece será automatizado de manera irreversible, para liberar al humano de la carga mecánica. <br />
En todo hemos sido demasiado conservadores. "Conservador" es pretender que nada cambie y por tanto que ninguna innovación pueda sobrevenir. Es dificil que nos vaya mejor si seguimos haciendo exactamente lo mismo que hemos venido haciendo mal durante este último medio siglo. <br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-88118970814086034112020-08-23T23:13:00.002-03:002020-08-23T23:15:30.705-03:00Viaje a los inicios de la Web ¿Cómo probar Viola Browser y Erwise Viola WWW y Erwise fueron dos browsers pioneros <div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6UPkQu0CEbiwxYlKtJlcfNFo8nB-_FOmmb1pbgLpfMuTIxpHydnWMpe1F_b7P28XTB7qivQX659qJdUe-nYHedGRSSGQrZSaOCd8J2NYL-GH9yiGr3ivhINz0uYlqylSWhByjxcJaw14/s1050/viola_browser_20200823_222331.png" style="display: block; padding: 1em 0px; text-align: right;"><img alt="" border="0" data-original-height="840" data-original-width="1050" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6UPkQu0CEbiwxYlKtJlcfNFo8nB-_FOmmb1pbgLpfMuTIxpHydnWMpe1F_b7P28XTB7qivQX659qJdUe-nYHedGRSSGQrZSaOCd8J2NYL-GH9yiGr3ivhINz0uYlqylSWhByjxcJaw14/s320/viola_browser_20200823_222331.png" width="320" /></a></div>-junto con Midas browser- que precedieron a Mosaic, el browser desarrollado por NCSA que sería la base de la mayoría de los browsers que lo sucedieron (Netscape Navigator, Internet Explorer, Firfox y la lista sigue).
Este es un breve paso a paso de cómo se puede crear el ambiente (una máquina virtual con el sistema operativo requerido Sun OS 2.6/Solaris 5.6 o similar) para poder ejecutar estos browsers.
<span class="fullpost"><br />
Esta experiencia empezó hace algunas semanas cuando me propuse una experiencia (o un juego) que consistía en un tipo de arqueología de software. Gracias a internet en general y sites como archive.org tenemos a disposición el código fuente y a veces incluso archivos binarios de muchas piezas de software histórico. De esa forma, empecé por compilar para un linux de 64bits el código del servidor web <b>CERN httpd</b>, el primer servidor web que fue desarrollado por el equipo que lideraba Tim Berners-Lee a principios de los años '90 en el CERN. Esa experiencia puede verse en el siguiente video: <br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/bQh8XFobboU" width="480"></iframe>
<br />
<br />
<b>Después del servidor, los browsers</b>
<br />
De entre los navegadores pioneros, el más popular y famoso fue el Mosaic, desarrollado inicialmente en el NCSA. Pero lo cierto es que lo precedieron algunos otros. El primer browser gráfico que corrió en el CERN solo podía ejecutarse en el sistema operativo Next OS, que equipaba las workstations Next.
A ese browser del CERN, le siguieron Viola Browser, Erwise y Midas. Los tres fueron los browsers pioneros para sistemas Unix.
El código fuente y algunos binarios (para arquitectura sparc) de estos browsers está disponible ahí afuera en la web, siguen los links:
<br /> <br />
<b>Viola WWW:</b><a href="ftp://ftp.cuhk.hk/pub/packages/info-systems/www/viola/">ftp://ftp.cuhk.hk/pub/packages/info-systems/www/viola/</a>
<br />
<b>Erwise:</b><a href="ftp://ftp.funet.fi/pub/networking/services/www/erwisE/">ftp://ftp.funet.fi/pub/networking/services/www/erwisE/</a>
<br /><br />
Además Pei Wei, autor de ViolaWWW mantiene activo el site <a href="http://www.viola.org/">viola.org</a> que es una réplica del sitio web original donde fue ofrecido ViolaWWW al principio.
A diferencia del servidor web, lograr compilar estas piezas de software en un sistema linux actual requiere un cierto trabajo de "portar" el software para que se entienda de manera adecuada con las APIs de X11 de las librerías más recientes. Algunas han cambiado bastante y ese esfuerzo no es trivial. Posiblemente a sus autores a gente más avezada que yo en eso les resulte acaso realizable, a mí me hubiera llevado bastante tiempo de prueba y error. Pero entre el código fuente se encuentran binarios que fueron compilados para la arquitectura Sparc, puntualmente las CPUs que equipaban las workstations de Sun y que corrían SunOS.
El resultado de la experienca, ejecutando ViolaWWW y Erwise puede verse en el siguiente video:
<br /><br />
<iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/sbK8PNhDRVM" width="480"></iframe>
<br /><br />
<b>¿Cómo recrear el ambiente de pruebas (SunOS/Solaris)?</b>
<br /><br />
Después de ver el video, un amigo me sugirió que sería interesante poder reproducir la experiencia. Siguen abajo algunas de las referencias que seguí para instalar ese antiguo SunOS:
<br />
Para emular una arquitectura Sparc en una de nuestras máquinas Intel x86 hay que utilizar la aplicación qemu-system-sparc.
Una guía detalladísima sobre cómo instalar el SunOS 2.6 se puede encontrar en el siguiente link: <br /> <a href="https://astr0baby.wordpress.com/2018/09/22/running-solaris-2-6-sparc-on-qemu-system-sparc-in-linux-x86_64-mint-19/">Running Solaris 2.6 Sparc on qemu-system-sparc in linux x86_64</a> <br /><br />
La única diferencia en el procedimiento se encuentra en el modelo de networking elegido. Yo no tenía necesidad de usar el modo bridged de manera que opté por la configuración más sencilla que qemu tiene disponible <b>-net user</b>, de esta forma la vm guest va a utilizar un modelo similar a NAT. No es posible acceder al guest desde la máquina host, pero en mi caso me bastaba: solo necesitaba salir hacia internet y desde el guest poder comunicarme con el host, donde correría el servidor web.
De manera que una vez que el OS guest (SunOs) estuvo instalado en el hd virtual, para iniciarlo se deben ejecutar las siguientes líneas en la consola: <br /><br />
<div class="code">
$ export SDL_VIDEO_X11_DGAMOUSE=0
$ qemu-system-sparc -L . -m 128 -M SS-5 -vga cg3 -drive file=/path/a/disk1.img,bus=0,unit=0,media=disk -net nic -net user
</div>
<br />
La primera línea sirve para corregir un problema con el puntero del mouse que resultaba totalmente errático de otra forma. Quizá por esa misma razón, no pude utilizar software basado en ffmpeg para capturar la pantalla, ya que al intentar hacerlo se producía un conflicto con el puntero del mouse del guest.
El resto de la experiencia puede verse en el video.
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-75320494799196344712020-04-19T22:04:00.001-03:002020-04-19T22:04:57.062-03:00Elogio de la conversaciónLos podcasts no son nuevos. Están entre nosotros hace más de quince años. Ya a estas alturas todos nosotros, el público o los consumidores, los percibimos como una experiencia distinta a la radio. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ7Jds5QwhfrDuooj7ucp8dS5Td2L25K3Bg2ubPRZJK6te2YpQrnV6nqUqmcUm56xjfJvAVok1ZgIpV_uYp1RN3XyOKUz2RcDnAsQMhM28cwm0Fvwo8DVm_7Nu99dDCC7ncAjKYDFgZD0/s1600/auris.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ7Jds5QwhfrDuooj7ucp8dS5Td2L25K3Bg2ubPRZJK6te2YpQrnV6nqUqmcUm56xjfJvAVok1ZgIpV_uYp1RN3XyOKUz2RcDnAsQMhM28cwm0Fvwo8DVm_7Nu99dDCC7ncAjKYDFgZD0/s200/auris.png" width="200" height="200" data-original-width="980" data-original-height="980" /></a></div>Las líneas en este blog son solo unas observaciones preliminares y por lo tanto, también quizá provisionales. Parto de la base de algunos hechos: los medios tradicionales ya envejecieron pero dificilmente vayan a desaparecer. En ese sentido la oferta y la promesa del podcast es diferente. Posiblemente vengan a ocupar un nicho que nada ni nadie consiguió atender antes. Porque (por suerte) el podcast no es la radio, quizá venga a ofrecernos algo radicalmente distinto.<br />
<br />
<div>Icon made from <a href="http://www.onlinewebfonts.com/icon">Icon Fonts</a> is licensed by CC BY 3.0</div><br />
<span class="fullpost"><br />
<br />
La radio de gran público (FM o AM, poco importa) ha envejecido, eso no es novedad. Con todo, es difícil que esos medios, junto con las tecnologías que lo construyeron (la transmisión de ondas hertzianas en modo "broadcasting") vayan a desaparecer por completo.<br />
Cuando era adolescente con mis amigos escuchábamos regligiosamente cada noche un programa que se llamaba Historock. Iba por FM de la Ciudad que en aquella época se llamaba "la Metro". Teníamos más o menos la misma edad que hoy tiene mi hija mayor, con lo que quiero decir que ya ese tiempo me parece realmente lejano. Posiblemente el tiempo tienda a comprimir algunos hechos en mi memoria pero creo que por entonces, apenas si había TV por cable en algunas casas. Si tenías la suerte de que algún amigo por casualidad la tuviera, te ibas a pasar horas en su casa extasiado por los clips como el de "Last Dance with Mary Jane" de Petty al que acompañaba la misteriosamente bella Kim Basinger o "Gimme All Your Lovin'" de ZZ Top. Pero volvamos a la radio.<br />
Historock era un programa que se emitía de lunes a viernes, de 22 a 24 hs. Repasaba al detalle, con información y muchísimas grabaciones, algunas realmente raras, la historia, como se imaginarán, del Rock. Desde los pioneros del sello Sun de Sam Phillips en Memphis, pasando por la explosión del rock y blues británico hasta "nuestros" días, que eran los días de nuestra contemporaneidad de entonces, más o menos cuando Nirvana lanzaba "Nevermind". Historock podía pasarte el disco entero "Thick As a Brick" de Jethro Tull (dos temas de 20 minutos cada uno), posiblemente porque iba por una radio pública. Por los motivos que fueran, lo hacían.<br />
¿Por qué el ejemplo? Lo que vale de él no es ninguna anécdota. Sino que creo que ejemplifica un "modelo" o un tipo de contrato que la radio le proponía a sus oyentes que ya no existe como tal, o que por lo menos ya no forma parte de ningún "mainstream". Para nosotros, como para el resto de la audiencia, era claro que aquellos que conducían Historock eran la autoridad suprema en cuanto al conocimiento de la música que nos gustaba. Si algo queríamos era llegar a saber tanto como ellos. Tener tantos discos como ellos, o si el presupuesto era escaso -como lo era- al menos tener muchos cassettes grabados, pero escuchar mucha música al fin. El contrato o la forma en que la audiencía podía relacionarse con programas como aquel, era de tipo "pedagógico", un tipo de intercambio necesariamente complementario, en donde una instancia (la "emisión") es el que sabe y la otra instancia, los oyentes son los que quieren aprender.<br />
Ese tipo de intercambio, en radio, televisión o el medio "masivo" que sea desapareció o quedó relegado a lugares marginales. Más cerca en el tiempo Alfredo Rosso encarnaba una posición similar, pero está muy lejos del mainstream de la radio actual.<br />
Ese modelo "pedagógico" -ya fuera alrededor de la música o de algún otro tema- fue desapareciendo o pasando muy a segundo plano durante la década de los '90. Posiblemente y a muy a grandes rasgos la radio actual propone un tipo de intercambio basado en el contacto: vos estás ahí, nosotros estamos aquí. Y poco más, la radio como compañía presente. Aquello de lo que se habla a veces pasa a segundo plano. Pero la conversación no es demasiado central. Los <i>media</i> o lo que queda de ellos tienden a construir un star-system bastante berreta en algunas ocasiones.<br />
Y ahora una valoración, supongo que pese a ser absolutamente subjetiva, quizá sea compartida. En la radio actual no encuentro nada. Nada que me retrotraiga a la escena originaria de Historock. No soy el mismo, claro, pero la radio tampoco es la misma. En la radio la música, al menos parte de las músicas que me gustan ya tiene una existencia totalmente marginal. Importa más un star system estúpido de periodistas que entrevistan mal o que aburren. La radio actual presupone que va a ser parte de un continuo sonoro y que sus oyentes harán escuchas "flotantes", mientras hacen otras actividades. Apagué la radio. Me voy con la música a otra parte.<br />
<br />
<br />
<b>(Por suerte) los podcast no son la radio</b><br />
<br />
No temo en exagerar al decir que Internet, en tanto red de múltiples redes interconectadas y altamente resiliente a fallas (salvo la de nuestros paupérrimos ISPs), será una de las más grandes creaciones de la humanidad. No deja de llamarme la atención que un desarrollo originalmente militar (promovido y financiado por fondos para la Defensa de los Estados Unidos en tiempo de la Guerra Fría) se haya vuelto algo tan definitivamente "abierto" y "colectivo". Muchas teorías conspirativas hacen agua. Mi explicación quizá naif, mientras leo y reviso algunos libros como "Inventing The Internet" de Janet Abbate o "Where Wizards Stay Up Late" de Hatie Hafner, es que pese a ser un desarrollo completamente cerrado (en el sentido de secreto) llevó el presupuesto a organizaciones civiles -universidades y empresas- en donde había mucha gente que pensaba "más allá", pensaba en estándares, pensaba en intercambios entre iguales, eran si se quiere la expresión de una cierta contra-cultura. Lo que empezó siendo una red para asegurar las comunicaciones ante la eventualidad catastrófica de un ataque nuclear terminó siendo una de las mayores (sino la mayor) herramienta de interconexión que la cultura haya jamás construido.<br />
De los orígenes de internet a los podcast hay una gran distancia. No podría recorrerla aquí. Pero la democratización a escala mundial de las computadoras primero y del acceso a la red después, puso a nuestro alcance toda una serie de herramientas antes desconocidas. Internet no es un "medio", es un paquete dinámico de diferentes medios de comunicación que pueden nacer, desarrollarse y también morir. Internet es la base técnica, la capa de base que permite esos diferentes intercambios. <br />
Un podcast no es solo palabra hablada grabada. Para que "algo" sea reconocido y consumido como un podcast tendrá que tener ciertos atributos que lo caractericen como tal. Siguen un puñado de las que podrían ser a mi juicio algunas de las características específicas del podcast.<br />
<br />
Palabra no institucional. En el broadcasting tradicional (la radio como la conocimos) siempre cualquier enunciación por más individualizada que sea en la voz de un locutor, (por poner un ejemplo histórico Antonio Carrizo) está siempre acompañada por otra "voz" en sentido figurado, que es la voz institucional de la propia broadcasting. En el mismo ejemplo histórico, el programa de Carrizo era "La vida y el Canto por Radio Rivadavia". La institución emisora en broadcasting siempre es responsable no solo por la calidad técnica de la emisión sino también por todo lo que se dijera en sus transmisiones. Cuando algún locutor (o locutora) tuviera un exabrupto o accidentalmente ofendiera algún tipo de sentimientos de algún grupo, la voz de la institución emisora se tiene que hacer presente para expresas que "esos dichos no coinciden con sus principios y blah blah.<br />
El podcast es por definición palabra no institucional. Incluso aquellos podcast por ejemplo de periodistas de algún diario, su palabra en el podcast estará el alguna medida despojada de la visión "editora" de la organización a la que pertenece. Es palabra personal y en primera persona. La voz, como se ha dicho muchas veces es producto directo de nuestro cuerpo, es nuestro medio de expresión más directamente visceral, como la caja de un instrumento de cuerda determina su timbre y volúmen.<br />
<br />
Un podcast se define por su periodicidad. Construir una audiencia no es sencillo, y la periodicidad más o menos regular manda. Un podcast no es un producto único, sino más bien el resultado de una cadencia de episodios más o menos regular.<br />
En cuanto a su composición un podcast puede articularse sobre la voz de varios -dos o tres a lo sumo- "hosts" (presentadores a falta de un mejor término en .es) que regularmente participan de cada episodio y a los que eventualmente se le suman algún/os invitados. En otros el "host" es la voz regular y "dueño" del podcast y como interlocutor se le suma algún invitado. Posiblemente los podcast absolutamente en solitario (una voz única) sean los más raros, nuestra cultura tiende a desconfiar de los que hablan solos, pero en ese caso están solos con su audiencia. <br />
Los podcast como medio, y quizá lo que su "lenguaje" tenga de interesante es que en algún aspecto vuelven a ponerle diversión al paisaje sonoro actual. En el podcast lo central es la conversación. Este es un tipo de intercambio que escasea en los otros <i>media</i> (los más o menos masivos, o lo que queda de ellos). Veamos por qué escasea: la conversación se define como un tipo de intercambio simétrico en el que dos iguales o pares interactúan a base de la palabra hablada. Se distingue de un intercambio como el del maestro y sus alumnos, del médico y su paciente, del entrevistador y el entrevistado, de la astróloga y sus clientes. Esos son, por el contrario, intercambios basados en la complementariedad o asimetría en donde uno "sabe" (o tiene algún poder) y el otro participante no.<br />
La conversación requiere una cierta durabilidad, un desarrollo temporal que quizá ya no cabe bien en los <i>media</i> tradicionales. Quizá porque la radio presupone que todos sus oyentes hacen una escucha "flotante" entrando y saliendo en la temporalidad de la emisión. La conversación en cambio requiere del compromiso tanto de los interlocutores como de los "testigos" que son la audiencia del podcast. No creo que resulte sencillo escuchar un podcast con la atención "flotante", mientras trabajamos o hacemos otra cosa. En general el intercambio horizontal que se plantea entre los que conversan en un podcast tiende a reproducirse con su audiencia. La invitación, al menos en un contrato no explícitamente escrito es a ser testigo o parte de una conversación entre iguales.<br />
Los podcast dificilmente recreen la escena originaria, de tono pedagógico y divulgador como era el ejemplo de Historock que citaba. Por el contrario, el podcast es un intercambio planteado y ofrecido más bien entre pares (por ejemplo "hecho por fanáticos de Linux para que lo escuchen fanáticos de Linux", o "Hecho por fanáticos de Ford, para que lo escuchen fanáticos de Ford).<br />
¿Producto de nicho? Posiblemente, la complejidad actual de cualquier sociedad moderna está compuesta por miles de "mercados"/"tribus"/"subculturas" no importa qué nombre se les de. Posiblemente durante un mismo día surfeemos atravesando varias de esas sub-culturas. Pero en todo caso, la conversación es un bien escaso y como tal tiene un valor enorme, precisamente por ser un intercambio entre pares. Posiblemente hoy mientras sobrellevamos los días del confinamiento del covid, valoremos la conversación más que nunca, cómo la necesitamos a diario y todo su efecto terapéutico.<br />
Lo que sí de alguna forma el podcast construye de nuevo es una manera de escuchar. Modo de escuchar que la radio de gran público abandonó. De manera parecida a como nos poníamos a escuchar religiosamente Historock el podcast requiere que lo escuches de principio a fin atendiendo al flujo de esa conversación. No es fácil tener buenas conversaciones, lo que sí es seguro es que ellas suelen tener un efecto poderoso sobre nuestras mentes. <br />
<br />
retux (Matías Gutierrez Reto)<br />
<br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-91150518033268324142018-10-20T19:52:00.000-03:002018-10-20T20:02:57.577-03:00Meeprommer, grabador de EEPROMs. Notas sobre el troubleshooting.Desde que era chico y tuve mi primera compu tuve curiosidad por cómo funcionaban los "cartuchos" con memoria de lecturá solamente, como los que también usaban, además de las primeras computadoras personales (msx, atari, commodore, etc) las consolas de videojuegos de segunda y tercera generación.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXj6jCM-v5of6yZ-E5fB1Ycb_MA-lUMbDg5jndW231cRkeVunTp-XQ5N9-rNqmxKrM2rJDegVWJ0_-h7rLq2yDDjoFl43GMWRYKD371-Jqu4Ofa8RDIHHmz0hJb2T3S8fbTaMBKzVKmg/s1600/maniac-mansion.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXj6jCM-v5of6yZ-E5fB1Ycb_MA-lUMbDg5jndW231cRkeVunTp-XQ5N9-rNqmxKrM2rJDegVWJ0_-h7rLq2yDDjoFl43GMWRYKD371-Jqu4Ofa8RDIHHmz0hJb2T3S8fbTaMBKzVKmg/s320/maniac-mansion.jpg" width="320" height="198" data-original-width="1600" data-original-height="990" /></a></div>Los años pasan y por alguna profunda u oscura razones nos siguen gustando juguetes parecidos, a veces quizá algo más caro. Aunque los precios de la electrónica, con el tiempo fueron reduciéndose exponencialmente.<br />
Aquí comento brevemente la construcción -y sobre todo el troubleshooting- de un grabador -diseñado por Mario Keller- de eeprom para aquellas computadoras de 8 bits.<br />
<span class="fullpost"><br />
Tiempo atrás, cartuchos como los mencionados solían utilizar EPROMs como la 2764 o 27256. Aquellas EPROMs requerían de exposición a una fuente de luz UV para su borrado. Normalmente se ponía un pequeño tubo UV en una caja estanca y se las exponía por un cierto tiempo, en general 10-15 minutos.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvnV-Uvrj8g-28HSkFsf5_tbZN_CqAd1q92OuAz9nyNXg_snxCAHrGoxDfL1B7g5HVR-JeppmqmIzzatCwkKdjOGCs_KCykHWxu10cbWCSLEYdoHH0sJpqgHfB7lpfBlPeRY-DOLDJAY/s1600/28c256.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSvnV-Uvrj8g-28HSkFsf5_tbZN_CqAd1q92OuAz9nyNXg_snxCAHrGoxDfL1B7g5HVR-JeppmqmIzzatCwkKdjOGCs_KCykHWxu10cbWCSLEYdoHH0sJpqgHfB7lpfBlPeRY-DOLDJAY/s200/28c256.jpg" width="200" height="185" data-original-width="439" data-original-height="406" /></a></div>Posteriormente se desarrollaron las "Electrically Erasable Programmable Read Only Memory", que ya no tienen en su encapsulado la ventana para el ingreso de luz UV, porque se pueden borrar eléctricamente. <br />
Hay EEPROMs con distinto tipo de buses, pero las de bus paralelo, como la 28C256 presentan un pinout retrocompatibles con las EPROMs de bus paralelo de generaciones previas, como la 27256.<br />
<br />
Para que estas EEPROMs/EPROM puedan servir, por ejemplo para algún proyecto con algún microprocesador de 8 bits (z80,6809, etc) o para programar un cartucho para la Commodore 64 por ejemplo, es necesario usar un grabador. Hoy en día, los grabadores para EEPROMs de bus paralelo pueden ser relativamente costosos.<br />
<br />
<b>MEEPROMMER</b><br />
<br />
MEEPROMMER es el nombre de un diseño de Mario Keller basado en un Arduino, publicado bajo licencia open source (MIT): <a href="https://github.com/mkeller0815/MEEPROMMER">https://github.com/mkeller0815/MEEPROMMER</a>. El autor también desarrolló una aplicación Java que sirve para interactuar con el grabador, para grabar o leer datos desde la memoria, comparar la imagen con el contenido de la memoria, etc. El esquemático puede verse a continuación: <br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN41SnoZcZx2bg_0xzs_pAPSuhdK4plpTIUQxUaQWGASqANWjOUvyy0H6CiNREYHWhKGUXJTDUNWQD76fMC_CkMOsciC6tXNMZW9uT0qUpNloTUK5EObTk9UlT6PigPwCIkZ6bpjfKjVk/s1600/meeprommer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN41SnoZcZx2bg_0xzs_pAPSuhdK4plpTIUQxUaQWGASqANWjOUvyy0H6CiNREYHWhKGUXJTDUNWQD76fMC_CkMOsciC6tXNMZW9uT0qUpNloTUK5EObTk9UlT6PigPwCIkZ6bpjfKjVk/s320/meeprommer.jpg" width="320" height="207" data-original-width="1413" data-original-height="912" /></a></div><br />
<br />
Aquí se puede ver el circuito montado, ya funcionando:<br />
<br />
Para llegar a esto, fue necesario un troubleshooting bastante laborioso. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFtzdgR5oyMeJ4mzXptDgPyUnJGdn6YJzG1wODjDWaf8hR0rtxBx-L6NUl5C_jHmmcn1P6oF5wpeKvMOyOys1WEOTzo5Np8kJO-63ZEK6413l7lLreEcv3HjBSl3kmlG-lAIPpvNF8Y8Q/s1600/meeprommer-retux.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFtzdgR5oyMeJ4mzXptDgPyUnJGdn6YJzG1wODjDWaf8hR0rtxBx-L6NUl5C_jHmmcn1P6oF5wpeKvMOyOys1WEOTzo5Np8kJO-63ZEK6413l7lLreEcv3HjBSl3kmlG-lAIPpvNF8Y8Q/s320/meeprommer-retux.jpeg" width="240" height="320" data-original-width="240" data-original-height="320" /></a></div><br />
<b>Sobre el troubleshooting</b><br />
<br />
En varios aspectos un montaje electrónico se parece a cualquier otra artesanía: en general una vez montado el circuito en un prototipo o no, siempre es necesario dedicar tiempo al troubleshooting. Por errores humanos u otros factores, siempre algo puede fallar, algo habrá que mejorar o depurar. Estas notas son la historia de este troubleshooting, supongo que quizá le sean de utilidad a otros o posiblemente a mí mismo, cuando me haya olvidado de lo que tuve que hacer para detectar la falla.<br />
Además de el proyecto en github, me fue muy útil para el troubleshooting la información disponible en este site en español: <a href="https://8bit65.wordpress.com/2014/09/04/programando-la-eeprom/">https://8bit65.wordpress.com/2014/09/04/programando-la-eeprom/</a><br />
También los consejos de foros y de mi amigo el Bocha me fueron de gran utilidad.<br />
Como en un troubleshooting de cualquier cosa, la técnica que me resulta más eficaz es dividir el problema en partes más pequeñas, hasta identificar las fallas. <br />
El diseño de Mario se basa en dos shift registers (los chips 74HC595) que sirven para resolver el problema de la cantidad de pines I/O necesarios para el bus de direcciones (15) más el bus de datos (8) y pines de control de la memoria. Por supuesto, los pines de un arduino nano no serían suficientes. El registro de desplazamiento permite controlar 8 salidas al mismo tiempo, mientras solo se utilizan unos pocos pines del microcontrotrolados. Una buena explicación acerca del principio de funcionamiento puede leerse en: <a href="https://www.arduino.cc/en/Tutorial/ShiftOut">https://www.arduino.cc/en/Tutorial/ShiftOut</a><br />
<br />
Luego de que las primeras pruebas indicaran que algo estaba fallando, para el troubleshooting del circuito seguí el siguiente orden:<br />
<br />
<b>1)</b> Testeado del cableado en la placa experimental.<br />
<br />
<b>2)</b> Se puede utilizar el monitor serie de arduino IDE o cualquier programa de comunicaciones serie, funcionando a 115200 bps para interactuar con el circuito, utilizando el protocolo que el autor implementó. Pasando un caracter 'V' nos mostrará los comandos disponibles y también se pueden ver con más detalle aquí: <a href="https://8bit65.wordpress.com/2014/09/04/programando-la-eeprom/">https://8bit65.wordpress.com/2014/09/04/programando-la-eeprom/</a><br />
<br />
<b>3)</b> Prueba del bus de direcciones (salida de ambos shift registers). El código original de Keller tiene un comando muy útil para el troubleshooting: <b>A,ADDRESS</b>. Pasándole la dirección en hexadecimal, el bus de direcciones tendrá que asumir el valor dado. Así se encuentra documentado en el código:<br />
<br />
<div class="code">// Set the address bus to an arbitrary value.<br />
// Useful for debugging shift-register wiring, byte-order.<br />
// e.g. A,00FF<br />
</div><br />
Entonces el comando A,00FF habrá de poner los primeros 8 bits del bus de direcciones en 1.<br />
<br />
Con un array de leds probé el bus de direcciones:<br />
<br />
Con esto descubrí que había un problema con mi cableado del bus de direcciones que no había detectado en (1) <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7ekyI4d9N4drUW7Dn059NIaOaGLYj5JHsvc7YQNcwoyJqE8iqFpkfugLygpgo2SQ-MnCMo3gw37EsTtsvz_23dKUsAQrvVeNECz5SbUdOuJqJavZpDsjndbp1mwBoxmSbaYAg3FIhCpk/s1600/meeprommer-addr-bus.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7ekyI4d9N4drUW7Dn059NIaOaGLYj5JHsvc7YQNcwoyJqE8iqFpkfugLygpgo2SQ-MnCMo3gw37EsTtsvz_23dKUsAQrvVeNECz5SbUdOuJqJavZpDsjndbp1mwBoxmSbaYAg3FIhCpk/s320/meeprommer-addr-bus.jpeg" width="320" height="240" data-original-width="320" data-original-height="240" /></a></div>Corregido el cableado ahora el bus de direcciones comenzó a funcionar al 100%, pero por algún otro motivo la grabación de datos continuaba fallando.<br />
<br />
<b>4)</b> Prueba de lectura: Para las pruebas también me ayudó bastante haber encontrado guardada una RAM estática, memoria que se graba y accede de una forma muy similar a estas eeproms.<br />
Como puede consultarse en su hoja de datos, para concluir cada ciclo de escritura -ya sea de un byte, o de una página de 64 bytes- se lleva a cabo un proceso de "data polling". Se lee la salida del bus de datos, y una vez que esta coincide con el byte que se quería almacenar, concluye el ciclo de escritura.<br />
Seguí el consejo de mi amigo el Bocha y uní algunas líneas del bus de direcciones con el bus de datos. De esta manera, podría setear una dirección arbitraria y leer un byte del bus. Si los datos coincidían la lectura estaría funcionando correctamente.<br />
Agregué una función corta al código para esas pruebas y los datos concidieron. Las cosas empezaban a mejorar, direcciones y lectura funcionaban ok. Como para escritura se utiliza el mismo bus de datos, tenía certeza de que esas líneas estaban ok. Fue necesario además, poner unas resistencias de unos 10K entre los pines del bus de datos que no se usaban y masa, para evitar que en la lectura dichos pines quedara en estado indefinido.<br />
<br />
<b>5)</b> El siguiente paso era intentar escribir apenas un byte en una dirección de la memoria y leerlo para ver si el valor conicidía. Para ello una breve función de tests:<br />
<br />
<div class="code">void run_tests(void) {<br />
//void fast_write(unsigned int address, byte data)<br />
Serial.println("\nWriting \'c\' char to addr 0000...");<br />
fast_write(0000,'c');<br />
delay(100);<br />
Serial.println("\nReading from addr 0000. Should get ascii 99 ...");<br />
byte data = read_byte(0000);<br />
Serial.print(" ");<br />
Serial.print(data);<br />
}<br />
</div><br />
Esta prueba, con la SRAM tenía éxito, pero con la eeprom no. A esas alturas ya estaba bastante claro que el circuito se encontraba funcionando, pero algo fallaba en la interacción con la memoria eeprom.<br />
La falla resultó ser bastante rara. Pero no solo me había ocurrido a mí. La eeprom tiene un código de bloqueo, que si uno desea establecerlo bloquea la eeprom. No se pueden borrar los datos, si no se envía antes el código de desbloqueo que el fabricante especifica.<br />
Aparentemente, la EEPROM 28C256 que tenía (la única por el momento) había venido bloqueada.<br />
Luego de envíar el código de desbloqueo el circuito empezó a funcionar correctamente.<br />
<br />
No me queda más que agradecer a Mario Keller por compartir su diseño, a Marcel Van Kervinck <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJN0HBumdVfIGP0XkWG4BByfT5nYFJOzfxpSE3KZXXAOXXmRNu1qaxr236xGiX5qFV5l5RB7c_LinHot3hmEFNB1jTU0HqtDKD9LJVitQ9vJaKGkaKqOOv4BAHKbZAQIgBKy6DjPSnc80/s1600/meepromer-retux.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJN0HBumdVfIGP0XkWG4BByfT5nYFJOzfxpSE3KZXXAOXXmRNu1qaxr236xGiX5qFV5l5RB7c_LinHot3hmEFNB1jTU0HqtDKD9LJVitQ9vJaKGkaKqOOv4BAHKbZAQIgBKy6DjPSnc80/s320/meepromer-retux.jpeg" width="240" height="320" data-original-width="599" data-original-height="800" /></a></div>https://github.com/kervinck (su versión del código me ayudó para el desbloqueo), otros del foro 6502.org y a mi amigo el Bocha. Ahora solo queda darle algún uso interesante al grabador, para divertirse un rato con retro computing.<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-47461122408874749672018-02-21T16:13:00.000-03:002018-02-21T16:58:05.200-03:00SELinux ¿De forma fácil?SELinux es una de las alternativas disponibles en Linux para MAC (Mandatory Access Control), que es una segunda y potentísima barrera de contención por encima de DAC o Discrecionay Access Control, es decir el sistema clásico de permisos en derivados de Unix.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJvC-fKmgsftEb8FOvIzQvdZ2FudPcY4YG-g8csvy4fxLkj5iAT1Uzwy_mYcRayAV_5V512_BKkQR46siYl9DVIsuJa3n2m03WTTawKPn6KeYNyvHnUNO2V6RdX2ANkUcLs88tP6otTFE/s1600/Selinux.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJvC-fKmgsftEb8FOvIzQvdZ2FudPcY4YG-g8csvy4fxLkj5iAT1Uzwy_mYcRayAV_5V512_BKkQR46siYl9DVIsuJa3n2m03WTTawKPn6KeYNyvHnUNO2V6RdX2ANkUcLs88tP6otTFE/s320/Selinux.jpg" width="320" height="310" data-original-width="900" data-original-height="873" /></a></div>SELinux tiene fama de resultar complejo y dificil para el recién llegado. Este artículo viene por una parte a confirmar esa percepción, pero con la esperanza de que con horas de trabajo el aprendizaje se irá completando. <br />
<br />
<br />
<span class="fullpost"><br />
<br />
SELinux fue desarrollado por la NSA junto a otras empresas como Red Hat y Mc Afee que contribuyeron mucho al proyecto. Fue incluído desde las ramas 2.6 del kernel Linux. <br />
<br />
<b>SELinux ¿Por qué importa usarlo?</b><br />
<br />
Un kernel linux con política de MAC (Control de Acceso Obligatorio) sirve para confinar programas de usuario y servidores (demonios), como también acceso a archivos y recursos de red. De esta forma es posible aplicar tan solo el menor privilegio requerido para que una aplicación dada funcione, lo que reduce enormemente la exposición a fallas, errores de configuración o buffers overflows. Como SELinux es una forma de implementar RBAC (Role Based Access Control) su uso es altamente recomendado en aplicaciones de la industria financiera o en organizaciones donde hay que reducir al mínimo la exposición de información.<br />
Este confinamiento de aplicaciones, usuario y recursos no reconoce el concepto de "roor" o super-<br />
usuario y no comparte características del control de acceso discrecional como setuid/setgid.<br />
En tiempos de Spectre y Meltdown, cualquier implementación de MAC que contribuya a ofrecer un cierto grado de seguridad adicional resulta valiosa.<br />
<br />
<b>Él está ahí, no lo deshabilites</b><br />
<br />
En muchas oportunidades nos encontramos con algún tutorial o incluso con el vendor de alguna aplicación que diga "La aplicación X requiere deshabilitar SELinux". Eso siempre es lo último que hay que hacer. En realidad lo que eso quiere decir el vendor Y no tiene idea acerca de cómo hacer que su app funcione con SELinux. <br />
¿Por qué deshabilitarlo es la peor idea? Porque por defecto las distribuciones actuales que utilizan SELinux (puede ser Centos o RH pero también Debian) vienen con una política ya configurada que permite que cuando ejecutamos aplicaciones como nginx o apache estas ya corran "confinadas" en un dominio SELinux. Deshabilitar SELinux globalment supone perder esa ventaja. <br />
Pero SELinux tiene una fama bien ganada de tener una curva de aprendizaje lenta, de ser complicado por demás. Hay que decirlo también, puede ser complicado pero ofrece una solución sumamente potente para MAC.<br />
Este artículo, breve es el resultado de haber dedicado unas cuantas horas a entender algo sobre SELinux y a escribir un módulo para ejecutar confinada una aplicación web simple. Por defecto, en un sistema con SELinux una apliación que no está descrita en la "policy" correra en modo no-confinado, es decir, como si SELinux no estuviera corriendo.<br />
Es cierto que actualmente SELinux es mucho más sencillo de lo que acostumbraba debido a que vienen incluidas con él un set de herramientas que hacen las cosas bastante más fáciles.<br />
Más que nada el artículo tiene por objeto describir cuál fue el proceso para escribir un módulo, lo que implicó un arduo trabajo de iteracioes prueba/error, hasta que finalmente la aplicación quedó funcionando confinada.<br />
Antiguamente la policy de SELinux solía ser monolítica, pero actualmente se pueden escribir módulos (de alguna forma similares a los del kernel linux) que permiten escribir políticas modulares por cada aplicación. De hecho si en un sistema SELinux hacemos # semodule -l veremos todos los módulos que componen la policy, identificados en general por la aplicación que confinan.<br />
<br />
<b>Algo concreto con SELinux</b><br />
<br />
Para esta PoC utilicé una aplicación web muy simple que suele la que uso para probar algunas cosas. Es una versión web del clásico Fortune (escrita con el micro framework flask en python). La misma, junto con la policy SELinux se puede encontrar aquí: <a href="https://github.com/retux/flask-web-fortune">https://github.com/retux/flask-web-fortune</a><br />
<br />
La vamos a configurar con un nginx que actuará como reverse proxy:<br />
<br />
<br />
I N T E R N E T ⇒ NGINX:80 => localhost:5000<br />
<br />
<br />
<br />
Para escribir nuestro módulo CentOS se requieren los siguientes paquetes:<br />
<br />
<div class="code">setools-console<br />
policycoreutils-python-2.5-17.1.el7 // Este último provee el binario para /usr/sbin/semanage<br />
policycoreutils-devel // este provee los pkg de desarrollo para escribir policies.<br />
</div><br />
<br />
Con web-fortune escuchando en el puerto 5000 la aplicación correrá como unconfined:<br />
<br />
<div class="code"># ps auxZ | grep web<br />
system_u:system_r:unconfined_service_t:s0 rtxapps 12430 0.0 1.6 223476 17064 ? Ss 15:08 0:00 /usr/local/share/venvs/flask-web-fortune/bin/python /usr/local/share/applications/web-fortune/app.py<br />
</div><br />
Una vez que hayamos configurado el reverse proxy para que conecte a localhost:5000 seguramente nos entraremos con una barrera que nos pone SELinux. En el audit.log veremos mensajes como este:<br />
<br />
<div class="code">type=AVC msg=audit(1519064697.245:443): avc: denied { name_connect } for pid=12674 comm="nginx" dest=5000 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:commplex_main_port_t:s0 tclass=tcp_socket<br />
type=AVC msg=audit(1519064697.246:444): avc: denied { name_connect } for pid=12674 comm="nginx" dest=5000 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:commplex_main_port_t:s0 tclass=tcp_socket<br />
</div><br />
audit2allow es LA herramienta SELinux que servirá para todo el camino, en general siempre va a darnos alguna pista acerca de lo que hay que hacer, pero debemos tener cuidado de no seguir todo al pie de la letra.<br />
<br />
<div class="code"># tail -n30 /var/log/audit/audit.log | grep avc | audit2allow<br />
<br />
<br />
#============= httpd_t ==============<br />
<br />
#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'<br />
allow httpd_t commplex_main_port_t:tcp_socket name_connect;<br />
</div><br />
nginx no consigue conectar al puerto TCP 5000 porque la policy no lo permite.<br />
Como indica audit2allow, tenemos dos alternativas:<br />
<br />
La primera utilizar booleans (httpd_can_network_connect), con este boolean vamos a habilitar varias cosas, por ejemplo que el servidor web (en este caso nginx pueda conectar diversos puertos, smtp, el 5000 como requerimos acá).<br />
<br />
<div class="code"># getsebool httpd_can_network_connect<br />
httpd_can_network_connect --> off<br />
<br />
# setsebool httpd_can_network_connect on<br />
</div><br />
Si funciona de la manera esperada lo podemos setear como Persistente (con el modificador -P)<br />
<br />
<div class="code"># setsebool -P httpd_can_network_connect on<br />
</div><br />
Los booleans de SELinux son como interruptores que permiten cambiar algún aspecto de la policy al vuelo. Habilitando este boolean permitieremos que las aplicaciones que corran en el dominio httpd_t puedan conectar a un puerto TCP. Este puede ser el 5000 de nuestra app o el 25 para un MTA local por ejemplo, con lo cual este boolean tiende a ser bastante utilizado. <br />
Cabe destacar que bajo ningún concepto SELinux reemplaza a otras herramientas como iptables o firewall en general. SELinux es una capa más en el camino de la seguridad que se complementa con muchas otras.<br />
Habilitado el boolean y con web-flask-fortune corriendo en modo no-confinado tendremos las cosas funcionando. Pero siempre hay más, siga leyendo lector.<br />
<br />
<br />
<b>Creando un módulo de SELinux policy "from scratch" para confinar fortune</b><br />
<br />
Si por ejemplo queremos confinar una aplicación, en mi caso una web app flask que escucha en localhost:5000 y que tiene un nginx río arriba.<br />
<br />
El comando sepolicy generate sirve para crear los archivos iniciales necesarios para compilar un módulo, o sea los .te, .fc y .if.<br />
<br />
Ejemplo:<br />
<br />
<div class="code">sepolicy generate --init -n web-fortune /home/rtxapps/.venvs/flask-web-fortune/bin/python<br />
</div><br />
Nótese que el path a python es el binario con el que va a correr la app python, en este caso la versión del venv. En general el path al archivo que inicia el demonio lo podríamos tomar de ExecStart del unit file de systemd.<br />
<br />
Después de ejecutar el .sh que provee tendremos que tener el módulo compilado e insertado en la policy de SELinux:<br />
<br />
<div class="code"># semodule -l | grep web-fortune<br />
</div><br />
Y después de un restart del servicio podremos ver que en contexto (más que nada el tipo) con el que corre el script ha cambiado:<br />
<br />
<div class="code"># ps auxZ | grep fortune | grep -v grep<br />
system_u:system_r:web-fortune_t:s0 rtxapps 15081 0.0 1.6 223476 17068 ? Ss 19:55 0:00 /usr/local/share/venvs/flask-web-fortune/bin/python /usr/local/share/applications/web-fortune/app.py<br />
</div><br />
Puede decirse que ahora la aplicación está corriendo confinada.<br />
<br />
Podemos ver también que SELinux etiquetó el “binario” python que inicia nuestro script:<br />
<br />
<div class="code"># semanage fcontext -l | grep "fortune"<br />
/usr/local/share/venvs/flask-web-fortune/bin/python regular file system_u:object_r:web-fortune_exec_t:s0<br />
</div><br />
Este era el contexto original de fortune.txt:<br />
<br />
<div class="code">ls -lZ /usr/local/share/applications/web-fortune/fortune.txt<br />
-rwxrwxr-x. rtxapps rtxapps unconfined_u:object_r:usr_t:s0 /usr/local/share/applications/web-fortune/fortune.txt<br />
</div><br />
<br />
De seguro, la app habrá quedado funcionando sin problemas porque el type web-fortune-t está corriendo en modo permissive:<br />
<br />
<div class="code"># semanage permissive -l<br />
<br />
Customized Permissive Types<br />
Builtin Permissive Types<br />
<br />
web-fortune_t<br />
…<br />
</div><br />
Por defecto en el archivo .te que nos haya generado sepolicy generate incluye una línea:<br />
<br />
<div class="code">permissive web-fortune_t;<br />
</div><br />
“Builtin permissive” se refiere a módulos que fueron construidos con ese tag en su archivo .te.<br />
Esto es MUY interesante, porque indica cuál es el flujo de trabajo cuando trabajamos para “confinar” los privilegios de una app con SELinux. El modo permissive permite que una vez que hayamos insertado nuestro módulo éste haga que SELinux escriba las AVC que violen las reglas, pero eso es precisamente para que la aplicación corra sin restricciones, va a loguear los problemas y podremos ajustar el módulo para ajustarlo a la necesidad.<br />
<br />
Hay que tener en cuenta que un módulo que corra en modo permissive no lo podremos deshabilitar, de esta forma:<br />
<br />
<div class="code"># semanage -d web-fortune_t<br />
libsemanage.semanage_direct_remove_key: Unable to remove module permissive_web-fortune_t at priority 400. (No such file or directory).<br />
OSError: No such file or directory<br />
</div>Source: http://danwalsh.livejournal.com/42394.html<br />
<br />
Para que podamos cambiar un "tipo" o app de modo permisivo o no debemos comentar en esa línea en el .te.<br />
Pero esto define el flujo de trabajo para el desarrollo del módulo de la app. En modo permisivo la app va a funcionar sin bloqueos, pero logueando las violaciones a las reglas de la policy. Con dichas violaciones en el log (audit.log o messages) usaremos audit2allow para depurar el código. Este es un arduo camino. Nadie dijo que era fácil.<br />
<br />
<b>¿Qué hacer cuando lo sacamos de modo permissive y la app no anda y aparecen AVCs en el log? </b><br />
<br />
El trabajo es recursivo, prueba y error. Una forma en que audit2allow nos puede ayudar -y mucho- es la siguiente:<br />
<br />
<div class="code">audit2allow -a -l <br />
</div><br />
O bien:<br />
<br />
<div class="code">audit2allow -a -l -M nombre-modulo<br />
</div><br />
Este último generará los cambios que necesitamos en un módulo (.pp) podemos ir agregando las indicaciones que nos de audit2allow a nuestros .te. El modificador -l nos dará una indicación de las AVCs ocurridas desde la última carga de la policy (o de módulo).<br />
En el caso de este módulo, fue central agregar el contenido de la sección require:<br />
<br />
<br />
<div class="code">require {<br />
type commplex_main_port_t;<br />
type net_conf_t;<br />
type ldconfig_exec_t;<br />
type bin_t;<br />
type proc_t;<br />
type node_t;<br />
type shell_exec_t;<br />
type web-fortune_t;<br />
type cert_t;<br />
type usr_t;<br />
type lib_t;<br />
type user_home_dir_t;<br />
class tcp_socket { accept bind name_bind node_bind shutdown };<br />
class file { execute execute_no_trans getattr open read };<br />
}<br />
</div><br />
Queda para otro artículo la comparación y la misma implementación usando otra herramienta para confinamiento, como puede ser apparmor.<br />
<br />
<b>Fuentes</b>:<br />
<br />
<a href="https://mgrepl.wordpress.com/2015/05/20/how-to-create-a-new-initial-policy-using-sepolicy-generate-tool/">https://mgrepl.wordpress.com/2015/05/20/how-to-create-a-new-initial-policy-using-sepolicy-generate-tool/</a><br />
<br />
Dan Walsh es la autoridad de SELinux, la mejor doc es de su autoría. Todos sus posts son más que útiles: <a href="http://danwalsh.livejournal.com/">https://danwalsh.livejournal.com/</a><br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-78779220146352694312018-02-16T17:48:00.001-03:002018-02-16T17:49:33.844-03:00Infra como codigo: manejar containers LXD con terraformNo hace falta argumentar las ventajas del uso de Infraestructura como Código, sea cuál fuere el destino, plataformas de cloud como aws, google o muchas más. Pero también es una herramienta muy práctica para gestionar como código la creación de containers de docker o lxc. En este caso me ocupo de algunos ejemplos simples para uso con LXD.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkHv_IjtGKFnS6PX1udh59xFSK0AIU3iaRn5l7ZpZpoVKPKUMa210AbomxfAQafOKNuQF7NxZiObsB-y36BVyrFdGejdHKWskxgLlrW5CW0KeKwhjCAHG3rjF2a71Qwd3g70qoXRlzt8I/s1600/lxd.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkHv_IjtGKFnS6PX1udh59xFSK0AIU3iaRn5l7ZpZpoVKPKUMa210AbomxfAQafOKNuQF7NxZiObsB-y36BVyrFdGejdHKWskxgLlrW5CW0KeKwhjCAHG3rjF2a71Qwd3g70qoXRlzt8I/s320/lxd.jpeg" width="320" height="154" data-original-width="324" data-original-height="156" /></a></div><br />
Terraform es una herramienta para construir, cambiar y versionar infraestructura de manera segura y eficiente.<br />
<br />
<span class="fullpost"><br />
<br />
<b>Terraform y sus providers</b><br />
<br />
Terraform tiene la enorme ventaja de manejar sos providers como plugins instalables, separados del binario principal. Esta es una forma de modularizar la aplicación como también de hacerla más fácilmente extensible.<br />
Existen providers no solo para las principales plataformas de cloud (SaaS, PaaS, IaaS). Una lista de los plugins oficiales puede encontrarse en el site de terraform: https://www.terraform.io/docs/providers/<a href="https://www.terraform.io/docs/providers/"></a> <br />
Pero también la comunidad crea otros providers, en este caso el plugin para manejar containers de LXD es: https://github.com/sl1pm4t/terraform-provider-lxd <a href="https://github.com/sl1pm4t/terraform-provider-lxd"></a><br />
Una vez instalado el plugin como indica la doc, en el directorio .terraform/plugins/linux_amd64/, relativo a donde tengamos nuestro "código" de terraform, podremos listar los providers:<br />
<br />
<div class="code">$ terraform providers<br />
.<br />
├── provider.lxd<br />
</div><br />
Con eso listo ya podemos crear los containers codificándolos, sigue un ejemplo simple:<br />
<br />
<b>providers.tf </b><br />
<div class="code">provider "lxd" {<br />
alias = "unix"<br />
}<br />
</div><br />
<b>profiles.tf </b><br />
<div class="code">resource "lxd_profile" "ssh-access" {<br />
name = "ssh-access"<br />
<br />
config {<br />
limits.cpu = 1<br />
}<br />
}<br />
</div><br />
<br />
<b>container.tf </b><br />
<div class="code">resource "lxd_container" "test1" {<br />
name = "test1"<br />
provider = "lxd.unix"<br />
image = "images:debian/stretch/amd64"<br />
ephemeral = false<br />
profiles = ["default", "ssh-access"]<br />
depends_on = ["lxd_profile.ssh-access"]<br />
<br />
<br />
provisioner "local-exec" {<br />
command = "lxc exec test1 -- /bin/sh -c 'apt-get update && apt-get install openssh-server -y'"<br />
}<br />
<br />
}<br />
</div><br />
Y con terraform plan / apply ya tendremos nuestro primer container creado.<br />
Para un aprovisionamiento simple terraform utiliza ssh, como la mayoría de las imágenes de lxd vienen sin openssh-server instalado, deberemos aprovisionarlo con el recurso local-exec.<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-84520601013166630892017-03-26T23:09:00.000-03:002017-03-26T23:09:08.416-03:00Story of a Commodore 64Almost any object can become part of a certain story. This is the story of an old Commodore 64 (8 bits computer) I got for a few dollars here in Buenos Aires. The computers was not working so this is the story of how I found the parts needed to take it back to life. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvt3T5Fo2mJGLJlZiPwoPxOQF8QGxXcQKtfkbQC2kEpMV0Qd_UAbhU9w4l7MQPzukDfydRPsPa-kMgRgFNn4odZD0nceOh61ylqPaMsesWcjU9L_wdOI5JX7dBeAqJ4amCQCRUm2I3gMA/s1600/20170325_191852.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvt3T5Fo2mJGLJlZiPwoPxOQF8QGxXcQKtfkbQC2kEpMV0Qd_UAbhU9w4l7MQPzukDfydRPsPa-kMgRgFNn4odZD0nceOh61ylqPaMsesWcjU9L_wdOI5JX7dBeAqJ4amCQCRUm2I3gMA/s320/20170325_191852.jpg" width="320" height="240" /></a></div><span class="fullpost"><br />
<br />
In part of my spare time I enjoy working on electronics and with nowadays is called “maker culture” and more particularly with retro-computing.<br />
When I was a kid my first computer was a Radio Shack Color Computer II (known as coco 2). I was lucky to get that computer. At that time it gave me lot of fun and excitement. Coco was just great. Still I keep that coco with me, and is working just fine as in the old days. Of course today, it is mostly useless as you can not search the web, or even use a fancy spreadsheet. <br />
I remember Linus Torvalds’ opinion on 8 bit computers: At those days if you had enough documentation and curiosity you could develop a good knowledge about how a computer works. Because computers were simpler than the ones that came after. That is part of the success of a computer like Raspberry Pi. <br />
I think we can still learn a lot of those old computers. It’s just like going to a museum, but a particular one where you can play around <br />
with objects.<br />
Some months ago I got a Commodore 64 for a few argentine pesos. The reason why? The computer did not work. The outside was good, keyboard looked fine, case was in good shape too, but there was no video output and the power supply had been lost. No video, no power supply.<br />
I wondered if I should have removed the pcb and put a raspberry Pi in it, but I decided first to try to repair the commodore and to get or build a power supply.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCNy-2EMWD2XDTer6KzMMJC8VZpx9OrBzz6TdquE4cGhwotixhykz8wnoQBArgS3JWppHLilSnjOhbC5TBVwygt9TBp4s3CpH4Q7MfxKZXDG9plzWWMFM-EfS19UrNn6ar0HEFVFO7DJY/s1600/c64armada.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCNy-2EMWD2XDTer6KzMMJC8VZpx9OrBzz6TdquE4cGhwotixhykz8wnoQBArgS3JWppHLilSnjOhbC5TBVwygt9TBp4s3CpH4Q7MfxKZXDG9plzWWMFM-EfS19UrNn6ar0HEFVFO7DJY/s400/c64armada.jpg" width="400" height="300" /></a></div>The cause of the video failure (no video at all/black screen) was the MOS-8701 chip. The chip had to be replaced, and finding one of them nowadays is not easy. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeLS7uEU3kPNIb1PK_iZtRBzchyJyAF75HA4golzL-6DWdb1iuXNdjWKqMDuwfedc2ZtHnHgrWWEmKuHS6cP4t9p8FtIwp3XSrnsa8NKDuGRd86LQCZaZnGcFCj770s6lYgdbcdsOwQ1g/s1600/c64b.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeLS7uEU3kPNIb1PK_iZtRBzchyJyAF75HA4golzL-6DWdb1iuXNdjWKqMDuwfedc2ZtHnHgrWWEmKuHS6cP4t9p8FtIwp3XSrnsa8NKDuGRd86LQCZaZnGcFCj770s6lYgdbcdsOwQ1g/s320/c64b.jpg" width="320" height="240" /></a></div>Fortunately, I was able to find a new one. The price was not cheap, but at that point I was committed to get the C64 repaired.<br />
<br />
Then, I went to a the house of a friend of mine who owns a c64 and tested mine. With the new 8701 it was working.<br />
Now it was necessary to get or build a power supply. C64 original PSU it was its weakest part. The power supply used to get very hot, and I mean very hot. It was placed inside a dust proof case and that contributed to the increasing heat.<br />
So building a modern power supply using a switching psu would be fine. With parts I have lying around the house: a case, a switching 5 Vdc power supply and a transformer for 9 Vac. Finding a DIN plug the C64 uses for PSU was not easy nowadays. I almost gave up, but finally I could get one. Otherwise I would have had to order it abroad.<br />
I put those parts inside the case, added a 2A fuse for the 9 Vac output. Tested the voltages and the DIN pinout twice, and then plugged into the C64.<br />
The computer is working as in the old days. Now is time to get some games and show the kids how we had fun time ago. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4AN-_XGLszpRyvxmQ2qhl61xR0r07RcLxN_gjC95zjYMiyPdNp42PL2jXZyPsrtEjJrVT0_ACA36Q8lPi08V9WB8FEGQw1ps_wSkhBdlipyYByRFDdwOX9ieZBhMMZaQV8y3QH-6fxw/s1600/20170323_192612.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4AN-_XGLszpRyvxmQ2qhl61xR0r07RcLxN_gjC95zjYMiyPdNp42PL2jXZyPsrtEjJrVT0_ACA36Q8lPi08V9WB8FEGQw1ps_wSkhBdlipyYByRFDdwOX9ieZBhMMZaQV8y3QH-6fxw/s320/20170323_192612.jpg" width="320" height="240" /></a></div><br />
In this video C64 and it "brand new" psu can be seen working: <iframe allowfullscreen="" frameborder="0" height="344" src="https://www.youtube.com/embed/d9BslOY-gvo" width="459"></iframe><br />
<br />
-RetuX-<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-89235800404852710132017-03-25T23:02:00.002-03:002017-03-25T23:02:45.165-03:00Una historia retro (computación)Casi cualquier objeto puede convertirse en una historia. Cosas incluso con poco o nulo valor de cambio pueden tener un enorme valor de uso para alguien. Los que amamos ciertos objetos, aún más allá de las posibilidades de nuestro espacio en casa lo sabemos bien.<br />
Esta es la historia de una Commodore 64. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvt3T5Fo2mJGLJlZiPwoPxOQF8QGxXcQKtfkbQC2kEpMV0Qd_UAbhU9w4l7MQPzukDfydRPsPa-kMgRgFNn4odZD0nceOh61ylqPaMsesWcjU9L_wdOI5JX7dBeAqJ4amCQCRUm2I3gMA/s1600/20170325_191852.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvt3T5Fo2mJGLJlZiPwoPxOQF8QGxXcQKtfkbQC2kEpMV0Qd_UAbhU9w4l7MQPzukDfydRPsPa-kMgRgFNn4odZD0nceOh61ylqPaMsesWcjU9L_wdOI5JX7dBeAqJ4amCQCRUm2I3gMA/s320/20170325_191852.jpg" width="320" height="240" /></a></div>A más o menos 30 años de su punto de mayor suceso en el mercado la conseguí por unos pocos pesos. Claro, no funcionaba y tampoco tenía fuente de alimentación. Lento trabajo y diversión de fin de semana, ayuda de amigos y un poco de cabezadurismo per jodere y la C64 está en funcionamiento otra vez.<br />
<span class="fullpost"><br />
<br />
Linus Torvalds se refería a las computadoras de la era de los 8 bits de una manera, me parece, muy acertada: bastaba que tuvieras acceso a la documentación e información para que desarrollaras conocimiento con y acerca de esas máquinas. No es casual que varios desarrolladores del kernel Linux sean aficionados fervientes del retro computing, quizá el caso más conocido sea el de John Linville.<br />
Tampoco es casual el éxito de las Raspberry Pi. Dejen que sean populares y si los chicos se interesan de verdad seguramente las aprovechen. Cuanto más básica es una herramienta más necesitas desarrollar una habilidad con ella.<br />
Creo que tantos años después sin duda alguna nostalgia cabe: tener una C64 en la Argentina de aquel tiempo era algo que no todos podíamos tener. Sin no me equivoco, fue algún aristócrata europeo el que dijo, la principal diferencia entre un hombre y un niño es el precio de sus juguetes.<br />
Fue así: a fines de 2016 conseguí por unos pocos pesos esta Commodore 64, en buen estado externo pero sin funcionar<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCNy-2EMWD2XDTer6KzMMJC8VZpx9OrBzz6TdquE4cGhwotixhykz8wnoQBArgS3JWppHLilSnjOhbC5TBVwygt9TBp4s3CpH4Q7MfxKZXDG9plzWWMFM-EfS19UrNn6ar0HEFVFO7DJY/s1600/c64armada.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCNy-2EMWD2XDTer6KzMMJC8VZpx9OrBzz6TdquE4cGhwotixhykz8wnoQBArgS3JWppHLilSnjOhbC5TBVwygt9TBp4s3CpH4Q7MfxKZXDG9plzWWMFM-EfS19UrNn6ar0HEFVFO7DJY/s400/c64armada.jpg" width="400" height="300" /></a></div>.<br />
El bajo precio se justificaba porque la máquina no funcionaba, y además se le había perdido o destruido la fuente de alimentación original.<br />
Con la ayuda de mi amigo Hernán y Alejandro -con los que desde la secundaria nos hicimos todos radioaficionados- hicimos el troubleshooting básico: pudimos detectar por qué la máquina no generaba señal de video. El chip MOS-8701 era el responsable. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeLS7uEU3kPNIb1PK_iZtRBzchyJyAF75HA4golzL-6DWdb1iuXNdjWKqMDuwfedc2ZtHnHgrWWEmKuHS6cP4t9p8FtIwp3XSrnsa8NKDuGRd86LQCZaZnGcFCj770s6lYgdbcdsOwQ1g/s1600/c64b.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeLS7uEU3kPNIb1PK_iZtRBzchyJyAF75HA4golzL-6DWdb1iuXNdjWKqMDuwfedc2ZtHnHgrWWEmKuHS6cP4t9p8FtIwp3XSrnsa8NKDuGRd86LQCZaZnGcFCj770s6lYgdbcdsOwQ1g/s320/c64b.jpg" width="320" height="240" /></a></div>Conseguirlo fue providencial. No creo que hoy en día se use ese integrado para alguna otra cosa supongo, así que me hipótesis es que habrá quedado en stock desde los años '90.<br />
Reemplazado el chip había que encontrar una fuente de alimentación. La fuente de alimentación original de la C64 era su talón de Aquiles. Era una caja estanca que calentaba por los cuatro costados. Recuerdo un amigo de la primaria que la tenía sobre una alfombra. Un milagro que de jugar al Moon Patrol no hayamos prendido fuego la alfombra.<br />
<br />
Esquemático de la fuente original<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcV3qoq7BQ0jU-vdAOJvDTDE_OwI4nXk_XXpOno6ObLL9OGM5dmtQeg2Q12v2Cvp5qWHt2XANKrfYiWruzJ4xFtPF62w-ijsFbd8cJl9vQKr1It-9xYlVCCs8YnikIJ8udU2NJ19NIvpg/s1600/c64extps.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcV3qoq7BQ0jU-vdAOJvDTDE_OwI4nXk_XXpOno6ObLL9OGM5dmtQeg2Q12v2Cvp5qWHt2XANKrfYiWruzJ4xFtPF62w-ijsFbd8cJl9vQKr1It-9xYlVCCs8YnikIJ8udU2NJ19NIvpg/s320/c64extps.gif" width="320" height="256" /></a></div><br />
La fuente original era muy básica. Por supuesto no era switching, lo que hacía que fuera mucho menos eficaz. Pero eso era lo habitual para la época.<br />
Quizá lo más revolucionario que tuvo la Apple II, primera computadora masiva de Apple fue que fue la primera en contar con una fuente switching. Era algo que la hacía cara, pero era revolucionario para cuando esa máquina salió al mercado.<br />
El resto de las computadoras similares, no la tenía.<br />
Entonces lo más fácil en el siglo XXI era armar un gabinete con una fuente switching y un transformador convencional para la salida de 9 VAC.<br />
La fuente switching vino de algún switch de red que no sirvió más. Y el trafo, lo compré ex profeso. El gabinete también había pertenecido a alguna fuente y lo había guardado pensando usarlo alguna vez. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4AN-_XGLszpRyvxmQ2qhl61xR0r07RcLxN_gjC95zjYMiyPdNp42PL2jXZyPsrtEjJrVT0_ACA36Q8lPi08V9WB8FEGQw1ps_wSkhBdlipyYByRFDdwOX9ieZBhMMZaQV8y3QH-6fxw/s1600/20170323_192612.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4AN-_XGLszpRyvxmQ2qhl61xR0r07RcLxN_gjC95zjYMiyPdNp42PL2jXZyPsrtEjJrVT0_ACA36Q8lPi08V9WB8FEGQw1ps_wSkhBdlipyYByRFDdwOX9ieZBhMMZaQV8y3QH-6fxw/s320/20170323_192612.jpg" width="320" height="240" /></a></div><br />
Agregué un fusible a los 9VAC (de 2A) ya que la switching provee bastante protección. <br />
<br />
Y esa es la historia de esta C64. La fuente funcionando puede verse acá: <iframe allowfullscreen="" frameborder="0" height="344" src="https://www.youtube.com/embed/W2rygkN7d2s" width="459"></iframe><br />
<br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-2197579122261722222017-01-31T19:57:00.001-03:002017-01-31T19:59:43.462-03:00conky se integra cada vez mejor con KDE PlasmaDesde que usaba fluxbox como window manager en una vieja notebook Pentium III durante los primeros años 2000 siempre me gustó conky o su antecesor, torsmo.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7986VtckB1rwMKgY58lpnmWG6vyK3WW8Sr1C26XrCtCZHd6EC7WrqmUOSYEeyPTxZtUJqTw7BFt-rG9wDgUFxcg5NVve_goTq7VErTXeskTdngDLsDCSsL36fXwnxfm2XGnlZn2UEvKM/s1600/conky-vertical-icons-graphs.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7986VtckB1rwMKgY58lpnmWG6vyK3WW8Sr1C26XrCtCZHd6EC7WrqmUOSYEeyPTxZtUJqTw7BFt-rG9wDgUFxcg5NVve_goTq7VErTXeskTdngDLsDCSsL36fXwnxfm2XGnlZn2UEvKM/s320/conky-vertical-icons-graphs.png" width="320" height="200" /></a></div>En la mayoría de los ambientes de escritorio conky se integraba sin problemas. Con KDE lo hacía interfiriendo un poco con los widgets nativos y modificando un poco el comportamiento general del escritorio. Creo que esos días pasaron para siempre. Por lo menos ahora estoy super conforme con cómo conky se integró con Plasma.<br />
<span class="fullpost"><br />
Recientemente también conky cambió la forma en que la configuración (en general el archivo ~/.conkyrc) debe estar estructurada. La configuración que venía usando, que se puede ver en la imagen está disponible en este repo:<br />
<br />
<a href="https://github.com/retux/conky-configs">https://github.com/retux/conky-configs </a><br />
<br />
Una breve guía sobre cómo instalarlo se puede leer en el README.<br />
<br />
<b>¿Cómo optimizar la configuració con Plasma?</b><br />
<br />
La clave de esto la encontré por algún foro que ahora no puedo encontrar su url, pero se trata de lo siguiente:<br />
<br />
Verán en el archivo de configuración la definición del tipo de ventana para conky es:<br />
<br />
<div class="code">own_window_type = 'dock'<br />
</div><br />
Bueno, esto hará la magia. Lo que debemos configurar es el comportamiento que deseamos para esa ventana, lo que en Plasma se hace de esta forma:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZbU1dAnUul_7Hvib7Bbr_l41HRUuwNjuhYEGEZz5p6BodVv_EsYkntDJxwbzseSz7vdNwF4xY0DMIwiXcEhVox3DFFUE9zjf1I3dJ5OBJtj_VFEKYhyphenhyphenYW6YoHecjDtZDjBeu9RIZ_JDg/s1600/config-conky1_20170131_192539.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZbU1dAnUul_7Hvib7Bbr_l41HRUuwNjuhYEGEZz5p6BodVv_EsYkntDJxwbzseSz7vdNwF4xY0DMIwiXcEhVox3DFFUE9zjf1I3dJ5OBJtj_VFEKYhyphenhyphenYW6YoHecjDtZDjBeu9RIZ_JDg/s400/config-conky1_20170131_192539.png" width="400" height="250" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2ImBsRFSXhDO5Fc06AtxuRn3FNn1C04M11OETW2Rv0UDyqBchOuDhL8seq72Vg4G0C7HRxUj3gVjYAulYRiyaDEDRGOdb9cTxR3QT4i9bfB6mT96KRJW50D2_5UgeLpQFxHNCVlnDsJ8/s1600/Config-conky2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2ImBsRFSXhDO5Fc06AtxuRn3FNn1C04M11OETW2Rv0UDyqBchOuDhL8seq72Vg4G0C7HRxUj3gVjYAulYRiyaDEDRGOdb9cTxR3QT4i9bfB6mT96KRJW50D2_5UgeLpQFxHNCVlnDsJ8/s400/Config-conky2.png" width="400" height="250" /></a></div><br />
Fíjense que el nombre que le demos a la ventana, en este caso 'conky' es significativo. Con eso debe bastar, desde luego hay que ajustar las preferencias en la sección de texto del .conkyrc para que reflejen las características de su equipo.<br />
<br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-20887437508028262972016-09-25T22:10:00.002-03:002016-09-25T22:16:35.238-03:00Proyecto de fin de semana: Usar una fuente ATX como fuente para Lab con termostato (opcional)Las fuentes ATX genéricas son relativamente económicas y tienen múltiples ventajas: ofrecen una variedad de tensiones de salida con corrientes generosas. 3,3v; 5v, 12V entre otras tensiones de salida sirven para tener una buena fuente de laboratorio con salidas estabilizadas y bien filtradas.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh91AAXkL4r8tLh4-79mBKPV9Qc24dOXTCi9JCyaUxnQShsCeGmFar2bvyjywzvhedZBL3yaGxfFIk0CnEq6u1DjJ-TI2PTylTkQ0H2ztcBVrzXQexyQJCxHJ_PnpNRd1d7Y6ZAOqXUU44/s1600/20160925_193412.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh91AAXkL4r8tLh4-79mBKPV9Qc24dOXTCi9JCyaUxnQShsCeGmFar2bvyjywzvhedZBL3yaGxfFIk0CnEq6u1DjJ-TI2PTylTkQ0H2ztcBVrzXQexyQJCxHJ_PnpNRd1d7Y6ZAOqXUU44/s320/20160925_193412.jpg" width="320" height="240" /></a></div>Ideal para probar cualquier circuito digital. A continuación sigue un proyecto muy simple: modificar una fuente ATX genérica y además con un agregado opcional: si no queremos que el cooler funcione constantemente se usa un termostato simple, que encenderá el ventilador cuando la temperatura interna sea superior a los 30° aproximadamente.<br />
<span class="fullpost"><br />
En la secundaria, el Cuba del barrio de Belgrano, uno de los primeros trabajos prácticos del taller de electrónica consistía en construir una fuente de alimentación variable de 2-30v. Se empezaba en primer año, en el taller de hojalatería, armando el gabinete de chapa rígida.<br />
Durante un bimestre de segundo año, creo, se mandaba a bobinar el transformador, y con todos los componentes listos, la armábamos. Todavía la conservo y sigue andando muy bien.<br />
La contra de las fuentes como aquella, básicamente es que por no ser switching son muy pesadas. El Apple II fue la primera computadora en tener una fuente switching a fines de los '70 y en aquel tiempo debía resultar muy costoso, pero en términos de "usabilidad" aquella máquina debía pesar menos de la tercera parte de sus competidoras que no usaban fuente switching.<br />
Hoy en día es muy sencillo y relativamente económico encontrar una fuente de tensiones múltiples, con buen filtrado y estabilización: cualquier fuente ATX de PC.<br />
<br />
<b>Fuente ATX para Lab, con termostato (opcional)</b><br />
<br />
Este fin de semana me hice de un rato para divertirme adaptando una fuente ATX. Mi idea inicial era la siguiente: precisaba una fuente de 5Vcc con por los menos 2A, para alimentar en simultáneo varias Raspberry Pi que están dando vueltas por ahí. Una de ellas tiene un disco duro que también requiere +12Vcc. Con una fuente que continuamente esté disponible también aprovecharía los 5Vcc para colgar un hub USB que sirviera de cargador para la mayoría de los celulares de la familia.<br />
Además uno de mis TOCs es que no me gustan los <i>coolers</i>. Son necesarios lo sé, pero hacen ruido. Por eso pensé agregarle un termostato a esta fuente modificada. El cooler solo se encendería cuando el calor en el interior fuera superior a cierto umbral.<br />
<br />
Para poder conectar todo fácilmente se puede usar una bornera. Yo agregué también una DIN/Canon para usar para la salida para las raspberries.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc7qaOXXZHZuOelbErZ3rqyJyy6nDbaLCD6-MjHrzQuXZlc7aWccIm-mn5UEIW_9IfUGaOoClyf6_NpvAFhXsgijn24Zdvd2gyYdOsPQ8yLMwzg9Xvy0biYd2iaIFlD4TFSv0HATspNxE/s1600/20160924_155130.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc7qaOXXZHZuOelbErZ3rqyJyy6nDbaLCD6-MjHrzQuXZlc7aWccIm-mn5UEIW_9IfUGaOoClyf6_NpvAFhXsgijn24Zdvd2gyYdOsPQ8yLMwzg9Xvy0biYd2iaIFlD4TFSv0HATspNxE/s320/20160924_155130.jpg" width="320" height="240" /></a></div><br />
Una vez hecho eso, hay que cortar los cables y conectarlos uno a uno a la bornera y soldar en la ficha canon. El código de colores usado para identificar las tensiones en las PSU ATX puede encontrarse aquí: <a href="http://www.instructables.com/id/A-Makers-Guide-to-ATX-Power-Supplies/step2/Wire-Colors-Functions-in-the-PSU/">http://www.instructables.com/id/A-Makers-Guide-to-ATX-Power-Supplies/step2/Wire-Colors-Functions-in-the-PSU/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha99z3vxMRKz9KN6VRHiWYu18n6EeuNeX15gf7dhiyGg-ZKc-3fAtSgH_YwNDxfqkORRGgzxo8bGkDfcThEdiG3bg6x4no84qzLPXXDzAq9wYvOJyXDLuJS3izZvham3zyRDDhERhr6PY/s1600/20160925_160215.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha99z3vxMRKz9KN6VRHiWYu18n6EeuNeX15gf7dhiyGg-ZKc-3fAtSgH_YwNDxfqkORRGgzxo8bGkDfcThEdiG3bg6x4no84qzLPXXDzAq9wYvOJyXDLuJS3izZvham3zyRDDhERhr6PY/s320/20160925_160215.jpg" width="320" height="240" /></a></div><br />
Si fuéramos a usar la fuente para un Lab, para probar circuitos o proyectos, con la bornera creo que estaría más que suficiente. Decidí agregar un pequeño termostato, que es un circuito muy similar al que se ve acá: <a href="http://www.craig.copperleife.com/tech/thermo/">http://www.craig.copperleife.com/tech/thermo/</a><br />
Basado en un opercacional LM741 como transistor usé un BD140. Entro colector y emisor va a circular la corriente que impulsa el cooler, una vez que la temperatura supere la que se haya calibrado. El termostato es muy simple y con los valores usados sirve para accionarse entre los 25-35 grados centígrados.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKeifsJMmiQHSJB7UjwSEDd6zcyQwM4V2ZmFPi9cD3KgbsB71o9xnvRTJ9Y-QZ2VzWXx9aFST3-jTqRgxdqwp5eAizt8jZjHqdbGuq473crMEj0hcFZ5uJvqX6lNQmhqVp8GcLh6WcfkI/s1600/20160925_163940.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKeifsJMmiQHSJB7UjwSEDd6zcyQwM4V2ZmFPi9cD3KgbsB71o9xnvRTJ9Y-QZ2VzWXx9aFST3-jTqRgxdqwp5eAizt8jZjHqdbGuq473crMEj0hcFZ5uJvqX6lNQmhqVp8GcLh6WcfkI/s320/20160925_163940.jpg" width="320" height="240" /></a></div>Acá se puede ver el termostato ya montado. Hablando eléctricamente, dentro de la fuente el ambiente es muy ruidoso. Pensé que el ruido volvería loco al 741, pero por suerte se comportó de diez.<br />
<br />
Así es como quedó una vez cerrado el gabinete.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggZQ-sSB1Ei4SB4IkBelfPnfjpNE6z4xKzwF2_PtwtaVljlfLs7On9-aVIwLo2LvOJIyjhL349sfHadw2Ss6-0LxpIZTXFwGEZmmuANL5oXwR0A_I1fIuOfmylqeV0G7mOb17HSX9u5HM/s1600/20160925_193412.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggZQ-sSB1Ei4SB4IkBelfPnfjpNE6z4xKzwF2_PtwtaVljlfLs7On9-aVIwLo2LvOJIyjhL349sfHadw2Ss6-0LxpIZTXFwGEZmmuANL5oXwR0A_I1fIuOfmylqeV0G7mOb17HSX9u5HM/s320/20160925_193412.jpg" width="320" height="240" /></a></div><br />
Es un proyecto simple y creo que útil. <br />
<br />
Pero <b>ATENCIÓN con esta advertencia:</b> <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_g1onq-6Nmul1qNTSPfPZLfceI3DPv_-NTDDO0fQCP49xlpw1OxLmfPbJDzdoel8NqlA05KiD8azVeulKVxeHlYwkRbEsyz3wWzAqrJ17ZbfV-VRPZ7zkD_6F3nxCi3OvTecRgVk8m78/s1600/warning-icon-24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_g1onq-6Nmul1qNTSPfPZLfceI3DPv_-NTDDO0fQCP49xlpw1OxLmfPbJDzdoel8NqlA05KiD8azVeulKVxeHlYwkRbEsyz3wWzAqrJ17ZbfV-VRPZ7zkD_6F3nxCi3OvTecRgVk8m78/s200/warning-icon-24.png" width="200" height="200" /></a></div><br />
<br />
Las fuentes switching funcionan con tensiones muy elevadas por eso su manipulación es riesgosa. Por eso hay que tener mucha precaución incluso aunque hayamos desconectado la fuente de los 220V, porque los capacitores quedan cargados de energía por bastante tiempo. Por eso hay que tener mucho cuidado si se desarma una fuente, más si estuvo funcionando recientemente.<br />
<br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-18568063305655367812016-09-19T22:51:00.001-03:002016-09-19T22:51:26.860-03:00Configurar servidor LDAP con STARTTLS y SSSDUn servidor LDAP es parte central de muchos deployments, sean en la nube o en infraestructura propia.<br />
Aplicar los principios de <i>security in depth</i>, es decir procurar siempre aplicar diversos niveles de seguridad contribuye a que nuestros deployments sean más seguros. Por eso en esta entrada se describe cómo integrar un servidor LDAP usando openLDAP con STARTTLS para encriptación. Se usará además GOSA como interfaz gráfica de usuario para la configuración del directorio.<br />
Usaremos además sssd (System Security Services Daemon) que es un approach más reciente y bastante conveniente. <br />
<br />
<span class="fullpost"><br />
<br />
Esta configuración la estoy probando con containers de LXD/LXC por eso quizá los nombres de hosts algo extraños. La ventaja es que con LXC podemos probar con containers la infra que después vamos a llevar la nube (aws, Azure, etc).<br />
La idea centrar es usar el directorio LDAP para autenticación e identificación de usuarios, por eso, aún cuando el servidor LDAP no esté expuesto directamente a Internet vamos a configurar STARTTLS para que el tráfico entre clientes LDAP y el servidor sea encriptado. También llamada <i>oportunistic TLS</i> nos permite utilizar el puerto LDAP estándar (389).<br />
<br />
En la máquina que usamos como nuestra CA interna firmaremos los certificados. Lo ideal es que nuestra CA tenga una entidad intermedia o subsidiaria que será la que efectivamente firme los certificados de nuestra organización y que no requieran sites o servicios públicos. Idealmente la máquina de la CA no debiera tener conexión a internet si nos ponemos el nivel de paranoia elevado /alto :<br />
<br />
<div class="code"># cd /root/ca<br />
<br />
# openssl genrsa -out intermediate/private/ldap02-debian.lxd.key.pem 2048<br />
<br />
# chmod 400 intermediate/private/ldap02-debian.lxd.key.pem<br />
</div><br />
2) Crear el csr:<br />
<br />
<div class="code"># openssl req -config intermediate/openssl.cnf -key intermediate/private/ldap02-debian.lxd.key.pem -new -sha256 -out intermediate/csr/ldap02-debian.lxd.csr.pem<br />
</div><br />
3) Create certificate:<br />
<br />
<div class="code"># openssl ca -config intermediate/openssl.cnf -extensions server_cert -days 999 -notext -md sha256 -in intermediate/csr/ldap02-debian.lxd.csr.pem -out intermediate/certs/ldap02-debian.lxd.cert.pem<br />
<br />
#mkdir -p /etc/ssl/{certs,private}<br />
</div><br />
(copiar los certificados de la CA (trust chain), certificado del servidor y la private key.<br />
<br />
<div class="code">cp ldap02-debian.lxd.key.pem /etc/ssl/private <br />
chown -R root:openldap /etc/ssl/private<br />
chmod 440 /etc/ssl/private/ldap02-debian.lxd.key.pem<br />
<br />
cp ldap02-debian.lxd.cert.pem /etc/ssl/certs<br />
cp ca-chain.cert.pem /etc/ssl/certs<br />
</div><br />
Configurar LDAP:<br />
<br />
Configurar /etc/ldap/ldap.conf con los parametros requeridos (BASE y URI):<br />
<br />
<div class="code">BASE dc=ldap02-debian,dc=lxd<br />
URI ldap://ldap02-debian.lxd<br />
<br />
#SIZELIMIT 12<br />
#TIMELIMIT 15<br />
#DEREF never<br />
<br />
# TLS certificates <br />
TLS_CACERT /etc/ssl/certs/ca-chain.cert.pem<br />
</div><br />
<br />
Creamos el siguiente archivo ldif para configurar nuestro certificado ssl:<br />
<br />
vim /root/certs.ldif<br />
<br />
<div class="code">dn: cn=config<br />
changetype: modify<br />
add: olcTLSCACertificateFile<br />
olcTLSCACertificateFile: /etc/ssl/certs/ca-chain.cert.pem<br />
-<br />
add: olcTLSCertificateFile<br />
olcTLSCertificateFile: /etc/ssl/certs/ldap02-debian.lxd.cert.pem<br />
-<br />
add: olcTLSCertificateKeyFile<br />
olcTLSCertificateKeyFile: /etc/ssl/private/ldap02-debian.lxd.key.pem<br />
</div><br />
Y lo importamos al directorio LDAP:<br />
<br />
<div class="code">ldapmodify -H ldapi:/// -Y EXTERNAL -f /root/certs.ldif <br />
</div>(si hay algun error revisar permisos y que la ruta a los certs sea la correcta)<br />
<br />
<br />
Probar que starttls funcione, con el parámetro -ZZ<br />
<br />
ldapwhoami -H ldap:// -x -ZZ<br />
<br />
Si está todo bien debemos obtener:<br />
<br />
anonymous<br />
<br />
Forzar usar siempre starttls (opcional pero recomendado):<br />
<br />
Creamos el siguiente archivo ldif:<br />
<br />
cat /root/forcetls.ldif:<br />
<div class="code">dn: olcDatabase={1}hdb,cn=config<br />
changetype: modify<br />
add: olcSecurity<br />
olcSecurity: tls=1<br />
</div><br />
<div class="code">ldapmodify -H ldapi:/// -Y EXTERNAL -f /root/forcetls.ldif<br />
</div><br />
Para probar podemos hacerlo con:<br />
<br />
<div class="code">ldapsearch -H ldap:// -x -b "dc=ldap02-debian,dc=lxd" -LLL dn<br />
</div>Si la encriptación está activada obtendremos:<br />
<br />
Confidentiality required (13)<br />
Additional information: TLS confidentiality required<br />
<br />
<br />
En cambio, si con la opción -ZZ forzamos el uso de starttls:<br />
<br />
<div class="code"># ldapsearch -H ldap:// -x -b "dc=ldap02-debian,dc=lxd" -LLL -ZZ dn<br />
dn: dc=ldap02-debian,dc=lxd<br />
<br />
dn: cn=admin,dc=ldap02-debian,dc=lxd<br />
</div><br />
Con esto último nos habremos asegurado que todas las solicitudes para LDAP se encripten usando STARTTLS.<br />
<br />
<b>Recordar:</b> en la instalación de los clientes LDAP se deberá configurar el archivo /etc/ldap/ldap.conf de la misma manera que se indicó arriba. Asegurándose de haber deployado el certificado de la CA o <i>chain trust</i> y referenciarlo a la ubicación correcta.<br />
<br />
<b>Instalación de GOSA</b><br />
<br />
Instalar los siguientes paquetes:<br />
<br />
<div class="code"># apt-get install gosa gosa-plugin-sudo gosa-plugin-sudo-schema gosa-schema <br />
</div><br />
La configuración básica de GOSA se hace a través de su UI. Es bastante directa. Lo importante es configurar para que use STARTTLS caso contrario no se podrá comunicar con LDAP. Para ello, luego de haber configurado GOSA por la UI debemos agregar en /etc/gosa/gosa.conf:<br />
<br />
<div class="code"><location name="default"<br />
<b> ldapTLS="true"</b><br />
config="ou=gosa,ou=configs,ou=systems,dc=ldap02-debian,dc=lxd"><br />
<referral URI="ldap://localhost:389/dc=ldap02-debian,dc=lxd"<br />
adminDn="cn=admin,dc=ldap02-debian,dc=lxd"<br />
adminPassword="topsecret" /><br />
</location><br />
</div><br />
Luego podremos ir creando nuestra base de usuarios en LDAP vía gosa:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEVI2RcQZbVObzlKMbdSMS8cOFMRnwox1ZHEuXuiRuW8Tkkifk50XtK4f2bhFJV78WU33vQcD_Pt9mPofYjhNykchtZSfzQMi5t9uMEtwbsF6ipXtac_X2UPGfkrhO-HTT1vw_X4yltk8/s1600/gosa2.png" imageanchor="1" ><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEVI2RcQZbVObzlKMbdSMS8cOFMRnwox1ZHEuXuiRuW8Tkkifk50XtK4f2bhFJV78WU33vQcD_Pt9mPofYjhNykchtZSfzQMi5t9uMEtwbsF6ipXtac_X2UPGfkrhO-HTT1vw_X4yltk8/s320/gosa2.png" width="320" height="200" /></a><br />
<br />
<b>Configurar sssd en los clientes para que autentifiquen vía LDAP</b><br />
<br />
Lo que resta es configurar sssd en los clientes para que se autentifiquen vía LDAP:<br />
<br />
Instalar paquetes para sssd:<br />
<br />
<div class="code">ii sssd 1.13.4-3 System Security Services Daemon -- metapackage<br />
ii sssd-ad 1.13.4-3 System Security Services Daemon -- Active Directory back end<br />
ii sssd-ad-common 1.13.4-3 System Security Services Daemon -- PAC responder<br />
ii sssd-common 1.13.4-3 System Security Services Daemon -- common files<br />
ii sssd-ipa 1.13.4-3 System Security Services Daemon -- IPA back end<br />
ii sssd-krb5 1.13.4-3 System Security Services Daemon -- Kerberos back end<br />
ii sssd-krb5-common 1.13.4-3 System Security Services Daemon -- Kerberos helpers<br />
ii sssd-ldap 1.13.4-3 System Security Services Daemon -- LDAP back end<br />
ii sssd-proxy 1.13.4-3 System Security Services Daemon -- proxy back end<br />
ii sssd-tools <br />
</div><br />
<br />
Y la configuración de /etc/sssd/sssd.conf:<br />
<br />
<div class="code">root@host01-debian:~# cat /etc/sssd/sssd.conf <br />
[sssd]<br />
services = nss,pam<br />
config_file_version = 2<br />
domains = ldap<br />
<br />
[domain/ldap]<br />
ldap_schema = rfc2307bis<br />
ldap_search_base = dc=ldap02-debian,dc=lxd<br />
id_provider = ldap<br />
auth_provider = ldap<br />
chpass_provider = ldap<br />
ldap_uri = ldap://ldap02-debian.lxd:389<br />
ldap_id_use_start_tls = True<br />
cache_credentials = True<br />
ldap_tls_cacertdir = /etc/ssl/certs<br />
ldap_tls_cacert = /etc/ssl/certs/ca-chain.cert.pem<br />
<br />
<br />
[nss]<br />
<br />
[pam]<br />
<br />
[sudo]<br />
<br />
[autofs]<br />
<br />
[ssh]<br />
</div><br />
Verificar que la ubicación de los certificados de la CA sea correcta y que además el modo para el archivo config sea 0600:<br />
<br />
<div class="code"># ls -l /etc/sssd/sssd.conf <br />
-rw------- 1 root root 435 Sep 18 23:27 /etc/sssd/sssd.conf<br />
</div><br />
Por último si deseamos que los directorios home de los usuarios (configurados en ldap) se creen automáticamente debemos configurar el módulo pam adecuado:<br />
<br />
<div class="code"># cat /etc/pam.d/common-session<br />
#<br />
# /etc/pam.d/common-session - session-related modules common to all services<br />
#<br />
# This file is included from other service-specific PAM config files,<br />
# and should contain a list of modules that define tasks to be performed<br />
# at the start and end of sessions of *any* kind (both interactive and<br />
# non-interactive).<br />
#<br />
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.<br />
# To take advantage of this, it is recommended that you configure any<br />
# local modules either before or after the default block, and use<br />
# pam-auth-update to manage selection of other modules. See<br />
# pam-auth-update(8) for details.<br />
<br />
# here are the per-package modules (the "Primary" block)<br />
session [default=1] pam_permit.so<br />
# here's the fallback if no module succeeds<br />
session requisite pam_deny.so<br />
# prime the stack with a positive return value if there isn't one already;<br />
# this avoids us returning an error just because nothing sets a success code<br />
# since the modules above will each just jump around<br />
session required pam_permit.so<br />
# and here are more per-package modules (the "Additional" block)<br />
session required pam_unix.so <br />
session optional pam_sss.so <br />
session optional pam_systemd.so <br />
# Added for creating homedir (line to be added):<br />
<b>session required pam_mkhomedir.so</b><br />
# end of pam-auth-update config<br />
<br />
<br />
</div></span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-85115374283210315302016-08-10T22:41:00.006-03:002022-12-06T09:37:19.834-03:00Hardening mailserver: configurar Postfix como smarthosts (sasl + TLS)Como se comentaba en un post anterios sobre Kerberos, una red, hogareña pero con wi-fi es una red semi-abierta. Suponiendo que se haya usado WPA2 cuya encriptación no es trivial romper, todos aquellos con los que hayamos compartido la contraseña podrán seguir teniendo acceso a los servicios de la LAN. Por eso, no está demás configurar el servidor de correo (en este caso Postfix) con autenticación y TLS. De esa forma, ese servidor solo podrá ser "relay" de usuarios autenticados.<br />
<span class="fullpost"><br />
Un mismo principio simple acerca de la "seguridad" puede aplicarse prácticamente para cualquier cosa que haya de construise: una casa, una herramienta, un software o una serie de servicios de soft: las técnicas para hacer más seguro el objeto se aplican desde el principio o inevitablemente cuando querramos aplicarlo será demasiado tarde. Algo se habrá roto, alguien se habrá lastimado, un site web habrá sido desfigurado, la información de los clientes capturada, etc.<br />
O la seguridad es una preocupación y ciertos principios se aplican desde el momento cero o después va a ser tarde.<br />
<br />
Sea para un sistema de alertas o monitoración o para el envío de mail convencionales siempre es útil configurar nuestro servidor de correo dedicado (MTA). Para que un servidor de correo sea "full-blown" (que no solo entregue correo sino también que sea un receptor) es necesario tener un dominio público, registros DNS, etc. Como este servidor de ejemplo será mayoritariamente para enviar correo (alertas) vamos a configurarlo como un smarthost que en realidad le pase los mensajes a un servidor externo (gmail o cualquier otro) que será el que finalmente entregue el correo.<br />
Supongamos el siguiente caso:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLGGWHt4ftzOzoXsX1uV1wZKzVCEzB4aHkPyahpjzcv1tDjhlbgKBHS2SPsgpl2hubmypJwrnNqChcbqvJmNoH_w62lj5HXZShSozmhQS8V6YC4o5fz69GltsM5PpZ5DOrO9eQJIvzTLo/s1600/mail_relay.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLGGWHt4ftzOzoXsX1uV1wZKzVCEzB4aHkPyahpjzcv1tDjhlbgKBHS2SPsgpl2hubmypJwrnNqChcbqvJmNoH_w62lj5HXZShSozmhQS8V6YC4o5fz69GltsM5PpZ5DOrO9eQJIvzTLo/s400/mail_relay.png" width="400" height="266" /></a></div><br />
En esta configuración, los dispositivos que requieran enviar alertas o mensajes de correo en general tendrán un postfix configurado como <i>smarthost</i> es decir que no entregarán directamente el correo al servidor de destino sino que primero se lo pasarán al postfix instalado en la raspberry Pi, que hará las veces de "gateway". Este último a su vez será también un smarthost que dependerá de google para enviar el correo a sus destinatarios. En caso que contáramos con un dominio público y registros tipo A y MX en servidor DNS podría funcionar como servidor de correo "full-blown".<br />
<br />
Los hosts que usen postfix tendrán en su archivo /etc/hosts una entrada para resolver el nombre del "gateway", en este caso pi1.equiscentrico.com.ar.<br />
Un par de requisitos, que no voy a detallar acá para no extenderme demasiado es que como vamos a usar TLS precisaremos firmar los certificados ssl (con openssl) con nuestra propia CA interna. Tendremos tres archivos: la key privada, el certificado firmado por nuestra CA y por último la chain-trust, es decir el o los certificados de nuestra CA. Es chain-trust cuando la CA root delega la firma en otras CA intermedias. Esa suele ser una buena práctica cuando usamos una CA propia.<br />
Vamos a la configuración del gateway (pi1.equiscentrico.com.ar). Donde ya están instalados los paquetes postfix, libsasl2 y sasl2-bin (en Debian y derivados tienen esos nombres):<br />
<br />
Archivo config principal de postfix: /etc/postfix/main.cf:<br />
<div class="code">Debian specific: Specifying a file name will cause the first<br />
# line of that file to be used as the name. The Debian default<br />
# is /etc/mailname.<br />
#myorigin = /etc/mailname<br />
<br />
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
<br />
# appending .domain is the MUA's job.<br />
append_dot_mydomain = no<br />
<br />
# Uncomment the next line to generate "delayed mail" warnings<br />
#delay_warning_time = 4h<br />
<br />
readme_directory = no<br />
<br />
# TLS parameters<br />
smtpd_tls_key_file=/etc/postfix/pi1.equiscentrico.com.ar.key.pem<br />
smtpd_tls_cert_file=/etc/postfix/pi1.equiscentrico.com.ar.cert.pem<br />
smtp_tls_CAfile=/etc/postfix/cacert.pem<br />
smtpd_use_tls=yes<br />
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache<br />
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache<br />
<br />
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for<br />
# information on enabling SSL in the smtp client.<br />
<br />
myhostname = pi1.equiscentrico.com.ar<br />
alias_maps = hash:/etc/aliases<br />
alias_database = hash:/etc/aliases<br />
myorigin = /etc/mailname<br />
mydestination = pi1@equiscentrico.com.ar, pi1.equiscentrico.com.ar, localhost.equiscentrico.com.ar, localhost<br />
relayhost = [smtp.gmail.com]:587<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
smtp_sasl_auth_enable = yes<br />
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd<br />
smtp_sasl_security_options = noanonymous<br />
smtp_use_tls = yes<br />
smtpd_sasl_local_domain = $myhostname'<br />
smtpd_sasl_auth_enable = yes<br />
broken_sasl_auth_clients = yes<br />
smtpd_sasl_security_options = noanonymous<br />
smtpd_sasl_local_domain =<br />
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination<br />
</div><br />
Principales parámetros:<br />
<br />
mydestination = pi1@equiscentrico.com.ar, pi1.equiscentrico.com.ar, localhost.equiscentrico.com.ar, localhost<br />
Lógicamente deberá adaptarse al nombre del host<br />
<br />
relayhost = [smtp.gmail.com]:587<br />
Acá especificamos que la entrega del correo se hará a través de gmail.<br />
<br />
Con estos parámetros configuramos la autenticación de gmail:<br />
<br />
smtp_sasl_auth_enable = yes<br />
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd<br />
smtp_sasl_security_options = noanonymous<br />
smtp_use_tls = yes<br />
<br />
En la sección TLS configuramos la ubicación del certificado, la private key y los certificados de la CA.<br />
<br />
En la sección "smtpd" configuramos los parámetros del servidor propiamente dicho:<br />
<br />
smtpd_sasl_local_domain = $myhostname'<br />
smtpd_sasl_auth_enable = yes<br />
broken_sasl_auth_clients = yes<br />
smtpd_sasl_security_options = noanonymous<br />
smtpd_sasl_local_domain =<br />
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination<br />
<br />
Aquí configuramos para usar autenticación sasl y especialmente con permit_sasl_authenticated le especificamos que el servidor solo aceptará mensajes de usuarios autenticados.<br />
<br />
El archivo /etc/postfix/sasl/sasl_passwd debe mapear la cuenta de google y la contraseña, por ejemplo:<br />
<br />
<div class="code">[smtp.gmail.com]:587 cachocastanha@gmail.com:SuperSecreta<br />
</div><br />
Donde "cachocastanha" y "SuperSecreta" son el usuario y contraseña respectivamente.<br />
<br />
Luego creamos el hash file y damos permisos adecuados:<br />
<br />
<div class="code"># chmod 400 /etc/postfix/sasl/sasl_passwd<br />
# postmap /etc/postfix/sasl/sasl_passwd<br />
</div><br />
<br />
En el archivo de config de sasl indicamos qué backend usaremos, en este caso la base "nativa" de sasl, pero soporta muchas otras opciones.<br />
<br />
/etc/postfix/sasl/smtpd.conf <br />
<div class="code">pwcheck_method: auxprop<br />
auxprop_plugin: sasldb<br />
mech_list: plain login<br />
</div><br />
Es posible que la primera vez Gmail requiera que autoricemos la nueva aplicación que está haciendo el envío.<br />
Hecho eso podemos probar el envío desde el propio servidor:<br />
<br />
<div class="code">$ echo "Test mail from postfix" | mail -s "Test Postfix" you@retux.com<br />
</div><br />
<br />
Veamos la configuración de los hosts, que enviarán el correo a través del "gateway", aquí comento cada sección:<br />
<br />
<div class="code">mtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)<br />
biff = no<br />
<br />
# appending .domain is the MUA's job.<br />
append_dot_mydomain = no<br />
<br />
# Uncomment the next line to generate "delayed mail" warnings<br />
#delay_warning_time = 4h<br />
<br />
readme_directory = no<br />
<br />
# TLS parameters - con smtpd_use_tls=yes le indicamos que use TLS para establecer un canal seguro (ssl)<br />
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem<br />
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key<br />
smtpd_use_tls=yes<br />
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache<br />
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache<br />
<br />
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for<br />
# information on enabling SSL in the smtp client.<br />
<br />
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated <br />
myhostname = desktop01.equiscentrico.com.ar<br />
alias_maps = hash:/etc/aliases<br />
alias_database = hash:/etc/aliases<br />
myorigin = /etc/mailname<br />
mydestination = $myhostname, desktop01.retux.com.ar, localhost.retux.com.ar, localhost<br />
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128<br />
mailbox_size_limit = 0<br />
recipient_delimiter = +<br />
inet_interfaces = loopback-only<br />
inet_protocols = ipv4<br />
# Config de mail relay a gateway Pi1<br />
relayhost = [pi1.equiscentrico.com.ar]<br />
# si hubiera un backup<br />
#smtp_fallback_relay = [relaybackup.equiscentrico.com]<br />
smtp_sasl_auth_enable = yes <br />
smtp_sasl_password_maps = hash:/etc/postfix/relay_passwd <br />
smtp_sasl_security_options = <br />
smtp_use_tls = yes<br />
# force to use TLS<br />
smtp_tls_security_level = encrypt<br />
# Estos dos parámetros son importantes cuando usamos /etc/hosts para resolución de nombres<br />
# le indican a postfix que use el orden establecido en nsswitch.conf, de otra manera va a usar <br />
# primero el servidor dns que tenga configurado el host.<br />
lmtp_host_lookup = native<br />
smtp_host_lookup = native<br />
</div><br />
De forma parecida, la autenticación sasl se debe configurar en /etc/postfix/relay_passwd <br />
<br />
<div class="code">pi1.equiscentrico.com.ar retux:SuperSecretisima<br />
</div><br />
<div class="code"># chmod 400 /etc/postfix/relay_passwd<br />
# postmap /etc/postfix/relay_passwd<br />
</div><br />
Donde "retux" y "SuperSecretisima" son el user y contraseña en la base sasl.<br />
<br />
En el servidor "gateway" (pi1.equiscentrico.com.ar) deberá haberse creado el usuario:<br />
<br />
<div class="code">saslpasswd2 -c -u `postconf -h mydomain` retux<br />
</div><br />
Podemos listar los usuarios:<br />
<br />
<div class="code"># sasldblistusers2 <br />
retux@pi1.equiscentrico.com.ar: userPassword<br />
</div><br />
Hecho esto no queda más que probar el envío de correo desde los hosts "internos". Posiblemente las primeras veces haya que revisar los logs y <br />
corregir algo.<br />
Podemos además para asegurarnos de que se está usando TLS y las contraseñas no son enviadas en texto plano, hacer una captura con tcpdump y analizarla, con la GUI de wireshark o como prefiramos:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCGhw6C2Rh1rSUk6OYHIBHBznpw_YwpLIT4vUlQMiD26Wiv_G06iWprJoE7t7ycsSxqKU6g5BzsVQVeaNI7hsmULfYR5qbahSDFx4uxLEx_ZVLVMtdIgUHE94XahgOa6w2FZK7vDGG2q8/s1600/smtp_tls_cap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCGhw6C2Rh1rSUk6OYHIBHBznpw_YwpLIT4vUlQMiD26Wiv_G06iWprJoE7t7ycsSxqKU6g5BzsVQVeaNI7hsmULfYR5qbahSDFx4uxLEx_ZVLVMtdIgUHE94XahgOa6w2FZK7vDGG2q8/s400/smtp_tls_cap.png" width="400" height="225" /></a></div><br />
<br />
Como podemos ver, se está usando TLS 1.2 lo que nos garantiza que nuestras credenciales van a viajar encriptadas.<br />
<br />
Notas finales: Esta configuración es útil para una red pequeña. Para redes mayores usar la base de sasl resulta en demasiado overhead, porque habrá que registrar una entrada por cada usuario. Por eso usar un servidor centralizado para eso como LDAP o quizá kerberos para autenticar sería la opción más adecuada.<br />
<br />
<br />
<b>Troubleshooting</b>
<br /><br />
Podemos utilizar la navaja suiza del email, <b>swaks</b>:<br />
<br />
<div class="code">
swaks --auth --server pi1.equiscentrico.com.ar --port 25 --au retux@pi1.equiscentrico.com.ar --ap secretisima --from maildeorigen@gmail.com --to destinatario@gmail.com --h-Subject: "Testing SMTP relay" --body 'Testing Postfix SASL relay'
</div>
O también openssl/telnet:
<br />
$ openssl s_client -starttls smtp -crlf -connect pi1.equiscentrico.com.ar:25
<br />
y utilizaremos el mecanismo AUTH LOGIN
<br />
<div class="code">
read R BLOCK<br />
ehlo retux.equiscentrico.com.ar<br />
250-pi1.equiscentrico.com.ar<br />
250-PIPELINING<br />
250-SIZE 10240000<br />
250-VRFY<br />
250-ETRN<br />
250-AUTH PLAIN LOGIN<br />
250-AUTH=PLAIN LOGIN<br />
250-ENHANCEDSTATUSCODES<br />
250-8BITMIME<br />
250-DSN<br />
250-SMTPUTF8<br />
250 CHUNKING<br />
AUTH LOGIN<br />
334 VXNlcm5hbWU6<br />
bWFzarFzQHBpMS5lcXVpbarlbnRyaWNvLmNvfoocg==<br />
334 UGFzc3dvcmQ6<br />
cJaFDADfx0ZXRl<br />
235 2.7.0 Authentication successful<br />
</div>
Nótese el "Authentication successful".
<br />
<br />
Otra herramienta útil para el troubleshooting es sasl2auth: <br /><br />
1) Levantar saslauthd:
<br />
<div class="code">
$ sudo saslauthd -a sasldb -d -V
</div>
<br />
Y luego probamos: <br />
<div class="code">
$ testsaslauthd -f /run/saslauthd/mux -s"smtp" -r"pi1.equiscentrico.com.ar" -u"elUsuario" -p"lapasswordSecretísima"
</div> <br /><br />
<b>Referencias:</b> <br />
<br />
https://wiki.debian.org/PostfixAndSASL
https://serverfault.com/questions/1050452/postfix-sasldb-issue-solved-as-of-mar-2021
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-71707158567704211822016-03-27T18:45:00.001-03:002017-04-22T18:05:36.949-03:00NFSv4 y Kerberos, la dupla para un fileserver seguroKerberos es un protocolo de autenticación, originariamente desarrollado por el MIT en los años '90. Fue concebido ofrecer servicio de autenticación de manera segura (basado en criptografía de clave simétrica (secret-shared). En la mitología griega Kerberos era el demonio del pozo, un perro de tres cabezas que vigilaba que los muertos no pudieran salir del Hades y que los vivos no entraran. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh76ZnlBMCpNiFrKsfNwGVU3QgZTuOQyPLUcSUrG-brY8cF9ddG7JWiuypqbOC6if99NqID55fsEDtU3mUmMt28EQJaf31D4SzDoj4vHGuW35qfa4USJQUteMTGBxOg7iENHZWI4IaUA60/s1600/kerberos_by_vyrilien-d4cl9bh.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh76ZnlBMCpNiFrKsfNwGVU3QgZTuOQyPLUcSUrG-brY8cF9ddG7JWiuypqbOC6if99NqID55fsEDtU3mUmMt28EQJaf31D4SzDoj4vHGuW35qfa4USJQUteMTGBxOg7iENHZWI4IaUA60/s320/kerberos_by_vyrilien-d4cl9bh.jpg" /></a></div>Hablando sobre el protocolo Kerberos puede pensarse como un tercero, que con una cabeza verifica la identidad de un primero: el cliente, con otra la del segundo: el servidor.<br />
Esta entrada no pretende ser un tutorial completo, es más bien una guía y un recordatorio propio sobre la documentación necesaria y algo de troubleshooting para poner a funcionar NFS4 con autenticación kerberos. <br />
<br />
Siempre existe una limitación en las recetas paso-a-paso o en los tutoriales "quick and dirty": cuando ocurre algún problema y se requiere hacer troubleshooting seguramente tendremos que hacernos del conocimiento más profundo que es el de una documentación oficial por ejemplo. En realidad un problema es trivial o no dependiendo del grado de conocimiento del observador/analista.<br />
Espero sirva para otros que sigan el mismo camino y si se acercan al Hades, cuidado con el perro.<br />
<span class="fullpost"><br />
<br />
<br />
<strong>¿Por qué ponerse un poco paranoico? Redes LAN del hogar bajo fuego</strong><br />
<br />
Las redes LAN de los hogares, en donde existe <i>Access Points</i> wi-fi son relativamente seguras utilizando WPA2 WPA-PSK (Pre-shared Key) con todo, siempre pueden ser objeto de algunas vulnerabilidades.<br />
Más allá de ataques de diccionarios, lo más común es que por el simple hecho de mantener la misma clave, la passphrase va a pasar por muchas manos. Más tiempo la red se mantenga, inalterada mayor el numero de usuarios que hayan usado esa red y que por tanto, tengan conocimiento de la passphrase.<br />
<br />
En las redes lan de nuestras casas, salvo que hayamos agregado alguna capa de seguridad extra, los hosts que se conectan por wi-fi comparten el mismo segmento de red que los hosts conectados a la red cableada (ej 192.168.1.0/24).<br />
Un usuario que conozca la passphrase de acceso wi-fi no solamente podría utilizar el acceso a internet sino que en servicios con seguridad basada en host (como históricamente fue nfs) podría hacer spoofing y cambiar la dirección ip. Supongamos que nuestro fileserver NFS restringe el acceso de rw para el host 192.168.1.12, con mala intención, alguien que hubiera obtenido acceso wi-fi podría "hacerse pasar por ese host", que tiene derecho de acceso al fileserver, para hacer sus backups. Eso sin dudas constituye un vector de vulnerabilidad.<br />
El caso descripto para una red hogareña, podría tener su equivalente si alguien con acceso físico a la oficina conecta su la ehternet de su laptop a la red. Para evitar que esa persona no autorizada tuviera acceso a datos o servicios de la intranet puede usarse Kerberos.<br />
<br />
<strong>El perro vigilante: Kerberos </strong><br />
<br />
Kerberos fue desarrollado originariamente en el MIT, y como es un estándar abierto descripto en varias RFCs, existen diversas implementaciones además de la del MIT, entre otros: Heimdal un derivado de la del MIT, GNU Shisi de la Free Software Foundation y Microsoft AD que entre sus servicios incluye kerberos.<br />
Las líneas que siguen describen brevemente el funcionamiento del protocolo y fueron tomadas del documento <a href="http://www.kerberos.org/software/adminkerberos.pdf">The MIT Kerberos Administrator’s How-to Guide </a> de Jean-Yves Migeon.<br />
<br />
Kerberos fue desarrollado con foco en la autenticación y no en el manejo de cuentas (por ejemplo, Kerberos no guarda UIDs, GIDs u otras informaciones sobre las cuentas de usuario). Tarea como esa es el objeto de otros servicios de directorio, como LDAP.<br />
<br />
El funcionamiento del protocolo se basa en el intercambio de tickets criptográficos que permiten autenticar tanto a servidores que ofrezcan servicios "kerberizados" ej NFS, ssh, etc y a sus clientes.<br />
<br />
La comunicación de Kerberos se basa en el protocolo Needham-Shroeder (conocido como protocolo NS) que fue diseñado por esos autores en 1978 como una solución para un sistema de autenticación distribuido basado en claves criptográficas secretas.<br />
Esas claves criptográficas las comparten los dos extremos de una conexión Kerberos. Se trata del modelo de criptografía simétrica (pre-shared key), que se diferencia de los métodos asimétricos o de "Clave pública" utilizados por ssl, IPSec, etc.<br />
Para el usuario, la clave secreta es su password entreverada criptográficamente en un único sentido <strong>(léase "one-way hashed")</strong> que normalmente se almacena en el KDC (<strong>Key Distribution Center</strong>, un componente central del servidor Kerberos). Para un servicio "kerberizado" normalmente la clave secreta es una secuencia aleatoria que actúa como password y que también se guarda en el KDC, como también en un archivo llamado <strong>keytab</strong> que irá en la máquina que corra el servicio kerberizado.<br />
Para que esto funcione clientes y servicios deben confiar en un tercer servicio (el servidor Kerberos) que es responsable de otorgar las claves que se le demanden.<br />
En un ambiente corporativo la mejor práctica es que el servidor Kerberos esté aislado de internet.<br />
La comunicación en Kerberos se basa en <strong>tickets</strong>. Estos son una suerte esquema de datos encriptados que se transmite a través de la red y almacenado del lado del cliente. Dónde se almacena depende de la implementación del kerberos y del SO. En el caso del MIT Kerberos se almacena en un archivo en el directorio /tmp. <br />
<br />
La parte principal de una red Kerberos es el KDC (Key Distribution Center), que consiste de tres partes:<br />
<br />
• Un <strong>Authentication Server</strong> (Servidor de Autenticación), el cual responde solicitudes de autenticación iniciadas por los clientes. Estos intercambios son los mensajes de desafío (challenge) AS_REQUEST y AS_REPLY, en los que el cliente obtiene un <strong>TGT: Ticket Granting Ticket</strong>.<br />
<br />
• La segunda parte del KDC es el <strong>Ticket Granting Server </strong> el cual otorga los <strong>TGS (Ticket Granting Service)</strong> esta es la parte del intercambio con los mensajes TGS_REQUEST y TGS_REPLY, en la que el cliente obtiene un TGS que le permite autenticarse ante un servicio disponible en red.<br />
<br />
• Una base de datos que guarda todas las claves secretas (las de los clientes y la de los servicios) (Migeon, 2008).<br />
<br />
Siguen esquemas tomados del libro de Migeon sobre el proceso de intercambio de tickets:<br />
<br />
<strong>Proceso de Autenticación - TGT </strong>:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFQM72YgQqUpVr_rLp7M5i9GyQJyYoVrPLLZ0xYk4EeGINv4c1NtKDlm3QpJtE3DM89jwL_Mjhzd5r6PKoYfMFR50BynZtphmPXl6I-xUWyJeUsK9fCQI3_SG9gVKrAMrYK3pW0aF4Q84/s1600/-002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFQM72YgQqUpVr_rLp7M5i9GyQJyYoVrPLLZ0xYk4EeGINv4c1NtKDlm3QpJtE3DM89jwL_Mjhzd5r6PKoYfMFR50BynZtphmPXl6I-xUWyJeUsK9fCQI3_SG9gVKrAMrYK3pW0aF4Q84/s400/-002.png" /></a></div><br />
<strong>Mecanismo de uso de Servicio - TGS (Ticket Granting Service):</strong><br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7dnhiLZpdlb9QYQ5Dhbic6UkcZ2UcpfC3lFFfusuPtwI934FkEnvgQDUoUUEuAsJJ62YST3O3Hu3rOJr3e-aINaJAH_RKoGjlKvCNffbdr8sxjt9-yK_rOvmZ51pa-TWim9IO0odLS4Q/s1600/-003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7dnhiLZpdlb9QYQ5Dhbic6UkcZ2UcpfC3lFFfusuPtwI934FkEnvgQDUoUUEuAsJJ62YST3O3Hu3rOJr3e-aINaJAH_RKoGjlKvCNffbdr8sxjt9-yK_rOvmZ51pa-TWim9IO0odLS4Q/s400/-003.jpg" /></a></div><br />
<br />
El primer paso, descripto en le primera figura es el proceso de autenticación, que culmina con el otorgamiento de un TGT.<br />
Una vez que el cliente cuenta con un TGT (es decir, completó el proceso de auth) y si quiere acceder a un cierto servicio de red (ej. servidor web, servidor de archivos, etc) debe requerir un <strong>TGS: Ticket Granting Service</strong>. Ese es el proceso mostrado por Migeon en la segunda figura.<br />
Una vez que el cliente obtuvo su TGS, tendrá que autenticarse a sí mismo directamente con el servicio a utilizar (ej NFS, ssh, etc). Este proceso varía según cuál sea el servicio en cuestión.<br />
A rasgos generales, el servicio (ej NFS4) tiene acceso al archivo <strong>keytab</strong> un archivo que guarda su clave a largo plazo. Esta clave le permitirá al servicio desencriptar el TGS que le envíe el cliente y las demás informaciones para identificar el usuario y crear el contexto seguro.<br />
No vamos reproducir aquí el contenido del libro de Migeon, si no más bien recordar algunos puntos esenciales para que la autenticación vía kerberos funcione sin problemas.<br />
<br />
En resumen, según Migeon el protocolo Kerberos se puede dividir en tres pasos:<br />
<br />
1. <strong>Proceso de autenticación</strong>, en el que el usuario y el host obtienen un TGT (Ticket Granting Ticket).<br />
<br />
2. <strong>Proceso de solicitud de servicio</strong>, en el que el usuario obtiene un TGS (Ticket Granting Service) para acceder a un servicio.<br />
<br />
3. <strong>Acceso al servicio propiamente dicho</strong>, en el que el usuario (y host) usan su TGS para autenticarse a sí mismos ante un cierto servicio (ej: ssh, nfs, etc).<br />
<br />
Hay que recordar que en la jerga de Kerberos, el equivalente a una cuenta de usuario se denomina <strong>principal</strong>.<br />
<br />
<strong>Instalación y configuración de Kerberos</strong><br />
<br />
El sabor de kerberos elegido fue el del MIT, bajo Debian Linux/GNU.<br />
Un howto completo, que utilicé como guía fue el de <a href="https://www.debian-administration.org/article/570/MIT_Kerberos_installation_on_Debian">Debian Administration - MIT Kerberos Installation on Debian</a><br />
<br />
<strong>NFSv4 con Kerberos</strong><br />
<br />
NFSv4 con Kerberos depende de la resolución de nombres. Por lo tanto si lo usamos en un ambiente pequeño debemos usar /etc/hosts o bien dnsmasq. Para ambientes de más escala se justificará usar bind u otro servidor DNS.<br />
El servicio es sumamente sensible a la resolución de nombres directa y reversa. <br />
En un ambiente hogareño, el servicio implementado contiene el servidor KDC (Kerberos Distribution Center) el servidor Kadmin y el NFS en un mismo host (en mi caso una Raspberry Pi con un HD para storage de NFS). <br />
Pero en un ambiente empresarial lo adecuado es que estos tres componentes estén aislados en hosts individuales. Especialmente, como se mencionó arriba, deben ser hosts que no tengan acceso a internet.<br />
<br />
En el servidor NFS (+KDC+KADMIN) /etc/hosts debe contener las entradas de los hosts, por ejemplo:<br />
<br />
<div class="code">192.168.51.107 krb1.equiscentrico.com.ar<br />
192.168.51.106 matuxntbk.equiscentrico.com.ar<br />
</div><br />
En mi caso, krb1.equiscentrico.com.ar será el servidor y matuxntbk.equiscentrico.com.ar será una estación, capaz de montar el recurso NFS autenticando con krb5.<br />
La estación (matuxntbk.equiscentrico.com.ar) debe tener correctamente configurado su hostname y la resolución de nombres:<br />
<br />
Para ello, /etc/hostname debe contener solo el nombre de host (matuxntbk en este caso):<br />
<div class="code">~$ hostname<br />
matuxntbk<br />
## Y:<br />
~$ hostname -f<br />
matuxntbk.equiscentrico.com.ar<br />
</div><br />
Y /etc/hosts debe contener el dominio para formar el FQDN:<br />
<br />
<div class="code">127.0.0.1 localhost<br />
127.0.1.1 matuxntbk.equiscentrico.com.ar matuxntbk<br />
192.168.51.107 krb1.equiscentrico.com.ar krb1<br />
</div><br />
Me detuve en este punto porque el problema de la resolución de nombres suele ser el principal problema que nos encontramos en el troubleshooting cuando algo falla.<br />
<br />
Lo que podemos hacer, como siempre, es descomponer el problema en sus partes más simple: primero podemos configurar NFSv4 (sin auth vía kerberos), probar que todo funcione, es decir que desde las workstations podamos <br />
montar el recurso exportado y si todo va bien entonces seguir con Kerberos.<br />
<br />
En el servidor NFS precisaremos los siguientes paquetes:<br />
<br />
<div class="code"># apt-get install nfs-kernel-server nfs-common<br />
</div><br />
NFSv4 ya no utiliza el protocolo rpc.mountd, que se usaba en NFSv2 y 3, por lo tanto el montaje del file systems ha cambiado: un cliente NFSv4 tiene ahora la posibilidad de ver todos los exports servidos por el servidor NFSv4 como un único FS, llamado pseudo-file system NFSv4 (se puede ver más información al respecto en este link: <a href="https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s3-nfs-server-config-exportfs-nfsv4.html">https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s3-nfs-server-config-exportfs-nfsv4.html</a>.<br />
Para preparar los exports se puede hacer una vez, usando --bind o bien dejarlo persistente en /etc/fstab. En mi caso, el pseudo FS quedó de la siguiente forma:<br />
$ cat /etc/fstab<br />
<div class="code">#<br />
UUID=493641ad-bf73-45b2-93f0-e63fd63f384f /mnt/bighd ext4 defaults,errors=remount-ro 0 3<br />
/mnt/bighd/data /mnt/bighd/nfs4exports/data none bind,rw,_netdev 0 0<br />
</div><br />
La primera partición, identificada por su UUID es la partición física de un hd, cuyo punto de montaje fue /mnt/bighd. La segunda es la encargada de crear el pseudo-FS para NFSv4. Los sucesivos exports formarán parte de ese pseudo FS.<br />
Si deseamos probar primero el funcionamiento de NFSv4 sin kerberos podemos entonces crear los exports de esta forma en /etc/exports:<br />
<br />
<div class="code"># Sin kerberos:<br />
/mnt/bighd/nfs4exports 192.168.1.0/24(ro,sync,insecure,no_subtree_check,fsid=0)<br />
/mnt/bighd/nfs4exports/data 192.168.1.0/24(rw,nohide,sync,insecure,no_subtree_check)<br />
</div><br />
Podremos entonces probar montar el export desde una estación.<br />
<br />
<strong>El perro entra en escena</strong><br />
<br />
En el host que funcionará como KDC y/o krb5-admin deberemos instalar los siguientes paquetes (en este caso usaremos la variante Kerberos de MIT):<br />
<br />
<div class="code"># apt-get install krb5-admin-server krb5-kdc krb5-user libgssapi-krb5 libpam-krb5<br />
</div><br />
Mientras que las workstation que serán "clientes" NFS4 y Kerberos deberán tener los siguientes paquetes:<br />
<br />
<div class="code"># apt-get install krb5-config krb5-user libgssapi-krb5-2 libkrb5-3 libpam-krb5 nfs-common<br />
</div>(el ultimo paquete es el que brinda soporte para nfs, mientra que el resto es para Kerberos.<br />
<br />
En el servidor NFS debemos configurar el servicio para que soporte auth por kerberos, en <strong> /etc/default/nfs-kernel-server</strong>:<br />
<br />
<br />
<div class="code"># Number of servers to start up<br />
RPCNFSDCOUNT=8<br />
<br />
# Runtime priority of server (see nice(1))<br />
RPCNFSDPRIORITY=0<br />
<br />
# Options for rpc.mountd.<br />
# If you have a port-based firewall, you might want to set up<br />
# a fixed port here using the --port option. For more information,<br />
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS<br />
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here<br />
RPCMOUNTDOPTS="--manage-gids --debug all"<br />
<br />
# Do you want to start the svcgssd daemon? It is only required for Kerberos<br />
# exports. Valid alternatives are "yes" and "no"; the default is "no".<br />
NEED_SVCGSSD=yes<br />
<br />
# Options for rpc.svcgssd.<br />
#RPCSVCGSSDOPTS=<br />
RPCSVCGSSDOPTS=-vvvvvvvvv<br />
</div><br />
Tanto en el servidor NFS como en los clientes debe también editarse <strong> /etc/default/nfs-common</strong>:<br />
<br />
<div class="code"># If you do not set values for the NEED_ options, they will be attempted<br />
# autodetected; this should be sufficient for most people. Valid alternatives<br />
# for the NEED_ options are "yes" and "no".<br />
<br />
# Do you want to start the statd daemon? It is not needed for NFSv4.<br />
NEED_STATD=<br />
<br />
# Options for rpc.statd.<br />
# Should rpc.statd listen on a specific port? This is especially useful<br />
# when you have a port-based firewall. To use a fixed port, set this<br />
# this variable to a statd argument like: "--port 4000 --outgoing-port 4001".<br />
# For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS<br />
STATDOPTS=<br />
<br />
# Do you want to start the idmapd daemon? It is only needed for NFSv4.<br />
NEED_IDMAPD=YES<br />
<br />
# Do you want to start the gssd daemon? It is required for Kerberos mounts.<br />
NEED_GSSD=YES<br />
</div><br />
Cuando NFS se utiliza con Kerberos el KDC le da acceso solamente a los usuarios que tenga un ticket kerberos, por eso la seguridad ya no depende de algún atributo del cliente (ej. su dirección IP). Por lo tanto, en la jerga de kerberos, se precisa un <strong>Principal</strong> en tu <strong>Realm</strong> Kerberos para cada uno de los usuarios que vaya a acceder a un recurso NFSv4.<br />
<br />
Una vez que tenemos los paquetes y los componentes del servidor kerberos<br />
<br />
<br />
<div class="code">root@krb1:/tmp# /etc/init.d/krb5-admin-server status<br />
<strong>[ ok ] kadmind is running.</strong><br />
root@krb1:/tmp# /etc/init.d/krb5-kdc status<br />
<strong>[ ok ] krb5kdc is running.</strong><br />
</div># Aquí se pueden ver los dos demonios (kdc y krb5-admin-server corriendo)<br />
<br />
Como dijimos más arriba, se está usando la variante MIT de Kerberos. Tanto en el servidor como en los clientes NFS precisaremos estos paquetes:<br />
<br />
<div class="code"># apt-get install krb5-user<br />
# apt-get install libpam-krb5 <br />
</div><br />
Verificar que el siguiente módulo del kernel está cargado en memoria tanto en el servidor Kerberos como en los clientes NFS:<br />
<br />
<div class="code"># lsmod | grep gss<br />
rpcsec_gss_krb5<br />
</div><br />
Caso contrario, cargarlo o agregarlo a /etc/modules para que se cargue automáticamente.<br />
<br />
<div class="code"># modprobe rpcsec_gss_krb5 <br />
</div><br />
<br />
<strong>Crear y distribuir las credenciales</strong><br />
<br />
Para que la autenticación por kerberos funcione para nfs(v4) se precisará un <i>principal</i> en nuestro <strong><i>Realm</i></strong> por cada usuario que vaya a usar un share NFS.<br />
NFSv4 requiere credenciales (principals en la jerga kerberos) para el server y para cada cliente que quiera usar las características de seguridad de NFSv4.<br />
Se deben crear las credenciales para el servidor nfs y para todos los clientes en el servidor Kerberos (KDC) y distribuir las keys vía scp a cada cliente.<br />
Podemos verificar que estas entradas se hayan creado ejecutando # klist -e -k /etc/krb5.keytab.<br />
<br />
Desde el servidor KDC nos autenticamos directamente usando:<br />
<br />
<div class="code"># kadmin.local<br />
</div># En este caso no nos pedirá passphrase.<br />
<br />
O desde un cliente del "Realm" podremos también hacer:<br />
<div class="code"># kadmin krb1.equiscentrico.com.ar<br />
</div><br />
Donde krb1.equiscentrico.com.ar es el FQDN del servidor kerberos. En este caso se solicitará la passphrase que hayamos configurado al momento de configurar el servicio de kerberos.<br />
<br />
Entonces, para registrar los principals del servidor y cada cliente sería:<br />
<br />
En este caso: krb1.equiscentrico.com.ar es el servidor. Mientras que nfs-client.equiscentrico.com.ar<br />
<br />
<div class="code">$ kinit admin/admin<br />
$ kadmin -q "addprinc -randkey nfs/krb1.equiscentrico.com.ar"<br />
$ kadmin -q "addprinc -randkey nfs/nfs-client.equiscentrico.com.ar"<br />
</div><br />
Esto mismo podría hacerse de esta forma:<br />
<br />
<div class="code"># kadmin.local<br />
$ addprinc -randkey nfs/krb1.equiscentrico.com.ar<br />
$ addprinc -randkey nfs/nfs-client.equiscentrico.com.ar<br />
</div><br />
Ahora se debe agregar estas al archivo keytab en el servidor NFS y en los clientes. Loguearse a krb1.equiscentrico.com.ar (reemplace con el que corresponda) e inicializar el administrador kerberos como antes:<br />
Ahora se debe agregar al los keytab-files del servidor NFS y de los clientes. <br />
<br />
<div class="code">root@krb1.equiscentrico # <strong>kadmin -p admin/admin -q "ktadd nfs/krb1.equiscentrico.com.ar"</strong><br />
</div><br />
Y agregar al archivo keytab del cliente:<br />
<br />
<div class="code">root@nfs-client.equiscentrico.com.ar# kadmin -p admin/admin -q "ktadd nfs/nfs-client.equiscentrico.com.ar"<br />
</div><br />
Nota: para que esto funcione previamente tendremos que haber creado un "principal" admin/admin en el servidor, de esta forma:<br />
<br />
<div class="code">kadmin.local<br />
Authenticating as principal matias/admin@EQUISCENTRICO.COM.AR with password.<br />
kadmin.local: addprinc admin/admin<br />
WARNING: no policy specified for admin/admin@EQUISCENTRICO.COM.AR; defaulting to no policy<br />
Enter password for principal "admin/admin@EQUISCENTRICO.COM.AR": <br />
Re-enter password for principal "admin/admin@EQUISCENTRICO.COM.AR": <br />
Principal "admin/admin@EQUISCENTRICO.COM.AR" created.<br />
kadmin.local: quit<br />
</div><br />
O bien:<br />
<br />
<div class="code">nfs-client.equiscentrico.com.ar# kadmin <br />
(pedirá la passphrase del admin kerberos)<br />
kadmin: ktadd nfs/nfs-client.equiscentrico.com.ar<br />
</div>Luego podemos verificar que la entrada se haya agregado a al keyfile del cliente<br />
<br />
<div class="code"># cat /etc/krb5.keytab<br />
</div><br />
Se puede verificar que las entradas en los archivos keytab se puede verificar tanto en el servidor como en los clientes de esta forma:<br />
<br />
<div class="code"># klist -e -k /etc/krb5.keytab<br />
</div><br />
En este punto, se puede probar la autenticación de kerberos previamente a utilizarlo con NFSv4. De esta forma podremos verificar que la capa de kerberos funcione bien:<br />
<br />
<div class="code"># kinit -k -t /etc/krb5.keytab nfs/nfs-client.equiscentrico.com.ar<br />
</div>Con esto lo que habremos hecho es solicitar un ticket al servidor kerberos usando la entrada en nuestro keytab para el host nfs-client.equiscentrico.com.ar. Si la autenticación fue exitosa, no obtendremos mensaje alguno, pero podemos ver los detalles del ticket que nos otorgó:<br />
<br />
<div class="code"># klist<br />
Ticket cache: FILE:/tmp/krb5cc_0<br />
Default principal: nfs/nfs-client.equiscentrico.com.ar@EQUISCENTRICO.COM.AR<br />
<br />
Valid starting Expires Service principal<br />
27/03/16 18:17:11 28/03/16 04:17:11 krbtgt/EQUISCENTRICO.COM.AR@EQUISCENTRICO.COM.AR<br />
renew until 28/03/16 18:17:11<br />
</div><br />
Con:<br />
<br />
<div class="code"># kdestroy<br />
</div><br />
Con eso habremos borrado el ticket que nos había sido otorgado.<br />
<br />
Ahora podríamos (finalmente!) montar los exports NFS usando kerberos:<br />
<br />
<div class="code"># mount -t nfs4 -o sec=krb5 krb1.equiscentrico.com.ar:/ /mnt<br />
</div><br />
Voilà! NFS y Kerberos están andando. Para crear una entrada en /etc/fstab podría ser:<br />
<br />
<div class="code"># NFSv4 kerberos<br />
krb1.equiscentrico.com.ar:/ /mnt/nfs4 nfs4 _netdev,noauto,sec=krb5 0 0<br />
</div>Nótese las opciones: _netdev para que el montaje ocurra después de que los servicios de red estén activos, noauto si deseamos que no se monte automáticamente y sec=krb5 para auth vía kerberos.<br />
<br />
<strong>Conclusiones:</strong><br />
<br />
El camino para utilizar kerberos fue largo. Algunos problemas que en el camino pueden ocurrir tuvieron con:<br />
<br />
- Verificar siempre resolución de nombres adecuada. El servicio depende de eso.<br />
- En algunas versiones de Debian, notablemente en la testing actual (stretch) me encontré que en los clientes servicios necesarios para nfs con kerberos no levantaban solos. Para hacerlo hay que reiniciar el servicio nfs-common (service nfs-common restart):<br />
<br />
<div class="code"># ps aux | grep rpc<br />
root 2353 0.0 0.1 6608 3400 ? Ss 13:09 0:00 /sbin/rpcbind -f -w<br />
statd 2355 0.0 0.1 4576 2124 ? Ss 13:09 0:00 /sbin/rpc.statd<br />
root 2370 0.0 0.0 2920 1328 ? Ss 13:09 0:00 /usr/sbin/rpc.idmapd<br />
root 2374 0.0 0.1 4796 3764 ? Ss 13:09 0:00 /usr/sbin/rpc.gssd -v<br />
</div><br />
Aquí se ven todos los demonios corriendo. <br />
Para troubleshooting siempre se puede ver el log /var/log/daemon.log<br />
<br />
De esta forma quedó la implementación final, con una Raspberry Pi y un HD de 500Gb en este case:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzlssJRuYKYAhfM4_mkxgMujgFy0l__5dXbuCD6qPTON4mg6iEvW4DFedaPFR3pWtmCg9nfDBhlSgx9OfYsDA5JJZ00Jle0YiyxSoHj-ddyqeBh8hHuOyZ4Dl9fNFGrNxOirm1veg4z4/s1600/NFS4_kerberos.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzlssJRuYKYAhfM4_mkxgMujgFy0l__5dXbuCD6qPTON4mg6iEvW4DFedaPFR3pWtmCg9nfDBhlSgx9OfYsDA5JJZ00Jle0YiyxSoHj-ddyqeBh8hHuOyZ4Dl9fNFGrNxOirm1veg4z4/s320/NFS4_kerberos.jpg" /></a></div><br />
Nota: si se necesita incluir kinit en algún script para automatizar el otorgamiento del ticket se puede crear un keytab de usuario siguiendo este procedimiento: <a href="https://kb.iu.edu/d/aumh"> crear keytab de usuario.</a><br />
<br />
Referencias:<br />
<br />
<a href="https://help.ubuntu.com/community/NFSv4Howto">https://help.ubuntu.com/community/NFSv4Howto</a><br />
<a href="https://www.google.com.ar/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiOsvyH6uHLAhVGS5AKHaJaDtAQFggdMAA&url=http%3A%2F%2Fwww.kerberos.org%2Fsoftware%2Fadminkerberos.pdf&usg=AFQjCNGC3qb-O9HvvsOuo2aRh6CEPEl6PA&sig2=KW0RxCXJbyIwtfkP9KsvJA&bvm=bv.117868183,d.Y2I">The MIT's Kerberos Administrator How-To</a><br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-3578405905978313002015-12-24T12:05:00.001-03:002015-12-24T12:05:12.559-03:00Access Point / Repetidor Wi-Fi con raspberry PI y dongle RTL8192CUA veces cuando viajamos queremos tener internet en varios dispositivos: notebooks, smartphones, etc y dependemos de un punto de acceso Wi-Fi distante que no tiene buena cobertura entonces contar con un repetidor que enrute el tráfico entre una interfaz (dongle RTL8192CU por ejemplo) y otra interfaz conectada a al wi-fi remota puede ser útil.<br />
Esta entrada en el blog es más bien un paso a paso en español de información que está disponible en ingles. La primera parada en este camino es crear un AP Wi-Fi que enrutee a una red cableada. Luego modificaremos la configuración para hacer bridge a otra interfaz wireless y que la raspberry pi sirva como repetidor Wi-Fi. Para esto utilizaremos hostapd y eventualmente dnsmasq si hay necesidad de que el router (Rpi) asigne direcciones IP.<br />
<br />
<span class="fullpost"><br />
Antes de comenzar, unas breves palabras sobre el rendimiento de este dispositivo. La raspberry Pi no es el dispositivo ideal si buscamos un router de alto rendimiento. Inevitablemente, el rendimiento será algo menor que un dispositivo dedicado y diseñado para esa función. Dicho esto, invertir tiempo y algo de dinero en este proyecto de fin de semana tiene varias motivaciones: divertirnos en el proceso (habrá que compilar varios softs si usamos un dongle basado en el chipset RTL8192CU) y quizá dispongamos de alguna Raspberry Pi por ahí disponible para la diversión. Dicho sea de paso, siempre se aprende algo sobre networking con estos proyectos, así sean "just for fun".<br />
<br />
<b>Primero, crear un router wi-fi y red cableada. Manos a la obra</b><br />
<br />
Para esta primera etapa, que nos servirá para probaer que hayamos configurado correctamente hostapd lo que haremos será: una interfaz wi-fi (ej wlan0) servirá como Access Point al cual se conectarán "clientes" usando encriptación WPA2 y autenticación basada en password. Muy similar a un router comercial convencional.<br />
<br />
Primero, siguen las fuentes que me sirvieron para el paso a paso:<br />
<br />
<a href="http://wannabe-nerd.tweakblogs.net/blog/10870/wifi-access-point-using-a-realtek-8192cu-based-usb-wifi-dongle-with-a-raspberry-pi.html">http://wannabe-nerd.tweakblogs.net/blog/10870/wifi-access-point-using-a-realtek-8192cu-based-usb-wifi-dongle-with-a-raspberry-pi.html</a><br />
<br />
<a href="https://bogeskov.dk/UsbAccessPoint.html">https://bogeskov.dk/UsbAccessPoint.html</a><br />
<br />
Y especialmente este post me fue de suma utilidad, para mantener las cosas simples:<br />
<br />
<a href="https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=29752&start=75"> https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=29752&start=75</a><br />
<br />
<br />
Como dije, en mi caso debía usar un dongle marca TP-LINK modelo TL-WN823N, que está basado en el chipset RTL8192CU. <br />
<br />
<div class="code"># lsusb<br />
Bus 001 Device 004: ID 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter<br />
</div><br />
Este chipset tiene la particularidad de que el módulo que viene con el kernel no soporta el modo AP. Por lo que es necesario compilar el módulo.<br />
Antes que nada, el "router" precisará que se establezca un bridge (dispositivo de capa 2 similar a un switch) que creará un puente entre dos interfaces. En esta primera etapa, entre wlan0 y eth0.<br />
<br />
Instalamos las herramientas para bridges:<br />
<div class="code"># apt-get install bridge-utils<br />
</div><br />
Luego, configuramos la interfaz eth0 y el puente, editando /etc/network/interfaces:<br />
<br />
<div class="code"># The loopback network interface<br />
auto lo<br />
iface lo inet loopback<br />
<br />
<br />
# Setup bridge con bridge<br />
allow-hotplug eth0<br />
iface eth0 inet manual<br />
<br />
auto br0<br />
iface br0 inet static<br />
bridge_ports wlan0 eth0<br />
address 192.168.1.19<br />
netmask 255.255.255.0<br />
network 192.168.1.0<br />
## isp router ip, 192.168.1.1 also runs DHCPD ##<br />
gateway 192.168.1.1<br />
dns-nameservers 192.168.1.1<br />
</div><br />
En esta configuración estamos utilizando una dirección fija para la interfaz eth0 y otro dispositivo en la red (con dir 192.168.1.1) será el gateway hacia internet. También ese otro dispositivo se encargará de correr un servidor dhcp, que será el encargado de otorgar direcciones IP a los dispositos que se conecten al router (Raspberry Pi). Si fuera necesario correr el servidor dhcp en le propia raspberry habría que agregar dnsmasq, por ejemplo.<br />
<br />
Compilar el modulo adecuado para el 8192CU<br />
<br />
Debemos instalar la misma versión de gcc que se haya usado para compilar el kernel, en este caso podemos verla con:<br />
<br />
<div class="code">$ cat /proc/version <br />
Linux version 4.1.13+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #826 PREEMPT Fri Nov 13 20:13:22 GMT 2015<br />
</div><br />
Instalamos la versión adecuada:<br />
<br />
<div class="code"># apt-get update<br />
# apt-get install -y gcc-4.8 g++-4.8<br />
</div><br />
Si este no es la versión default de gcc podemos alterar el symlink de /usr/bin/gcc<br />
<br />
Siguiente instalamos rpi-source que es la herramienta que facilita la descarga del código fuente del kernel a nuestro dir home. Véase que mejor usar un usuario sin privilegios:<br />
<br />
<div class="code">$ cd ~<br />
$ sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source && sudo chmod +x /usr/bin/rpi-source && /usr/bin/rpi-source -q --tag-update<br />
</div><br />
Acto seguido descargamos el source code del kernel<br />
<br />
<div class="code">$ rpi-source<br />
</div><br />
En nuestro directorio home, tendremos un directorio con un nombre linux-hash...blah creamos un symlink:<br />
<br />
<div class="code">$ cd ~<br />
$ ln -s linux-bc1669c846b629cface0aaa367afb2b9c6226faf linux<br />
</div><br />
Ahora, compilamos el módulo:<br />
<br />
<div class="code">cd linux<br />
make mrproper<br />
<br />
# config del kernel .config <br />
zcat /proc/config.gz > .config<br />
make modules_prepare<br />
<br />
# compilar modulo 8192cu<br />
<br />
cd ~/rt8192cu<br />
CONFIG_RTL8192CU=m make -C /home/pi/linux M=`pwd` <br />
<br />
Si todo fue bien, instalar el módulo:<br />
<br />
sudo install -p -m 644 8192cu.ko /lib/modules/4.1.13+/kernel/net/wireless/<br />
sudo insmod /lib/modules/4.1.13+/kernel/net/wireless/8188eu.ko<br />
sudo depmod -a<br />
</div><br />
Lógicamente ajustar la versión del kernel a tu medida. Este es sin dudas el punto más dificil, que va a requerir insistir si alguna dependencia está faltando.<br />
<br />
<b>Compilar hostapd</b><br />
<br />
Como dijimos, el encargado de la magia será hostapd. Este es un daemon de user space para Linux y BSDs que implementa todas las funcionalidades de un AP wifi tales como AP management IEEE 802.11, IEEE 802.1X/WPA/WPA2/EAP Authenticators, cliente RADIUS, EAP server, etc.<br />
Como vamos a usar este dongle basado en 8192CU, tendremos que compilar un hostapd modificado, y no usar el que está disponible vía gestor de paquetes. Para eso, descargamos los drivers del fabricante desde aquí <a href="http://www.realtek.com/downloads/downloadsView.aspx?Langid=1&PNid=48&PFid=48&Level=5&Conn=4&DownTypeID=3&GetDown=false&Downloads=true#RTL8192CU">Realtek</a> el que indica linuxLinux Kernel 2.6.18~3.9.<br />
<br />
Vamos a compilar simplemente la parte de hostapd, de esta forma<br />
<br />
<div class="code">$ unzip RTL8192xC_USB_linux_*.zip<br />
$ tar zxvf RTL8188C_8192C_USB_linux_*/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_*.tar.gz<br />
$ cd wpa_supplicant_hostapd-0.8_*/hostapd/<br />
$ make<br />
$ sudo cp hostapd hostapd_cli /usr/local/sbin/<br />
</div><br />
Ahora creamos la configuración para hostapd, en /etc/hostapd/hostapd.conf:<br />
<br />
<div class="code">interface=wlan0<br />
bridge=br0<br />
driver=<b>rtl871xdrv</b><br />
logger_syslog=-1<br />
logger_syslog_level=2<br />
logger_stdout=-1<br />
logger_stdout_level=2<br />
dump_file=/tmp/hostapd.dump<br />
ctrl_interface=/var/run/hostapd<br />
ctrl_interface_group=0<br />
ssid=roadconn<br />
country_code=AR<br />
hw_mode=g<br />
channel=6<br />
beacon_int=100<br />
dtim_period=2<br />
max_num_sta=255<br />
rts_threshold=2347<br />
fragm_threshold=2346<br />
macaddr_acl=0<br />
auth_algs=3<br />
ignore_broadcast_ssid=0<br />
wmm_enabled=1<br />
wmm_ac_bk_cwmin=4<br />
wmm_ac_bk_cwmax=10<br />
wmm_ac_bk_aifs=7<br />
wmm_ac_bk_txop_limit=0<br />
wmm_ac_bk_acm=0<br />
wmm_ac_be_aifs=3<br />
wmm_ac_be_cwmin=4<br />
wmm_ac_be_cwmax=10<br />
wmm_ac_be_txop_limit=0<br />
wmm_ac_be_acm=0<br />
wmm_ac_vi_aifs=2<br />
wmm_ac_vi_cwmin=3<br />
wmm_ac_vi_cwmax=4<br />
wmm_ac_vi_txop_limit=94<br />
wmm_ac_vi_acm=0<br />
wmm_ac_vo_aifs=2<br />
wmm_ac_vo_cwmin=2<br />
wmm_ac_vo_cwmax=3<br />
wmm_ac_vo_txop_limit=47<br />
wmm_ac_vo_acm=0<br />
eapol_key_index_workaround=0<br />
eap_server=0<br />
own_ip_addr=127.0.0.1<br />
wpa=2<br />
wpa_passphrase=supersecreta<br />
wpa_key_mgmt=WPA-PSK <br />
wpa_pairwise=TKIP <br />
rsn_pairwise=CCMP<br />
</div><br />
Fíjense los parámetros driver=rtl871xdrv que es donde especificamos el driver a usar, ssid= donde definimos el nombre del ssid y wpa_passphrase donde definimos la autenticación.<br />
<br />
Se puede probar hostapd con el siguiente comando:<br />
<br />
<div code="class"># hostapd -dd /etc/hostapd/hostapd.conf<br />
</div><br />
Si todo va bien podemos crear el script de inicio sysv:<br />
<br />
<div class="code">#!/bin/bash <br />
# /etc/init.d/hostapd <br />
<br />
### BEGIN INIT INFO <br />
# Provides: hostapd <br />
# Required-Start: $remote_fs $syslog <br />
# Required-Stop: $remote_fs $syslog <br />
# Default-Start: 2 3 4 5 <br />
# Default-Stop: 0 1 6 <br />
# Short-Description: Managing hostapd <br />
# Description: This service is used to manage hostapd (WiFi Access Point) <br />
### END INIT INFO <br />
<br />
<br />
case "$1" in <br />
start) <br />
echo <br />
echo "Starting hostapd..." <br />
echo <br />
if [ ! -d /var/run/hostapd ]; then <br />
rm -rf /var/run/hostapd <br />
mkdir /var/run/hostapd <br />
fi <br />
<br />
/usr/local/sbin/hostapd -B -P /var/run/hostapd/wlan0.pid /etc/hostapd/hostapd.conf <br />
;;<br />
stop)<br />
echo<br />
echo "Stopping hostapd..."<br />
echo<br />
if [ -e /var/run/hostapd/wlan0.pid ]; then<br />
read pid < /var/run/hostapd/wlan0.pid
if [ x$pid != x ]; then
kill $pid
fi
fi
;;
restart)
echo
echo "Restarting hostapd..."
echo
if [ -e /var/run/hostapd/wlan0.pid ]; then
read pid < /var/run/hostapd/wlan0.pid
if [ x$pid != x ]; then
kill $pid
fi
fi
if [ ! -d /var/run/hostapd ]; then
rm -rf /var/run/hostapd
mkdir /var/run/hostapd
fi
/usr/local/sbin/hostapd -B -P /var/run/hostapd/wlan0.pid /etc/hostapd/hostapd.conf
;;
*)
echo
echo "Usage: /etc/init.d/hostapd start|stop|restart"
echo
exit 1
;;
esac
exit 0
</div><br />
<br />
Proximo paso, brevemente es convertir el dispositivo a un repetidor wi-fi, haciendo bridge a una segunda interfaz wifi. <br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-1159366114283317212015-05-03T22:58:00.001-03:002015-05-04T11:21:09.140-03:00Unprivileged LXC en Debian JessieLinux Containers, o más conocidos como LXC son una joya relativamente reciente -hacen uso de los control groups o cgroups del kernel Linux- que permite correr un sistema operativo Linux dentro de los límites de un contenedor. <br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhleAniB5XAA6w5GQLQB7I_LQCberua2UaCVFgIhKe78xPUH8vxvsF0tZw1meFIetMoD87_AZOuCeMizsM83JLaLvBTKGbXM9DlLmc4KmSkEXwhLWV1X9F1gKoGqESL16oBWZaKqbfnrEE/s1600/lxc.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhleAniB5XAA6w5GQLQB7I_LQCberua2UaCVFgIhKe78xPUH8vxvsF0tZw1meFIetMoD87_AZOuCeMizsM83JLaLvBTKGbXM9DlLmc4KmSkEXwhLWV1X9F1gKoGqESL16oBWZaKqbfnrEE/s320/lxc.jpg" /></a></div>Correrlos como root suele ser directo, pero lo más recomendable es ejecutar todo el contenedor como un usuario sin privilegios. Dicha tarea no requiere demasiados esfuerzos en Ubuntu porque esa fue ajustada en detalle. En cambio, en Debian requiere bastante esfuerzo. Varios días, prueba y error compilando paquetes hasta poder conseguirlo ejecutar mis primeros contenedores sin privilegios en Debian. Estas son unas notas sobre el proceso, aún un work-in-progress.<br />
<br />
<span class="fullpost"><br />
Esta entrada no pretende ser un paso a paso sobre cómo crear contenedores unprivileged, sino más bien listar los prerequisitos necesarios para poder crearlos en Debian Jessie.<br />
Uno de los mejores tutoriales es el de Stéphane Graber en este link: <a href="https://www.stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/">https://www.stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/</a> <br />
Lo que ocurre es que para poder ejecutar contenedores en Debian debemos realizar algunos ajustes previos:<br />
<br />
<strong>1) Kernel con las features necesarias</strong><br />
<br />
- Un kernel custom con las features necesarios. En este caso compilé un kernel 3.16.6 basandome en la configuración usada por Ubuntu. El archivo config puede encontrarse aquí: <a href="https://www.dropbox.com/s/i80zmdtullofojh/config-3.16.0-23-generic?dl=0">config-3.16.0-23-generic</a> <br />
<br />
Aquellos que busquen una guía para el build puede encontrarse una aquí: <a href="http://www.equiscentrico.com.ar/2012/07/compilar-un-kernel-la-debian.html">http://www.equiscentrico.com.ar/2012/07/compilar-un-kernel-la-debian.html</a><br />
<br />
También una versión para i386 de esa configuración puede descargarse de: <a href="https://www.dropbox.com/s/wazs1fhgru2hyly/linux-image-3.16.6-lxc-rtx_3.16.6-lxc-rtx-10.00.Custom_i386.deb?dl=0">https://www.dropbox.com/s/wazs1fhgru2hyly/linux-image-3.16.6-lxc-rtx_3.16.6-lxc-rtx-10.00.Custom_i386.deb?dl=0</a><br />
<br />
Y los headers pueden encontrarse: <a href="https://www.dropbox.com/s/z5udb1stt3q9gor/linux-headers-3.16.6-lxc-rtx_3.16.6-lxc-rtx-10.00.Custom_i386.deb?dl=0">https://www.dropbox.com/s/z5udb1stt3q9gor/linux-headers-3.16.6-lxc-rtx_3.16.6-lxc-rtx-10.00.Custom_i386.deb?dl=0</a><br />
<br />
<strong>2) systemd parchado para lxc "unprivileged"</strong><br />
<br />
Para que el usuario tenga control sobre los cgroups del lxc se requiere una versión bien reciente de systemd, 217-2 en adelante. Yo usé la versión 219, tomandola de la rama <i>experimental</i> de Debian:<br />
<br />
Agregar los repo experimantal a APT (/etc/apt/sources.list):<br />
<div class="code">deb http://ftp.debian.org/debian experimental main<br />
</div><br />
Y luego instalar el paquete:<br />
<br />
<div class="code"># apt-get update && apt-get -t experimental install systemd<br />
</div><br />
Otro paquete importante es libpam-systemd. Los paquetes instalados pueden verse:<br />
<br />
<div class="code">$ dpkg -l | grep systemd<br />
ii libpam-systemd:i386 219-8 i386 system and service manager - PAM module<br />
ii libsystemd0:i386 219-8 i386 systemd utility library<br />
ii systemd 219-8 i386 system and service manager<br />
ii systemd-sysv 219-8 i386 system and service manager - SysV links<br />
</div><br />
<strong>3) Versión apropiada de LXC</strong><br />
<br />
En este punto es importante hacer notar lo siguiente: debe usarse una versión de LXC de los repos de Debian y no una compilada por uno mismo. Porque se incluyen en la de Debian algunos parches para que LXC se lleve bien con systemd, como puede verse abajo:<br />
<br />
<br />
<div class="code">dpkg-source: información: extrayendo lxc en lxc-1.0.7<br />
dpkg-source: información: desempaquetando lxc_1.0.7.orig.tar.xz<br />
dpkg-source: información: desempaquetando lxc_1.0.7-3.debian.tar.xz<br />
dpkg-source: información: aplicando «0001-lxcinitdir.patch»<br />
dpkg-source: información: aplicando «0002-sysvinit-directory.patch»<br />
dpkg-source: información: aplicando «0003-sysvinit-lsb-headers.patch»<br />
dpkg-source: información: aplicando «0004-sysvinit-lsb-functions.patch»<br />
dpkg-source: información: aplicando «0005-sysvinit-lsb-lock.patch»<br />
dpkg-source: información: aplicando «0006-lxc-attach-sigint.patch»<br />
dpkg-source: información: aplicando «0007-lxc-patch-shebang.patch»<br />
dpkg-source: información: aplicando «0008-lxc-debian-fuse.patch»<br />
dpkg-source: información: aplicando «0009-lxc-debian-openssh-server.patch»<br />
dpkg-source: información: aplicando «0010-lxc-debian-root-password.patch»<br />
dpkg-source: información: aplicando «0011-lxc-debian-systemd.patch»<br />
dpkg-source: información: aplicando «0012-lxc-debian-sysfs.patch»<br />
</div><br />
Como se ve, esos parches son fundamentales. Pasé mucho tiempo rompiéndome la cabeza con unos deb compilados a partir del upstream de lxc. Esos parches están para eso. Entonces, con la versión que Jessie tiene en sus repos de LXC: 1.0.6 va bien. Lo ideal sería poder usar una un poco más nueva, como 1.0.7 (fuentes de sid), eso voy a intentar dentro de poco.<br />
<br />
<strong>4) Instalar cgmanager y verificar que esté demonizado </strong><br />
<br />
<div class="code">$ dpkg -l cgmanager<br />
ii cgmanager 0.36-1 all <br />
</div><br />
Para cgmanager estoy usando la versión 0.36, que creo que hasta este momento es la más reciente. El DEB que preparé está aquí: <a href="https://www.dropbox.com/s/dvkg8sugcpqdc72/cgmanager_0.36-1_all.deb?dl=0">https://www.dropbox.com/s/dvkg8sugcpqdc72/cgmanager_0.36-1_all.deb?dl=0 </a><br />
<br />
Luego de instalarlo, asegurarse de que quede activado en los scripts de inicio:<br />
<br />
<div class="code">c$ systemctl status cgmanager<br />
● cgmanager.service - Cgroup management daemon<br />
Loaded: loaded (/usr/lib/systemd/system/cgmanager.service; enabled; vendor preset: enabled)<br />
Active: active (running) since dom 2015-05-03 20:12:15 ART; 2h 22min ago<br />
Main PID: 814 (cgmanager)<br />
CGroup: /system.slice/cgmanager.service<br />
‣ 814 /usr/sbin/cgmanager -m name=systemd<br />
matias@matuxntbk:~/RamosLinux/lxc$ ps aux | grep cgmanager<br />
root 814 0.0 0.2 2912 2072 ? Ss 20:12 0:00 /usr/sbin/cgmanager -m name=systemd<br />
</div><br />
<strong>5) script de inicio y configuración de red lxc-net </strong><br />
<br />
También en el dropbox guardé una copia del script de configuración de red, lxc-net que es el encargado de iniciar dnsmasq con la configuración necesaria para utilizar una red tipo "nat", en la que cada contenedor "guest" tendrá una interfaz virtual con una red "interna" que hará nat a la dirección IP del host.<br />
<br />
<a href="https://www.dropbox.com/s/s4yl5jn30w1apot/lxc-net.tar.gz?dl=0">https://www.dropbox.com/s/s4yl5jn30w1apot/lxc-net.tar.gz?dl=0</a><br />
<br />
Luego copiar los archivos, iniciar el script:<br />
<br />
<div class="code"># systemctl start lxc-net<br />
</div><br />
Y verificar con bridge utils que la interfaz tipo bridge se haya creado:<br />
<br />
<div class="code">matias@matuxntbk:~/RamosLinux/lxc$ /sbin/brctl show<br />
bridge name bridge id STP enabled interfaces<br />
lxcbr0 8000.000000000000 no <br />
</div><br />
<strong>6) Preparar el ambiente, siguiendo el tutorial de Stéphane (<a href="https://www.stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/">https://www.stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/</a>) </strong><br />
<br />
6.1) Conviene agregar al usuario que usaremos para los containers al archivo sudoers para que pueda ejecutar cgm:<br />
<br />
# /etc/sudoers o visudo<br />
<div class="code">lxcuser ALL=NOPASSWD:/usr/bin/cgm<br />
</div><br />
6.2) preparar los permisos:<br />
<br />
<div class="code">$ sudo cgm create all foo<br />
$ sudo cgm chown all foo $(id -u) $(id -g)<br />
$ cgm modepid all foo $$<br />
</div><br />
Aqui utilizamos cgm (cgroup manager) para crear el cgroup foo, y mover a él el pid del running shell. Eso permitirá que los procesos susecuentes se ejecuten bajo ese cgroup.<br />
<br />
Notas finales: este es un borrador de un trabajo aún en progresos. Hay que señalar que las versiones que se necesitan por ejemplo de systemd son realmente bleeding-edge. Siendo systemd un proceso crítico (de él depende toda la estabilidad del sistema) conviene probar en profundidad esta configuración antes de aventurarse a hacer un deploy a producción.<br />
<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-42968955424956088722015-02-17T23:03:00.001-03:002015-02-17T23:05:42.876-03:00En los *nix, los pipelines son un cañoParte de la "filosofía" de Unix (o de la programación para sistemas *nix) puede resumirse según el principio "escribí programas que hagan una cosa, y que la hagan bien".<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNf8bLy06t73SAngOWOeCDqzvSiCN0ocsAlX_rz-NbvK85GJoT0d4sMqEJw1bI5OpUdNkHrEYMcdBwR1g7EIThni91pVl8DDBfzN7sb4JlgrRzz2Uq4rhbkXUf0LFw2oUnyXCSBbT5C34/s1600/ken_thompson.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNf8bLy06t73SAngOWOeCDqzvSiCN0ocsAlX_rz-NbvK85GJoT0d4sMqEJw1bI5OpUdNkHrEYMcdBwR1g7EIThni91pVl8DDBfzN7sb4JlgrRzz2Uq4rhbkXUf0LFw2oUnyXCSBbT5C34/s320/ken_thompson.jpg" /></a></div>Los pipelines, "pipes" son el mecanismo que permite extender este principio combinando y comunicando distintos procesos, para que cada uno haga su tarea, de la mejor forma posible.<br />
En esta entrada, la historia de la noche febril en que Ken Thompson escribió la llamada al sistema pipe() y un par de breves y mundanos ejemplos de uso de pipes en bash.<br />
<br />
<span class="fullpost"><br />
<b>Una febril noche de 1973 y una orgía de <i>one-liners</i></b><br />
<br />
Dice Wikipedia ( <a href="http://en.wikipedia.org/wiki/Pipeline_%28Unix%29"> Pipeline_(Unix)</a> ) que el concepto de pipeline (el paso de la salida de un programa a la entrada de otro) fue inventado por Douglas McIlroy, uno de los autores de los primeros shells. McIlroy notó que buena parte del tiempo estaban dirigiendo la salida de un programa a la entrada de otro.<br />
Sus ideas las implementó Ken Thopson en una "noche febril" de 1973, cuando agregó la llamada al sistema pipe() y el mecanismo de "pipe" | a shell, junto con varias utilitarios en la versión 3 de Unix. Al día siguiente surgieron los "one-liners" (entradas de una líneas que encadenaban varios programas): dice McIlroy "vi una orgía inolvidable de one-liners en la medida que cada uno se sumaba a la diversión de meter todo en un caño".<br />
<br />
<b>Comunicar procesos en Bash</b><br />
<br />
Los "pipes" o "pipelines" son una de las formas más simples y básicas de comunicar procesos (IPC: "Inter Process Communication"). Una de las grandes ventajas de los shells *nix es la posibilidad de crear one-liners que son combinaciones de programas, que juntos hacen una tarea en la que cada uno contribuye.<br />
Solo un ejemplo, tomado de www.bashoneliners.com:<br />
<br />
<div class="code">$ /usr/bin/printf 'GET / \n' | nc yahoo.com.ar 80<br />
</div><br />
En este ejemplo se puede grabar el html de yahoo.com.ar usando netcat como cliente. Esa era la orgía a la que McIlroy se refería.<br />
<br />
Existen pipelines con nombre y pipelines sin nombre, los primeros son básicamente un tipo de archivo especial en el File System al cual cierto/s proceso/s pueden escribir y otros leer. Los pipeline sin nombre son los que más usamos en la cli, cuando se usa para dirigir la salida de un comando a la entrada de otro con el caracter '|'.<br />
Un pipe funciona, oh sorpresa, como un archivo y puede leerse de la misma forma.<br />
Sigue abajo un ejemplo con el que me divertí un rato y con la esperanza que le pueda servir al sr. @esturniolo:<br />
<br />
<div class="code">#!/usr/bin/env bash<br />
#### Script for testing porpouses. Showing unnamed pipes in bash<br />
#### imagemagick must be installed, so: # aptitude install imagemagick.<br />
<br />
<br />
function printUsage {<br />
echo >&2 'Error: no argument supplied.'<br />
echo >&2 "Usage $0 </path/to/initial_directory>"<br />
echo >&2 "$0 will start looking for image files starting at the initial directory you supply"<br />
exit 1<br />
<br />
}<br />
<br />
function checkDep {<br />
type $1 > /dev/null 2>&1<br />
if [ "$?" -ne 0 ] <br />
then<br />
echo >&2 "Dependency $1 not met. Install it!"<br />
exit 1<br />
fi<br />
}<br />
function main {<br />
echo "inicial dir=" $1<br />
COMMAND="find $1 -iregex .*\.\(jpg\|gif\|png\|jpeg\)$ -type f"<br />
$COMMAND | while read i<br />
do<br />
# Here you do whatever you want with each lined passed throgh the pipe. <br />
# That's the unix magic.<br />
echo $i<br />
# in this test we grab some data from image file properties.<br />
identify -format "%wx%h %[EXIF:DateTime] " $i<br />
done<br />
echo<br />
}<br />
<br />
# Test user input: parameter $1, which must be the initial dir.<br />
if [ "$#" -eq 0 ]; then<br />
printUsage<br />
fi<br />
if [ ! -d $1 ]; then<br />
echo >&2 "$1 is not a valid directory, so it's none of my bussiness fellow."<br />
exit 1 <br />
fi<br />
<br />
# For checking dependency pass bin/script to be checked as checkDep parameter:<br />
checkDep identify<br />
main $1<br />
</div><br />
A este script se le pasa como único parámetro un directorio inicial para que busque recursivamente en él archivos de imágenes:<br />
<br />
<div class="code">find $1 -iregex .*\.\(jpg\|gif\|png\|jpeg\)$ -type f<br />
</div><br />
Donde $1 es el primer parámetro que se le pasa al script. Ejemplo:<br />
<br />
$ ./test_stu.sh /home/retux/fotos<br />
<br />
La magia de pipe:<br />
<br />
<div class="code">$COMMAND | while read i<br />
do<br />
# Here you do whatever you want with each lined passed throgh the pipe. <br />
# That's the unix magic.<br />
echo $i<br />
# in this test we grab some data from image file properties.<br />
identify -format "%wx%h %[EXIF:DateTime] " $i<br />
done<br />
</div><br />
Cada línea que find en este caso devuelva por su stdout es redirigida por un pipe y almacenada en la var $i. Luego podemos hacer o que querramos, en este caso se llama al programa identify para que imprima algunos atributos de cada imagen, cuando se le pasa su ubicación, contenida en $i.<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-31855949230604512692015-02-16T17:29:00.001-03:002015-02-16T17:29:46.392-03:00Mantener ssh más seguro. Hoy: ssh-agentComo sysadmins en ambientes corporativos o en nuestras redes hogareñas openssh es el protocolo capaz de encriptar absolutamente todos el tráfico y permitirnos la administración remota de hosts o vps de forma segura.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwz0BEVh7jnfpmae-HDYDt7zdhd0Why4cP8RQPP6FYXkaCWXfTNhW3qtkAJEBu9pSZeRFWPm10xUTNpOnby8ccUGJtt9eph037iSZIgqt-wZIwgOJ4NHcLmvl5DGxvujSE9rB-hWYYW5U/s1600/openssh_logo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwz0BEVh7jnfpmae-HDYDt7zdhd0Why4cP8RQPP6FYXkaCWXfTNhW3qtkAJEBu9pSZeRFWPm10xUTNpOnby8ccUGJtt9eph037iSZIgqt-wZIwgOJ4NHcLmvl5DGxvujSE9rB-hWYYW5U/s320/openssh_logo.png" /></a></div><br />
Usar ssh de manera predeterminada con autenticación por password puede ser peligroso. Por eso, auth asimétrica con keys es la solución. <br />
<span class="fullpost"><br />
El desconfiao' puede hacer la prueba. Colocar un host en internet que acepte autenticación por password. En algunas horas los logs evidenciarán que el host fue objeto a algún ataque de diccionario. Si además la config de sshd permite ogin del usuario root (como suele ser el default: PermitRootLogin yes) las consecuencias pueden ser fatales. Si la contraseña es débil y el ataque tiene éxito los miscreants se habrán hecho de acceso al host y con el usuario con mayores privilegios del sistema.<br />
Estas líneas asustadoras sólo pretenden exponer la gravedad. Un protocolo sumamente seguro como ssh versión 2 puede ser vulnerado solo por una configuración "permisiva" del usuario.<br />
<br />
En otra entrada de este blog me ocupé sobre cómo usar criptografía asimétrica (par de claves pública/privada) para autenticar ssh: <a href="http://www.equiscentrico.com.ar/2010/08/sysadmin-tip-acceso-ssh-con-claves-sin.html"></a><br />
<br />
Aquella vez, para mantener las cosas simples, al momento de crear las claves con ssh-keygen no se establecía una passphrase para el acceso a la clave privada. Eso efectivamente hace las cosas sencillas si se va a usar scp u otro programa en scripts. Pero qué pasa si alguien lograra tener acceso a la clave privada: como no hay passphrase podría tener acceso a los hosts que tienen su clave pública en el archvio <b>authorized_keys</b>.<br />
<br />
Para hacer mejor las cosas existe <b>ssh-agent</b>.<br />
<br />
Como su manpage explica el objeto de ssh-agent es <br />
<br />
ssh-agent es un programa que guarda las llaves privadas que se usan para autentificación por llave pública. En general ssh-agent se inicia como demonio al principio de una sesión X. Otros programas funcionarán como clientes de ssh-agent cuando requieran acceder a otros hosts vía ssh.<br />
Las aplicaciones pueden localizar a ssh-agent a través de dos variables del entorno:<br />
<br />
<div class="code">SSH_AGENT_PID<br />
</div><br />
<div class="code">SSH_AUTH_SOCK<br />
</div><br />
Por ejemplo, en mi Debian, el entorno de escritorio Enlightenment inicia el ssh-agent.<br />
Para usarlo con autenticación ssh por clave pública el procedimiento es similar al descripto en <a href="http://www.equiscentrico.com.ar/2010/08/sysadmin-tip-acceso-ssh-con-claves-sin.html"></a> pero en el momento de crear las llaves, se debe registrar una contraseña fuerte (passphrase) para el acceso a la llave privada.<br />
Luego, con ssh-add agregaremos la llave privada a la gestión de ssh-agent:<br />
<br />
<div class="code">$ ssh-add /home/retux/.ssh/id_rsa<br />
</div><br />
Luego, podremos listar las llaves que ssh-agent gestiona. Obtendremos algo así:<br />
<br />
<div class="code">$ ssh-add -l<br />
2048 04:07:3f:a8:28:ca:e7:11:22:33:55:.... .ssh/id_rsa (RSA)<br />
</div><br />
Así las cosas, ssh-agent nos pedirá la primera vez que intentemos acceder a ese host ingresar las passphrase, pero el programa se encargará de gestionarla, y en lo sucesivo, mientras dure la sesión no nos la pedirá nuevamente.<br />
El resultado es similar a no registrar passphrase al crear las llaves con ssh-keygen, pero con el enorme agregado en lo que hace a la seguridad. Si un malhechor se hace de la llave privada deberá conocer la passphrase para tener acceso.<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-23186721230181330802014-03-21T20:13:00.000-03:002014-03-22T09:14:57.317-03:00PAM establecer horarios de uso del sistema, ejemplo para contron paternalUn tip "quick and dirty" fácil rápido y directo para limitar los horarios en los que ciertos usuarios del sistema pueden loguearse. <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsr0XFy8LfMEKlDj8x0pHghmlqMZYegQ_XAesj0iOwfECDZB6woD5rn9pwpz6598-0q4EblboVp9CVBnJguRkwOXbQLEp-UelbJ1PeiDmI5Qp4B-AROT9K2oZhytPd21gHx61Xt-Yf_qw/s1600/proteccion_al_menor.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsr0XFy8LfMEKlDj8x0pHghmlqMZYegQ_XAesj0iOwfECDZB6woD5rn9pwpz6598-0q4EblboVp9CVBnJguRkwOXbQLEp-UelbJ1PeiDmI5Qp4B-AROT9K2oZhytPd21gHx61Xt-Yf_qw/s320/proteccion_al_menor.jpg" /></a></div>En conjunto con otras utilidades sirve para configurar eso llamado "control paternal".<br />
<br />
<span class="fullpost"><br />
El Linux, como otras variantes de *nix trae implementado PAM (Pluggable Authentication Modules), que básicamente es una API para autenticación de usuarios, pero además como su nombre lo indica PAM incluye varios módulos que con sus "botones y perillas" (configurables en archivos de config, claro) que permiten por ejemplo limitar la asignación de recursos que el kernel provee a cada usuario (ej. RAM, tamaño de la pila, CPU, etc). En ese caso el archivo de config es /etc/pam.d/limits.conf (véase man limts.conf).<br />
Pero el tip rápido y furioso de hoy se ocupa de otro módulo: <strong>pam_time.so</strong> que nos permite configurar los horarios en que ciertos usuarios podrán loguearse al sistema.<br />
<br />
En una entrada previa en Equiscéntrico me ocupé sobre cómo configurar iptables para que algunos usuarios usaran selectivamente los servidores DNS de openDNS y de esa forma establecer un filtro básico de sites no convenientes para niños ver: (<a href="http://www.equiscentrico.com.ar/2010/09/filtrar-facilmente-contenido-web.html">http://www.equiscentrico.com.ar/2010/09/filtrar-facilmente-contenido-web.html</a> ).<br />
En otras ocasiones queremos establecer horarios en que los pibes puedan usar las compus, para que no le resten demasiado tiempo a otras actividades. Ahí es donde el módulo <b>pam_time.so</b> viene a nuestra ayuda.<br />
Rápidamente, para activarlo tenemos que incluir la siguiente línea en al archivo <b>/etc/pam.d/login</b> (esa es su ubicación en Debian, en otras distros o sabores *nix debe ser similar). Y también en <b>/etc/pam.d/kdm</b> o el gestor de logins que use nuestro ambiente de escritorio, en este caso es kde.<br />
<br />
<div class="code"># BOF modulo para limites horarios<br />
account requisite pam_time.so<br />
# EOF limites horarios<br />
</div><br />
Editando estos dos archivos se activará la verificación de horarios tanto al loguin GUI como a las consolas. Lo más probable es que nuestros hijos usan más el entorno gráfico pero si uno de ellos usara más las consolas, convendría dejarle la compu libre las 24 hs :)<br />
Hablando en serio, si acaso también quisiéramos limitar el acesso por horarios vía ssh habrá que configurarlo en el archivo correspondiente: /etc/pam.d/sshd.<br />
Ahora tendremos que configurar los usuarios a los que queremos aplicar las restricciones, eso se hace en <b>/etc/security/time.conf</b><br />
<br />
Ejemplo:<br />
<div class="code"># usuario 1 (dinix)<br />
*;*;dinix;!Wk1115-1910<br />
*;*;dinix;Wd0000-2400<br />
# Usuario 2 (ada)<br />
*;*;ada;!Wk1115-1910<br />
*;*;ada;Wd0000-2400<br />
</div><br />
Aquí configuramos que de lu-vi tanto el usuario dinix como ada no puedan loguearse entre las 11:15 y las 19:10 !Wk1115-1910 pero que los fines de semana (Wd) puedan loguearse las 24 hs. Errores que cometamos durante la config se puede seguir en el syslog.<br />
<br />
Más info se puede obterner con man time.conf·<br />
<br />
Una cosita más. Si el usuario ya se encuntra logueado al momento en que comienza la franja horaria restringida no hay un mecanismo que lo desloguee automáticamente. Eso debe implementarse, por ejemplo desde un script disparado por crontab para complementar este módulo de PAM.<br />
Este fue un tip "quick and dirty". Si hay errores, sugerencias, el feedback es siempre bienvenido.<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0tag:blogger.com,1999:blog-5757133719565387245.post-10025807483903586452014-02-25T17:33:00.000-03:002014-08-26T13:00:12.101-03:00Proyecto de fin de semana: Leds de status para Raspberry PiCuando la Raspberry Pi se usa como servidor, o simplemente <i>headless</i> (sin monitor) resulta útil tener algunos indicadores de su status de funcionamiento. Este proyectito tiene una parte de hard muy simple (un driver de corriente e inversores) y de soft, para colocar en 1 los pines adecuados del GPIO.<br />
El que quiera trabajar con GPIO debe hacerlo con sumo cuidado, así que corre por su propia cuenta y riesgo.<br />
<span class="fullpost"><br />
Esta necesidad surgió primero de un pedido de un amigo, que necesitaba un gabinete que alojara una Raspberry Pi y un HD de 2.5" que funcionarían 24/7 como servidor web, y que se encontraría en un IDC (Internet Data Center). Como los leds internos de la Raspberry suelen quedar ocultos en la mayoría de los gabinetes y este no era la excepción, quería agregar un par de leds que indicaran:<br />
<br />
1) "Power On", la raspberry tiene conectada la alimentación, pero no concluyó el boot. (Led en Rojo)<br />
2) "Ready", la raspberry concluyó satisfactoriamente el boot (led verde).<br />
<br />
1 y 2) es un led bicolor de 5 mm.<br />
<br />
3) "ethernet": un segundo led (ambar 5 mm) se pone en ON cuando la ethernet está activa, se apaga si no hay portadora.<br />
<br />
Si alguna vez la Raspberry tuviera un problema el resposable de operaciones del IDC tendría un primer indicador a través de los leds. Se puede ver en la primera foto.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZxIGxROPfvbls7eGyL7krnGMO2LYWzDLVXu4b7SgbPrad9PaZoH7cWlHoswM3NepCIKfssTiHg1-rdGRXoPiIT34ztlun2V4EKkbyedV2TsukwM_Jb5Dp7nIppAcNeD30rka9w71cids/s1600/20131022_224943.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZxIGxROPfvbls7eGyL7krnGMO2LYWzDLVXu4b7SgbPrad9PaZoH7cWlHoswM3NepCIKfssTiHg1-rdGRXoPiIT34ztlun2V4EKkbyedV2TsukwM_Jb5Dp7nIppAcNeD30rka9w71cids/s200/20131022_224943.jpg" /></a></div><br />
El circuito del driver de corriente e inversor sigue a continuación:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH2idDcl61eisDIDsVL9nqR9pAuUOBGqpJqmbq42zwtZESBc08SGaohRjdbUFy77yJz5qzxU62uwzdpJQ2JjygfeR0QMi8BaNSFGQh_WYjWbhdbSHUqf2eNt1romJWj_XMFVN79Ul0ads/s1600/raspi_led_status.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH2idDcl61eisDIDsVL9nqR9pAuUOBGqpJqmbq42zwtZESBc08SGaohRjdbUFy77yJz5qzxU62uwzdpJQ2JjygfeR0QMi8BaNSFGQh_WYjWbhdbSHUqf2eNt1romJWj_XMFVN79Ul0ads/s400/raspi_led_status.png" /></a></div><br />
Se usó un CI 40106 que contiene 5 inversores lógicos, por la siguiente razón: como driver de corriente, es decir para no cargar directamente el GPIO de la raspberry. Es totalmente cierto que un par de leds podrían conectarse directamente, pero hay que tener en cuenta siempre que si conectamos otras "cosas" al GPIO la corriente total es la sumatoria de todas. Por eso, la utilización del driver ayudaría a la estabilidad general de la RasPi.<br />
<br />
Tanto el código como los binarios empaquetados para instalar en la RasPi se pueden encontrar aquí: <br />
<br />
<a href="https://github.com/retux/raspileds_status">https://github.com/retux/raspileds_status</a><br />
<br />
<div class="code">$ git clone https://github.com/retux/raspileds_status --depth 0<br />
</div><br />
Más info sobre interfaces de corriente para GPIO se puede ver aquí: <a href="http://elinux.org/RPi_GPIO_Interface_Circuits">http://elinux.org/RPi_GPIO_Interface_Circuits</a><br />
<br />
RaspiLed-status requiere usar dos pines del GPIO configurados como salida. Como se podrá ver en las notas del código se eligieron los pines GPIO4 (para el status ethernet, led ambar) y el GPIO17 para status de la CPU (power=>rojo, ready=>verde).<br />
El circuito funciona muy simple: cuando el GPIO17 está en cero el primer inversor tendrá a su salida un 1, encendiendo el led en rojo. Esa lógica se invierte cuando ponemos un 1 a la salida del GPIO17.<br />
Dos scripts SysV se encargan de iniciar los dos programas al inicio (/etc/init.d/readyled y /etc/init.d/raspiledsts). si se quisiera cambiar el pin GPIO17 por otro es en readyled donde habrá que editarlo:<br />
<br />
<div class="code">### BEGIN INIT INFO<br />
# Provides: readyled<br />
# Required-Start: $locale_fs $syslog<br />
# Required-Stop: $locale_fs $syslog<br />
# Default-Start: 2 3 4 5<br />
# Default-Stop: 0 1 6<br />
# Short-Description: Turn raspiled ready on/off at boot time<br />
# Description: RaspiLed ready (GPIO pin 17) indicates system has finished boot process.<br />
### END INIT INFO<br />
<br />
#!/bin/sh<br />
<br />
case "$1" in<br />
start)<br />
echo "Turning on ready LED "<br />
/usr/bin/gpiopinctrl 17 1<br />
;;<br />
stop)<br />
echo "Turning off ready LED"<br />
/usr/bin/gpiopinctrl 17 0<br />
;;<br />
*)<br />
echo "Usage: /etc/init.d/raspiledsts {start|stop}"<br />
exit 1<br />
;;<br />
esac<br />
exit 0<br />
</div><br />
Una vez que el sistema concluya el boot se pondrá en verde el led de status, una vez que demos "shutdown" como el script pasará a stop, se pondrá rojo, indicando que queda con la tensión conectada, pero apagada.<br />
El programa netifledwatch es el encargado de sensar el status de ethernet, es un demonio que a intervalos regulares (1/2 segundo) lee el archivo carrier del pseudo FS /sys. (ej. si la interfaz es eth0 y la portadora ethernet está activa aparecerá un 1 en el archivo, como se ve aquí:<br />
<br />
<div class="code">$ cat /sys/class/net/eth0/carrier <br />
1<br />
</div><br />
Con esa lectura el programa lo único que hace es poner en 1 o 0 segun corresponda el GPIO4.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD7sznkS0MrJt1dc7TaUvY7UivcETthW1-F0nMozie7ikirPQ0EkgEbgE67lbPJRRQFVWc4iULyPPkPNEFqZv-NKUJH_MihbLRtF93BDkhbG7vDePs-GHRW7I0Gbmv85oSnPs1kzAGLkQ/s1600/20140222_192000.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD7sznkS0MrJt1dc7TaUvY7UivcETthW1-F0nMozie7ikirPQ0EkgEbgE67lbPJRRQFVWc4iULyPPkPNEFqZv-NKUJH_MihbLRtF93BDkhbG7vDePs-GHRW7I0Gbmv85oSnPs1kzAGLkQ/s320/20140222_192000.jpg" /></a></div>RaspiLeds-status en otro gabinete.<br />
<br />
Matías Gutiérrez Reto (retux) <br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com1tag:blogger.com,1999:blog-5757133719565387245.post-38204922760994549642014-02-07T14:00:00.000-03:002014-08-26T13:01:38.139-03:00Crear un paquete DEB a partir de código fuente "upstream"Siempre lo dije y lo seguiré sosteniendo: una de las cosas que mejor resumen la idea de belleza y eficiencia es el sistema de empaquetamiento de Debian, que así en español no suena del todo bien, hablamos del Debian Package Management System.<br />
Sigue un tip muy breve sobre cómo crear un .deb instalable a partir de un tarball de código fuente "upstream".<br />
<br />
<span class="fullpost"><br />
Uno de los aspectos de la belleza de DPKG, la base del Debian Management System es la manutención y actualización de los paquetes. Tener idea de los paquetes que tenemos instalados en un servidor o en una estación es rápido y simple, mucho más rápido que tener que hacer find por directorios como /usr/local, /opt.<br />
Por eso siempre es recomendable, de ser posible, usar el sistema de empaquetamiento antes que instalar soft, por ejemplo usando <strong>make install</strong> (el paso culminante de la compilación de soft con Make: configure, make, make install).<br />
Unas razones por las que es mejor el sistema de empaquetamiento es simple. Si quisiéramos desinstalar el paquete es simplemente dpkg -r, o apt-get remove... y el sistema de gestión de paquetes se va a encargar de borrar los archivos necesarios, y listo.<br />
<br />
En otro tip vimos cómo compilar y crear un deb fácilmente cuando el código fuente está en los repositorios Debian <br />
<a href="http://www.equiscentrico.com.ar/2011/06/como-crear-paquetes-deb-partir-de.html">http://www.equiscentrico.com.ar/2011/06/como-crear-paquetes-deb-partir-de.html</a><br />
<br />
<strong>¿Y si solo tenemos un .tar.[gb]z ? </strong><br />
<br />
A no desesperar. <strong>dh_make</strong> es el dueño de la magia. Este programa forma parte del paquete <strong>debhelper</strong>, que es el juego de herramientas para la creación de debs.<br />
<br />
Para ejemplificar voy a usar el código fuente de piklab, que es un IDE para el desarrollo en Microcontroladores PIC, que no encontraba en los repositorios de wheezy. Su código fuente se puede encontrar aquí <a href="http://sourceforge.net/projects/piklab/files/">http://sourceforge.net/projects/piklab/files/</a><br />
Una vez que lo descargamos, y descomprimimos:<br />
<br />
<div class="code">$ bzip2 -dc piklab-0.16.2.tar.bz2 | tar xvf -<br />
</div><br />
dh_make va a hacer la magia:<br />
<br />
<div class="code">$ cd piklab-0.16.2<br />
$ dh_make -f ../piklab-0.16.2.tar.bz2<br />
</div><br />
dh_make va a crear todos los archivos para la <i>debianización</i>.<br />
<br />
Opcionalmente, antes de hacerlo se pueden fijar algunas variables del entorno, para que los datos del "mantainer" como correo y nombre queden ok. En este ejemplo estamos creando un deb para uso propio o distribución en una empresa. Si el paquete fuera a formar parte de los repositorios Debian debe cumplir toda una serie de requisitos extra.<br />
Una vez que dh_make hizo su magia, ahora sí, compilamos (desde dentro del dir del fuente):<br />
<br />
<div class="code">$ dpkg-buildpackage -us -uc<br />
</div><br />
A tomar algo y luego obtendremos el .deb (atenti con todas las dependencias que requiera el soft):<br />
<br />
<div class="code">dpkg-deb: construyendo el paquete `piklab' en `../piklab_0.16.2-1_i386.deb'.<br />
dpkg-genchanges >../piklab_0.16.2-1_i386.changes<br />
dpkg-genchanges: incluyendo el código fuente completo en la subida<br />
dpkg-source --after-build piklab-0.16.2<br />
dpkg-buildpackage: subida completa (se incluye la fuente original)<br />
</div><br />
Podemos instalarlo:<br />
<br />
<div class="code"># dpkg -i piklab_0.16.2-1_i386.deb <br />
Seleccionando el paquete piklab previamente no seleccionado.<br />
(Leyendo la base de datos ... 311105 ficheros o directorios instalados actualmente.)<br />
Desempaquetando piklab (de piklab_0.16.2-1_i386.deb) ...<br />
Configurando piklab (0.16.2-1) ...<br />
Procesando disparadores para man-db ...<br />
Procesando disparadores para hicolor-icon-theme ...<br />
Procesando disparadores para shared-mime-info ...<br />
Unknown media type in type 'all/all'<br />
Unknown media type in type 'all/allfiles'<br />
Unknown media type in type 'uri/mms'<br />
Unknown media type in type 'uri/mmst'<br />
Unknown media type in type 'uri/mmsu'<br />
Unknown media type in type 'uri/pnm'<br />
Unknown media type in type 'uri/rtspt'<br />
Unknown media type in type 'uri/rtspu'<br />
Procesando disparadores para desktop-file-utils ...<br />
</div><br />
Para aquel que todavía no lo crea: Ain't it nice?<br />
<br />
<br />
Matías Gutiérrez Reto (retux)<br />
</span>Matías Gutiérrez Reto (Retux)http://www.blogger.com/profile/07118539708506583459noreply@blogger.com0