Diversión con el Subsistema de Windows para Linux

En Build 2016, Microsoft presentó al mundo el Subsistema de Windows para Linux (Beta) , que permite a los desarrolladores ejecutar binarios nativos de consola en modo de usuario de Ubuntu a través del shell Bash en Windows 10. Si está en el programa Windows Insider, ha tenido la oportunidad de probar esta función utilizando las últimas compilaciones de Windows Anniversary Update Insider.

Los desarrolladores web están acostumbrados a tomar decisiones difíciles sobre qué herramientas y bibliotecas pueden usar en función del sistema operativo en el que están trabajando activamente. El WSL fue diseñado y construido por el Equipo del Kernel de Windows y entregado en asociación con Canonical, para ayudar a los desarrolladores de Windows 10 a usar el rico ecosistema y las herramientas para desarrolladores de Linux junto con las excelentes herramientas que ya están utilizando en Windows, sin tener que arrancar en otro sistema operativo o máquina virtual. Esta es definitivamente una función de Windows 10 «por desarrolladores, para desarrolladores», diseñada específicamente para eliminar un poco de fricción del flujo de trabajo diario de los desarrolladores.

En este post, voy a mostrarte algunas de las características de WSL que personalmente encuentro muy interesantes, así como señalarte algunos recursos para ayudarte a aprender más. Primero, mostraré la integración de comandos básicos como ssh para trabajar con servidores y dispositivos Linux. En segundo lugar, demostraré la capacidad de usar scripts Bash para automatizar tareas de una manera muy natural. Tercero, me divertiré un poco con los excelentes compiladores de línea de comandos, otras herramientas y la compatibilidad *nix que se ofrece, y jugaré un poco a NetHack. Finalmente, te mostraré la capacidad de usar Python existente y otros scripts disponibles en la web.

Windows es mi sistema operativo principal y mi entorno de desarrollo, y lo ha sido desde Windows 3.0 en mi primer 286. Sin embargo, siempre he tenido servidores o dispositivos Linux dando vueltas por mi casa. Desde dispositivos IoT como Raspberry Pi y dispositivos de enrutador/puerta de enlace dedicados hasta servidores Minecraft, tienden a acumularse en los estantes y esquinas de mi oficina. Una cosa que siempre tengo que hacer es administrar y configurar estos equipos Linux fácilmente desde mi estación de trabajo principal.

Administrar servidores y dispositivos

Actualmente corro un servidor Ubuntu Minecraft sin cabeza desde mi casa. Fue mi regalo de Navidad para mi hijo de 10 años el año pasado, pero ha resultado ser mi juguete tanto como el suyo (ok, más mi juguete). Solía usar algunas aplicaciones de cliente para administrarlo desde mi PC principal con Windows 10, pero ahora solo uso ssh de línea de comandos desde Bash en Windows 10. Usar aplicaciones como PuTTY y Tera Term está bien, por supuesto, al igual que usar las excelentes herramientas que vienen con Cygwin, pero quería una experiencia verdaderamente nativa y natural que fluyera bien. Cygwin siempre me pareció un poco como pedir salteados en una pizzería. Estuvo bien, pero la ejecución no se sintió bien para el medio ambiente.

Tengo los pares de claves públicas/privadas configurados usando ssh-keygen y ssh-copy-id desde el WSL, por lo que para ssh, simplemente escribo:

$ ssh <nombre de usuario><servidor>

he creado un alias que hace más rápido. Este es un estándar de Linux/Bash característica:

$ alias mc= » ssh <usuario><servidor>’

Ahora, para llegar a el Minecraft server yo simplemente escriba «mc» en el prompt de Bash en Windows 10.

Este mismo enfoque funciona, por supuesto, con cualquier servidor web o de base de datos basado en Linux o incluso Raspberry Pi y dispositivos IoT similares que pueda usar como parte de su solución.

Poder asegurar el shell de forma limpia desde un mensaje de consola es solo una conveniencia y una preferencia. Sin embargo, una vez que se acostumbra a trabajar directamente en el shell, en un entorno completo que incluye grapas como apt, node, Ruby, Python y otros, abre todo tipo de posibilidades para la automatización.

