Experiencia en la configuración y uso de WSL (subsistema de Linux en Windows 10)

Me pidieron que escribiera este artículo por una pregunta sobre la tostadora relacionada con WSL. Yo, después de varios años de usar sistemas en el kernel de Linux, hace unos seis meses, cambié a usar Windows 10 en una PC hogareña. La dependencia del entorno de terminal y Linux en mi trabajo casi inmediatamente me llevó a la pregunta: instalar una máquina virtual o probar WSL. Elegí el segundo y quedé completamente satisfecho.


Debajo de cat, le diré cómo instalar y configurar WSL, qué problemas y limitaciones me encontré, cómo ejecutar aplicaciones Linux desde Windows y viceversa, así como cómo integrar elementos del entorno Xfce en el entorno de escritorio de Windows.



Nunca pensé que volvería a Windows algún día, pero una combinación de circunstancias me dio una razón para intentarlo: mi esposa, lejos de TI, tiraba casi cada vez que necesitaba usar una computadora; despertó la nostalgia por un juego, pero ella no quería trabajar adecuadamente bajo el vino; y luego me dieron un Windows 10 Pro en caja. Instalé WSL casi inmediatamente después de instalar el sistema, jugué durante varias noches, me di cuenta de que el producto es adecuado para mis tareas, pero quiero un terminal más familiar y, en general, algunas comodidades.


Instalar WSL y distribución


Haga una reserva inmediatamente, en Internet puede encontrar una descripción de la instalación ejecutando el lxrun /install en la línea de comandos o en la consola de PowerShell. Este método ya no funciona (después del lanzamiento de WSL en una versión estable). Hasta donde yo sé, ahora WSL solo se puede instalar desde Microsoft Store junto con su distribución preferida.


También noté que cuando hice la instalación, las distribuciones OpenSUSE, SUSE Linux Enterprise y Ubuntu 16.04 estaban disponibles para elegir, la última que instalé. Ubuntu 18.04, Debian 9 y Kali Linux también están disponibles ahora, y pueden aparecer otras distribuciones. Los pasos de instalación pueden variar. Además, algunos de los problemas descritos en el artículo pueden estar solucionados.


Encontramos la distribución deseada en la tienda y la instalamos. La instalación será rápida, ya que solo descargará el emulador del kernel de Linux y la utilidad para iniciar el subsistema, que estará en la carpeta del sistema en tres instancias: wsl.exe, bash.exe y ubuntu.exe (en lugar de ubuntu habrá el nombre de su kit de distribución). Todos ellos son equivalentes y hacen lo mismo: ejecutan su propio emulador de terminal, en él linux'ovy bash trabajando bajo el emulador de kernel. En el primer inicio, se nos pedirá que proporcionemos un nombre de usuario y contraseña predeterminados para el usuario, y luego la distribución se instalará directamente. Como usuario predeterminado, especifique la raíz sin una contraseña; esto será necesario para otros pasos. La seguridad no se verá afectada, además, al preparar los materiales para el artículo, en el tutorial en inglés, encontré información de que las nuevas versiones de WSL ahora hacen que el usuario raíz predeterminado sin una contraseña sin preguntas innecesarias.


Estamos esperando la instalación. A continuación, lo primero es actualizar los espejos apt para el siguiente. Para hacer esto, necesita un editor de texto CLI. Solo se incluye vi, pero prefiero nano más, así que lo pongo:


 apt install nano 

no se requiere sudo, ya que somos root. Edite el archivo /etc/apt/sources.list:


 nano /etc/apt/sources.list 

Los espejos Yandex funcionan mejor para mí, por lo que mi archivo se ve así:


 deb http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted 

Presione Ctrl + O para guardar y Ctrl + X para salir. Ahora puede actualizar el sistema al estado actual:


 apt update && apt upgrade 

Después de la actualización, puede crear nuestro usuario principal. En este artículo lo llamaré usuario1, pero puede especificar el nombre habitual:


 addgroup --gid 1000 user1 adduser --home /home/user1 --shell /bin/bash --uid 1000 -G user1,sudo user1 

A continuación, vaya a la carpeta del usuario, vaya debajo de ella, establezca una contraseña y edite el archivo ~ / .bashrc:


 cd /home/user1 su user1 passwd nano .bashrc 