Scripting remoto

Supongamos que tiene un montón de dispositivos o servidores Linux y desea ejecutar un comando remoto en ellos. Suponiendo que ya haya configurado sus pares de claves públicas/privadas, simplemente puede ejecutar comandos ssh remotos desde Bash.

Por ejemplo, para ver cuándo fue la última hora de reinicio en un servidor remoto, debe escribir esto:

$ ssh <user><server> ‘last-x/grep reboot’

el servidor y ejecuta el comando last-x, y busca las líneas que contienen la palabra «reboot».»Cuando lo corro contra mi servidor Ubuntu Minecraft, obtengo este resultado:

reiniciar el sistema boot 4.4.0-28-genérico Jue Jul 7 08: 14 que sigue funcionando

Es un solo servidor. Si tiene una lista de servidores, también puede automatizar esa parte. He creado un archivo llamado servidores.txt en mi directorio personal en WSL. Contiene un montón de nombres de servidor/dispositivo Linux, uno por línea. Luego leí ese archivo de un script que creé en mi directorio personal en WSL.

Después de años de trabajar con dispositivos como Raspberry Pi, soy un tipo nano (en máquinas virtuales era una persona LSEdit), así es como se ve el script en mi editor de consola favorito:

Por supuesto, puede usar vim o emacs o cualquier otro editor que funcione en una sesión de consola de Ubuntu.

El lenguaje utilizado es Bash script (también llamado Bash shell script). Para ejecutar el script, simplemente escribo:

$. /foreachserver.sh ‘last-x / grep reboot’

Y iterará sobre cada servidor / dispositivo en el archivo y ejecutará ese comando de forma remota a través de ssh. Este es un ejemplo muy simple, por supuesto, pero se puede ampliar para redirigir en scripts locales u otros comandos útiles. El lenguaje de scripting Bash es lo suficientemente rico como para que pueda realizar la mayoría de las tareas de administración remota con él. También puede extenderlo con otras aplicaciones que descargue a la WSL o a los equipos remotos.

¿Qué pasa si desea utilizar archivos y recursos locales de Windows con su flujo de trabajo con otros equipos Linux? O, ¿qué pasa si no usa Linux en absoluto? ¿Bash es capaz de trabajar con archivos y recursos locales de Windows, o es un entorno completamente aislado?

Trabajando con archivos de Windows

El WSL tiene acceso al sistema de archivos de su PC a través de /mnt/<letra de unidad>/ directorios (o puntos de montaje). Por ejemplo, sus directorios raíz C: y D: en Windows estarían disponibles a través de /mnt/c/ y /mnt/d/ respectivamente en el WSL. Esto puede ser útil cuando desea incorporar sus archivos de proyecto de Windows, descargas u otros archivos en un flujo de trabajo basado en Linux / Bash.

Aquellos mapa para el SSD y mecánica de la unidad que tengo en el PC:

Estas son las lógicas de los montajes, por lo que actualmente no se muestran al utilizar comandos como el monte en el shell. Pero funcionan como uno esperaría que lo hicieran. Por ejemplo, desde Windows, coloqué un archivo de texto llamado test.txt en la raíz de mi unidad C. Puedo acceder a él desde WSL de la siguiente manera:

Durante el Recorrido de compilación, queríamos asegurarnos de que todas las demostraciones funcionaran sin acceso a Internet (nunca se sabe cómo será la red de lugares). Así que para asegurarme de que la demostración de Bash / WSL funcionara para la parte de Git, y para demostrar el acceso a archivos de Windows en el PC local, configuré un repositorio local en C:gitNetHack en el PC con Windows. Para clonar que dentro de este servicio, he ejecutado los siguientes:

$ git clone file:///mnt/c/git/NetHack

la línea de comando dijo git para utilizar el protocolo file:// y clonar el repo que se encuentra en /mnt/c/git/NetHack. Puede acceder a todos sus archivos de Windows de una manera similar.

Advertencia: Al igual que con cualquier consola, puede modificar/eliminar archivos en su sistema de archivos de Windows desde Bash si no tiene cuidado. Por ejemplo, puede hacer algo como lo que se muestra a continuación y terminar borrando una buena parte de su instalación de Windows, suponiendo que la cuenta de Windows bajo la que está ejecutando tenga derechos para hacerlo:

$ rm -rf /mnt/c/ <fuerte></strong>

menciono esto porque los comandos en Linux son nuevos para muchos de nosotros, mientras que los comandos de la consola de Windows no lo son.

La magia que hace que esta integración del sistema de archivos suceda se llama DrvFs. Si desea obtener más información sobre el sistema de archivos y cómo funciona en WSL, el equipo de WSL preparó una excelente publicación de blog con todos los detalles.

Por supuesto, el acceso al sistema de archivos es solo una parte de la historia. Muchas tareas de desarrollo implican el acceso a recursos remotos a través de HTTP u otros protocolos de red.

Hacer solicitudes HTTP

A menudo es útil hacer una llamada REST u otra llamada HTTP (o FTP) desde un script o línea de comandos en lugar de desde un programa compilado o una página web. Al igual que la mayoría de las distribuciones de Linux, WSL incluye utilidades estándar como curl y wget para realizar llamadas HTTP y otras llamadas de red. Por ejemplo, aquí está el RESTO de la llamada a GitHub para obtener la información de mi perfil, usando curl:

Puede combinar esto con scripts de Bash para crear clientes de prueba rápida para API REST, o utilidades para hacer ping a páginas web en servidores e informar de estado. También es genial descargar un archivo de la web; simplemente puede redirigir la salida a un archivo en lugar de verlo en pantalla:

cur curl-i https://api.github.com/users/Psychlist1972> pete.json

También soy un usuario de PowerShell, e incluso he creado algunas extensiones interesantes para usar Windows 10 MIDI en PowerShell y también para corregir algunos daños en los archivos que estaban sucediendo a los usuarios de cierto hardware de grabación de sonido. Como desarrollador y fan de. NET desde hace mucho tiempo, seguiré usando y extendiendo PowerShell, ya que tiene sentido para mis proyectos. Pero PowerShell no es el entorno adecuado para ejecutar todas esas utilidades y ejemplos de código abierto centrados en Bash y Linux en la web hoy en día. Quiero usar la forma más fácil y sin fricción para realizar cualquier tarea, y a veces, eso significa hacerlo en Bash.

Apenas he arañado la superficie aquí en Bash, Bash scripting y las tareas que puedes realizar desde el shell. Hasta ahora, he estado hablando de trabajos de utilidad que son útiles pero auxiliares para el desarrollo. ¿Qué pasa con el desarrollo y compilación reales desde WSL? Lo demostré como parte de la Gira de Construcción.

Bash at the Build Tour-NetHack

A principios de este verano, oradores de Microsoft dieron la vuelta al mundo demostrando algunas de las nuevas y geniales características de desarrollo de Windows y la nube de Microsoft. Como parte de eso, queríamos demostrar el WSL de una manera divertida, pero también de una manera con la que los desarrolladores se relacionaran.

Personalmente quería mostrarlo usando git y algunas herramientas de desarrollo de consola tradicionales. Cuando escribí la demo de Bash, incluí lo básico («Hola Mundo» en Python y Ruby), pero quería mostrar algo un poco más fuera de lo común.

Pensé en mi tiempo en la universidad, cuando nos movíamos de un lado a otro entre Unix (DEC Ultrix y SunOS) y VAX / VMS. En ese momento, Unix era casi exclusivamente un primer entorno de línea de comandos. En mi escuela, la mayoría de los usuarios de X en el puñado de estaciones de trabajo de gráficos simplemente abrieron varias sesiones de terminal en diferentes ventanas, pero con un fondo de pantalla súper fresco de fase lunar en el fondo. La mayoría de los estudiantes usaban terminales VT-220 para sus sesiones (la escuela no estaba lejos de Boston, así que teníamos mucho equipo DEC).