Mi .bashrc básico se ve así
 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth # append to the history file, don't overwrite it shopt -s histappend # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000 # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize # If set, the pattern "**" used in a pathname expansion context will # match all files and zero or more directories and subdirectories. #shopt -s globstar # make less more friendly for non-text input files, see lesspipe(1) [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # set variable identifying the chroot you work in (used in the prompt below) if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm|xterm-color|*-256color) color_prompt=yes;; esac # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi if [ "$color_prompt" = yes ]; then if [[ ${EUID} == 0 ]] ; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] ' else PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\] ' fi else PS1='${debian_chroot:+($debian_chroot)}\u@\h \w \$ ' fi unset color_prompt force_color_prompt # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h \w\a\]$PS1" ;; *) ;; esac # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' fi # colored GCC warnings and errors #export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' # some more ls aliases alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' # Add an "alert" alias for long running commands. Use like so: # sleep 10; alert alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' # Alias definitions. # You may want to put all your additions into a separate file like # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi # enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi 

Todo, el subsistema está listo para usar ... casi ...


Instalación de X Server, Xfce y otras aplicaciones GUI


El primer problema que encontré fue que la finalización de bash en el emulador de terminal propuesto funcionó, por decirlo suavemente, incorrectamente. Además, este emulador no sabe cómo usar las pestañas, y cada instancia de él inicia todo en un nuevo espacio de proceso, con un init por separado (que, por cierto, no se puede reemplazar). Quería un emulador de terminal normal, algunas otras aplicaciones GUI, así como un socket para iniciarlo todo rápidamente.


Cuando busqué en Google esta pregunta, me encontré con muchos problemas, como la necesidad de traducir dbus al protocolo tcp. Por el momento, no hay tales problemas. Los sockets de dominio Unix funcionan normalmente en el subsistema y todo se comunica tranquilamente a través de ellos.


En primer lugar, necesitamos un servidor X, además, instalado en el sistema principal (en Windows). Personalmente, uso VcXsrv para este propósito: el puerto X11 en Windows. El sitio oficial especificado en acerca de la utilidad en sí no lo proporciona ahora, por lo tanto, buscamos en Google el instalador e instalamos todo de forma predeterminada.


Mientras la instalación está en progreso, volvemos al terminal WSL, con el comando de salida salimos de nuevo a la raíz. Primero, configure las configuraciones regionales rusas:


 locale-gen ru_RU locale-gen ru_RU.UTF-8 update-locale 

A continuación, instale algunos componentes de Xfce. Por supuesto, puede instalarlo completamente desde el metapaquete, pero no necesitaremos la mayoría de los componentes, y la arquitectura modular de Xfce nos permite suministrar solo lo necesario:


 apt install -y xfce4-session xfce4-notifyd xfce4-appfinder xfce4-panel xfce4-quicklauncher-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfce4-settings xfce4-terminal xfce4-taskmanager mousepad 

No es muy conveniente ejecutar el entorno con sus manos cada vez, así que automaticé este proceso. Para hacer esto, en el sistema principal, cree una carpeta en un lugar conveniente para nosotros, y en ella 3 archivos para ejecutar:


  1. config.xlaunch : archivo de configuración para VcXsrv
     <?xml version="1.0" encoding="UTF-8"?> <XLaunch WindowMode="MultiWindow" ClientMode="NoClient" LocalClient="False" Display="0" LocalProgram="xcalc" RemoteProgram="xterm" RemotePassword="" PrivateKey="" RemoteHost="" RemoteUser="" XDMCPHost="" XDMCPBroadcast="False" XDMCPIndirect="False" Clipboard="True" ClipboardPrimary="True" ExtraParams="" Wgl="True" DisableAC="False" XDMCPTerminate="False" /> 
  2. x-run.vbs : WSL siempre comienza con su emulador de terminal; si lo cierra, todos sus procesos secundarios finalizarán. Para que esta ventana no tenga ojos insensibles, es bueno ejecutarla oculta. Afortunadamente, Windows tiene un intérprete de VBScript incorporado que le permite hacer esto en una línea:


     WScript.CreateObject("Shell.Application").ShellExecute "wsl", "cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session", "", "open", 0 

    Déjame explicarte lo que está sucediendo aquí. Le decimos a VBscript que ejecute la aplicación wsl con el cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session , la carpeta de inicio no es importante para nosotros, por lo tanto, una línea vacía, la acción abierta es el inicio, 0 es el modo oculto. Emitimos el comando wsl en sí: vaya a la carpeta del usuario, luego con la configuración de las variables de entorno DISPLAY (pantalla del servidor X) y LANG (configuración regional utilizada) ejecutamos xfce4-session en nombre de nuestro usuario usuario1 (gracias al comando su)


  3. start.bat - archivo por lotes para ejecutar, opcionalmente puede ponerlo en inicio
     start config.xlaunch wscript x-run.vbs 