En ese momento, había dos grandes juegos que todos los estudiantes de ciencias de la computación jugaban: MUDs (lpMUD y el nuevo DikuMUD en ese momento, principalmente) y NetHack. NetHack y otros Roguelikes han sido considerados como algunos de los juegos más influyentes de la historia, siendo los precursores de los muchos juegos de rastreo de mazmorras y juegos de rol que disfrutamos hoy en día.

NetHack tiene una larga historia y hoy en día contiene más de cien mil líneas de código *nix de décadas de antigüedad, así como adiciones modernas. El juego en sí utiliza maldiciones (o sus reemplazos) para la interacción terminal, requiere lex y yacc (o flex y bison) y cc (o gcc), y una gran cantidad de otras herramientas de desarrollo para construir.

Está escrito en C e incluye una serie de utilidades de configuración con scripts escritos para el shell de Bourne. Pensé que sería una prueba buena y divertida para ejercitar las capacidades de desarrollador de WSL y Bash en Windows 10. Debido al uso de curses (libncurses en Linux y WSL), también ayudaría a demostrar las capacidades de la emulación de terminal integrada en la ventana de la consola de Windows 10.

En su día, construir NetHack desde el origen llevó una eternidad en nuestro servidor Ultrix de tiempo limitado. Ahora toma un minuto en mi PC y todo está hecho. Me encanta el progreso. Hay formas fáciles y difíciles de configurar y compilar NetHack en Linux o WSL. Para ahorrarte algo de tiempo, te guiaré por el enfoque fácil.

Requisitos previos

En primer lugar, actualice su entorno WSL para asegurarse de que está apuntando al último catálogo de software y también tenga la instalación base actualizada. Por lo general, es una buena idea hacer esto antes de instalar nuevos paquetes.

update sudo apt update
Then sudo apt upgrade

A continuación, instale las herramientas esenciales para desarrolladores. La forma más fácil de hacerlo es usar el paquete esencial de compilación. Esto incluye casi todos los programas de consola que un desarrollador de Linux necesitaría para crear aplicaciones en C / C++.

build sudo apt install build-essential

Esto llevará unos minutos. Si desea ser más quirúrgico, puede instalar por separado gcc, gdb, make, flex, bison y las otras herramientas que se requieren en los documentos NetHack. Pero si eres un desarrollador, probablemente querrás las otras herramientas en algún momento. El paquete de construcción esencial elimina las conjeturas de la instalación del conjunto de herramientas.

A continuación, instale git. Como puedes imaginar, es tan fácil como:

sud sudo apt install git

Al igual que con Linux, puedes agregar un git PPA para obtener una versión más reciente, pero esta servirá para lo que estamos haciendo aquí.

Y finalmente, queremos tener maldiciones (ncurses, en realidad) instaladas para la interacción de la pantalla de la consola:

sud sudo apt install libncurses-dev

Una vez que haya completado esos pasos, estará listo para construir NetHack.

Construyendo NetHack

El repositorio oficial de NetHack está en GitHub. Primero, lo cogeremos y lo pondremos en una subcarpeta fuera de nuestro directorio personal.

cd cd ~
clone git clone http://github.com/NetHack/NetHack

Porque NetHack admite diferentes sistemas operativos, necesitará hacer alguna configuración básica para decirle que estamos usando Linux en la línea de comandos y sustituyendo herramientas libres y de código abierto por clásicos de Unix como gcc por cc.

Como he mencionado, hay varias maneras de hacer esto. Alguien fue lo suficientemente reflexivo como para encapsular gran parte de la configuración en un archivo de sugerencias. Confía en mí, usar el archivo de sugerencias te ahorrará horas de dolor de cabeza en la configuración en comparación con los pasos descritos en el repositorio de GitHub. No es obvio cómo usar las sugerencias si miras los archivos LÉAME u otra documentación, así que aquí tienes:

cd cd NetHack / sys / unix
/setup.sh hints / linux

Que configurará el makefile para usar las herramientas, bibliotecas y rutas adecuadas para Linux. Los scripts de instalación son scripts de shell no triviales que hacen mucha configuración; me complace informar que funcionan perfectamente en WSL. Si tienes curiosidad por los scripts de shell, asegúrate de abrirlos en tu editor favorito.

Luego, la compilación final:

cd cd ~ / NetHack
make make all

Después de la compilación, querrá crear la instalación. Se trata de copiar el ejecutable a una ubicación conocida:

make make install

Que luego te dejará con una carpeta llamada ~/nh. Nethack se encuentra en el directorio ~/nh/install/games y se llama simplemente nethack. Para ejecutarlo, vaya a ese directorio (o escriba la ruta completa) y escriba:

cd cd ~/nh/install/games
neth nethack

Una vez que lo haga, la pantalla se borrará y se le pedirá que comience a jugar a NetHack. Tenga en cuenta que todo lo que se hace aquí es tal como se haría en una instalación de Ubuntu Linux de vainilla; no se necesitaba nada específico de Windows.

Jugar a NetHack

Dadas las limitaciones de un juego de consola y la complejidad de NetHack, puede tomar un poco entrar en él. Decir que es un poco críptico al principio sería quedarse corto, pero nunca he conocido a un desarrollador que rehuyera un buen desafío.

Las teclas de navegación son las mismas que las utilizadas en VI (M), por lo que HJKL para Izquierda, Abajo, Arriba y Derecha respectivamente. Para salir, puedes encontrar las escaleras en el nivel superior y usarlas, o presionar Control-C para forzar la salida del juego.

En NetHack, eres el símbolo@. Cada nivel se compone de habitaciones, pasillos, puertas y escaleras de arriba a abajo. Los monstruos, tesoros y objetos se representan como varios personajes ASCII con los que te familiarizarás mientras juegas. Como es la norma con los Roguelikes, no hay salvación y solo obtienes una vida. Si mueres y juegas de nuevo, la mazmorra se vuelve a generar aleatoriamente y los objetos se revuelven.

El objetivo de NetHack es sobrevivir a las mazmorras, recoger oro y objetos y matar a tantos monstruos como puedas. Hay metas mucho más allá de eso, pero tendrás que jugar un rato (o leer) para descubrirlas. Las reglas siguen libremente Mazmorras & Reglas de dragones para armas, habilidades, etc.

Aquí hay una captura de pantalla de NetHack con tres habitaciones y dos pasillos visibles. Las escaleras arriba están en la habitación superior izquierda, y actualmente estoy en la habitación superior derecha, junto con algunos tesoros y otros artículos.

Si usted no tiene color en su versión, crear un archivo llamado ~/.nethackrc y ponga lo siguiente en él:

OPTIONS = color: true, dark_room: true, menucolors:true

A un lado: Si los gráficos de caracteres ASCII no son lo tuyo, pero te gusta el concepto, busca «roguelike» en Microsoft Store y disfruta de los juegos más visuales de este popular género.

Claro, NetHack es una base de código antigua, muy querida por aquellos de nosotros de cierta edad. Sin embargo, la creación de ti ejercita un número significativo de herramientas y características de desarrollo importantes de los sistemas operativos *nix, y también la emulación de terminales. Es genial ver que todo, desde gcc, gdb, make, bison y flex hasta git más moderno, funciona en WSL hoy en día.

Si desea ver la demostración anterior como se hizo en el Build Tour, vea esta presentación de the Build Tour Canada. La demostración de WSL comienza alrededor de las 6:20. (Y sí, es el subsistema de Windows para Linux, a pesar de lo que dije en ese video.)

https://channel9.msdn.com/Events/Build/Build-Tour-2016-Toronto/Keynote

¡Espero que disfrutéis de vuestra excursión a las mazmorras de NetHack!

C y C++ son geniales, al igual que todas estas herramientas de desarrollo clásicas. Incluso puedes hacer mucho con scripts Bash simples. Pero muchas tareas de desarrollo involucran lenguajes de scripting como Python.

Python