Luego, podemos ejecutar nuestro start.bat y configurar el panel Xfce para nosotros. Observo que aquí me encontré con un problema más: el panel se muestra perfectamente en la parte superior de todas las ventanas, pero no puede asignar un lugar para sí mismo como un panel en el escritorio de Windows. Si alguien conoce una solución a este problema, comparta en los comentarios.


Bueno, al final de esta parte, una captura de pantalla de mi escritorio:



La interacción del entorno de Windows y el entorno del subsistema de Linux


Puede ejecutar aplicaciones de Linux directamente desde Windows a través de los mismos 3 comandos: bash, wsl o ubuntu. No olvide que, de forma predeterminada, el inicio es desde la raíz, por lo que debe reducir los privilegios a través de su , también debe recordar pasar la variable de entorno DISPLAY =: 0 si la aplicación requiere un servidor X. También debe cambiar la carpeta desde la cual la aplicación debería funcionar a través de cd dentro de WSL. Ejemplo, calculemos md5 para file.txt en el disco D usando Linux md5sum:


 wsl md5sum < d:\file.txt 

El acceso al sistema de archivos de Linux también está disponible, se encuentra en %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs . Puede leer archivos de esta manera, pero escribirlo no es aconsejable; puede romper el sistema de archivos. Creo que el problema es que Windows no puede trabajar con los derechos y los propietarios del sistema de archivos Linux.


Desde Linux, también puede ejecutar aplicaciones de Windows. Simplemente ejecute el exe-shnik y se ejecutará en el sistema principal.


Las unidades de Windows se montan en /mnt según sus letras minúsculas. Por ejemplo, la unidad D se montará en /mnt/d . Desde Linux, puede leer y escribir libremente archivos de Windows. Puedes hacer enlaces simbólicos en ellos. Los derechos de dichos archivos siempre serán 0777, y el propietario será root.


La pila de red del subsistema es común con Windows. El servidor generado en Linux estará disponible en localhost en Windows y viceversa. Sin embargo, unix-domain-socket para Windows será solo un archivo vacío, puede trabajar con esto solo dentro de Linux. Linux también tiene acceso a la red externa, incluida la escucha de puertos, si el firewall no lo prohíbe.
ifconfig en Linux e ipconfig en Windows proporcionan la misma información sobre las interfaces de red.


Desde el administrador de tareas de Windows, puede vencer de manera segura el proceso dentro del subsistema Linux. Sin embargo, Linux solo verá sus procesos.


Características, limitaciones y dificultades.


El kernel de Linux en WSL no es real. Esta es solo una capa de emulador, que parte de las tareas específicas de Linux se realiza sola, y parte proxies directamente al kernel winNT. La mayor parte de la API se implementa en ella, pero no todas. No podrá ensamblar su kernel, ni podrá conectar los módulos del kernel (.ko, Kernel Object).


El proceso de inicio de WSL también es propio y reemplazarlo, por ejemplo, con system.d no funcionará. Durante mucho tiempo tuve el deseo de escribir un administrador de demonios sobre la marcha que funcionara con los archivos de la unidad system.d y proporcionara una interfaz similar, pero todas las manos no llegan.


No hay soporte para openFUSE; en consecuencia, el montaje de un sistema de archivos virtual o remoto fallará. También es imposible hacer el montaje desde un archivo, el montaje no parece ser capaz de hacer nada excepto enlazar aquí.


Tampoco hay forma de particionar un sistema de archivos Linux en varias particiones / discos.


El acceso directo al hierro está prácticamente ausente. De todos modos, estamos en el entorno limitado de Windows, y no en Linux completo. / dev y / sys están notablemente vacíos, solo contienen dispositivos virtuales. Acceda a la GPU, solo a través del servidor X, directamente, de cualquier manera, por lo que tendrá que entrenar redes neuronales en Windows.


En el desarrollo de JS, encontré el hecho de que electron.js se negó a ejecutarse en WSL, tuve que duplicar el entorno node.js en Windows.


Resumen


El artículo resultó ser bastante largo, espero que también sea útil.
WSL para mí personalmente resultó ser una herramienta completamente utilizable que resuelve mis problemas fullstack desarrollador de backend. Durante seis meses, no se necesitó una máquina virtual con Linux. La sensación general es que Windows + WSL es mucho más funcional que Linux + Wine.


Mientras escribía un artículo, descubrí que el ensamblaje WSL con Debian 9.3 apareció en la Tienda Microsoft, esta distribución es más bonita para mí que Ubuntu, así que intentaré instalarlo.

Source: https://habr.com/ru/post/es412633/


All Articles