Puede encontrar ejemplos de scripts Python en toda la web, lo que implica que Python es popular y útil para muchos desarrolladores. La mayoría de esos ejemplos, por supuesto, asumen que está ejecutando Linux. En el pasado, esto significaba ejecutarlos en una instalación de Linux en otra máquina, una máquina virtual o una opción de arranque, o hacer los cambios necesarios para ejecutarlos utilizando las distribuciones de Windows de Python.

Estos no son problemas insuperables, pero en el día a día de un desarrollador, se suman pequeños trozos de fricción como este. Con WSL, siempre tendrá a su disposición un subsistema y un shell compatibles con Python, sin tener que salir de su zona.

Para instalar la última versión de desarrollo de Python y el instalador de paquetes de python «pip», ejecute lo siguiente en el símbolo del shell de Bash:

sud sudo apt install python-pip python-dev
Now sudo pip install –upgrade pip

Ahora que Python está instalado, quería mostrarle cómo puede tomar un ejemplo típico de Python de Linux de un sitio y trabajar con él directamente. Fui al sitio de recetas de Python de Activestate y elegí el mejor ejemplo de Python. Vale, mentí. El de arriba es para imprimir nombres de enteros, y eso no sonaba súper emocionante, así que elegí el segundo: Tetris. Me imaginé que todos ven suficiente Python práctico todos los días, así que voy a ir a otro juego.

Abrí nano, copié las 275 líneas de código Python directamente desde la página de mi navegador en Windows, las pegué en nano en la ventana de mi consola WSL, las guardé como tetris.py y luego simplemente ejecutado:

python python tetris.py

Que inmediatamente limpió la pantalla y sacó una aplicación básica de Tetris. Al igual que en el caso de NetHack, se utilizan las mismas teclas de movimiento VI estándar. (En los días anteriores al ratón y las teclas WASD para el movimiento, la mano derecha estaba en las teclas HJKL del teclado.)

Como ya he mencionado, por supuesto, usted puede ejecutar Python en Windows sin servicio de ENVÍO de mensajes. Sin embargo, para utilidades y muestras rápidas, poder ejecutar un ejemplo de Python de Linux sin cambios simplemente pegando código de una fuente conocida es un gran impulso de productividad para los desarrolladores.

Ese es el punto, en realidad. No se trata de reemplazar otras herramientas nativas de Windows como Python, PowerShell, C# y más. Se trata de eliminar la fricción cuando solo necesita hacer las cosas de manera rápida y eficiente en un flujo de trabajo de desarrollo moderno.

Entre Bash, Python y todas las herramientas nativas de desarrollo de Linux de línea de comandos, WSL cubre mis necesidades de flujo de trabajo de Linux. No es un servidor Linux ni un cliente Linux completo. En cambio, es exactamente lo que necesito para reducir la fricción del día a día y hacer que el desarrollo en Windows sea aún más productivo y agradable.

Restablecer su entorno WSL

Siéntase libre de experimentar. Si daña su instalación de WSL, es bastante fácil de reinstalar. Asegúrese de guardar copias de cualquier cosa importante.

C:> lxrun.exe / uninstall / full
C:> lxrun.exe / install

¿Cómo está utilizando Bash y el WSL?

Esperamos que tener WSL, y Bash en particular, en Windows 10 le ayude a ser un poco más eficiente y elimine un poco de fricción de sus tareas de desarrollo diarias.

¿Cómo está utilizando el WSL en Windows 10? ¿Cómo te gustaría usarlo?

El equipo está haciendo mucho trabajo para garantizar que WSL sea una gran herramienta de consola para desarrolladores. Si tienes comentarios o tienes problemas, te recomendamos que revises la página de problemas de GitHub, así como el sitio de comentarios y votaciones de UserVoice. Realmente nos gustaría saber de ti.

Referencias adicionales y lecturas adicionales

Los scripts de shell de Linux son un tema enorme y hay muchos tutoriales geniales en la web. Si aún no estás familiarizado con él y quieres aprender más, la mayoría de los tutoriales de Bash funcionarán para ti. Aquí hay una para empezar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *