Experiência em configurar e usar o WSL (subsistema Linux no Windows 10)

Fui solicitado a escrever este artigo com uma pergunta no Toaster relacionada à WSL. Após vários anos de uso de sistemas no kernel Linux, há cerca de seis meses, mudei para o Windows 10 em um PC doméstico. A dependência do ambiente do terminal e do Linux no meu trabalho quase imediatamente me levou à pergunta: instalar uma máquina virtual ou tentar o WSL. Eu escolhi o segundo e fiquei completamente satisfeito.


Sob o ponto de vista geral, mostrarei como instalar e configurar o WSL, quais problemas e limitações me deparei, como executar aplicativos Linux no Windows e vice-versa, além de como integrar elementos do ambiente Xfce no ambiente de área de trabalho do Windows.



Eu nunca pensei que voltaria ao Windows um dia, mas uma combinação de circunstâncias me deu um motivo para tentar: minha esposa, que estava longe da área de TI, puxava quase toda vez que precisava usar um computador; acordou a nostalgia de um jogo, mas ela não queria trabalhar adequadamente com vinho; e então eles me deram um Windows 10 Pro in a box. Instalei o WSL quase imediatamente após a instalação do sistema, trabalhei por várias noites, percebi que o produto é adequado para minhas tarefas, mas quero um terminal mais familiar e geralmente algumas comodidades.


Instalar WSL e distribuição


Faça uma reserva imediatamente, na Internet, você pode encontrar uma descrição da instalação executando o comando lxrun /install na linha de comando ou no console do PowerShell. Esse método não funciona mais (após o lançamento do WSL em um lançamento estável). Até onde eu sei, agora o WSL só pode ser instalado a partir da Microsoft Store junto com sua distribuição preferida.


Também observo que, quando eu fiz a instalação, as distribuições do OpenSUSE, SUSE Linux Enterprise e Ubuntu 16.04 estavam disponíveis para escolha - a última que eu instalei. O Ubuntu 18.04, Debian 9 e Kali Linux também estão disponíveis agora, e outras distribuições podem aparecer. As etapas de instalação podem variar. Além disso, alguns dos problemas descritos no artigo já podem ser corrigidos.


Nós encontramos a distribuição desejada na loja e a instalamos. A instalação será rápida, pois só fará o download do emulador e utilitário do kernel do Linux para iniciar o subsistema, que estará na pasta do sistema em três instâncias: wsl.exe, bash.exe e ubuntu.exe (em vez do ubuntu, haverá o nome do seu kit de distribuição). Todos eles são equivalentes e fazem a mesma coisa - eles executam seu próprio emulador de terminal, no linux'ovy bash trabalhando sob o emulador de kernel. No primeiro início, seremos solicitados a fornecer um nome de usuário e senha padrão para o usuário e, depois disso, a distribuição será instalada diretamente. Como usuário padrão, especifique root sem uma senha - isso será necessário para outras etapas. A segurança não será afetada. Além disso, ao preparar os materiais para o artigo, no tutorial em inglês, encontrei informações de que novas versões do WSL agora tornam o usuário raiz padrão sem senha e sem perguntas desnecessárias.


Estamos aguardando a instalação. Em seguida, a primeira coisa é atualizar os espelhos do apt para a próxima. Para fazer isso, você precisa de um editor de texto da CLI. Somente o vi está incluído, mas eu prefiro mais o nano, então eu coloco:


 apt install nano 

O sudo não é necessário, pois já somos root. Edite o arquivo /etc/apt/sources.list:


 nano /etc/apt/sources.list 

Os espelhos Yandex funcionam melhor para mim, então meu arquivo fica assim:


 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 

Pressione Ctrl + O para salvar e Ctrl + X para sair. Agora você pode atualizar o sistema para o estado atual:


 apt update && apt upgrade 

Após a atualização, você pode criar nosso usuário principal. Neste artigo, chamarei usuário1, mas você pode especificar o nome usual:


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

Em seguida, vá para a pasta do usuário, abaixo dela, defina uma senha e edite o arquivo ~ / .bashrc:


 cd /home/user1 su user1 passwd nano .bashrc 

Meu .bashrc básico fica assim
 # 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 

Tudo, o subsistema está pronto para uso ... quase ...


Instalando o X Server, o Xfce e outros aplicativos da GUI


O primeiro problema que encontrei - a conclusão do bash no emulador de terminal proposto funcionou, para dizer o mínimo e o incorretamente. Além disso, este emulador não sabe como usar guias, e cada instância dele inicia tudo em um novo espaço de processo, com um init separado (que, a propósito, não pode ser substituído). Eu queria um emulador de terminal normal, alguns outros aplicativos da interface gráfica do usuário e um soquete para iniciar tudo rapidamente.


Quando pesquisei essa questão, encontrei muitos problemas, como a necessidade de converter o dbus no protocolo tcp. No momento, não existem tais problemas. Os soquetes de domínio Unix funcionam normalmente no subsistema e tudo se comunica calmamente através deles.


Antes de tudo, precisamos de um servidor X, além disso, instalado no sistema principal (no Windows). Pessoalmente, uso o VcXsrv para esse fim - a porta X11 no Windows. O site oficial especificado em aproximadamente sobre o utilitário em si não o fornece agora; portanto, pesquisamos no instalador no Google e instalamos tudo por padrão.


Enquanto a instalação estiver em andamento, retornamos ao terminal WSL, com o comando exit voltamos ao root. Primeiro, configure os códigos de idioma russos:


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

Em seguida, instale alguns componentes do Xfce. Obviamente, você pode instalá-lo totalmente a partir do meta-pacote, mas não precisaremos da maioria dos componentes, e a arquitetura modular do Xfce nos permite fornecer apenas o necessário:


 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 

Não é muito conveniente executar o ambiente com as mãos toda vez, então automatizei esse processo. Para fazer isso, no sistema principal, crie uma pasta em um local conveniente para nós e nele três arquivos sejam executados:


  1. config.xlaunch - arquivo de configurações 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 - O WSL sempre começa com seu emulador de terminal; se você fechá-lo, todos os seus processos filhos serão encerrados. Para que esta janela não tenha olhos insensíveis, é bom executá-la oculta. Felizmente, o Windows possui um intérprete VBScript interno que permite fazer isso em uma linha:


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

    Deixe-me explicar o que está acontecendo aqui. Dizemos ao VBscript para executar o aplicativo wsl com o 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 , a pasta inicial não é importante para nós, portanto a linha vazia, a ação aberta - iniciar, 0 - modo oculto. Nós damos ao próprio wsl o comando para executar: vá para a pasta do usuário e, com a configuração das variáveis ​​de ambiente DISPLAY (exibição do servidor X) e LANG (localidade usada), executamos xfce4-session em nome do usuário1 do usuário (graças ao comando su)


  3. start.bat - arquivo em lote a ser executado, opcionalmente, você pode colocá-lo em inicialização
     start config.xlaunch wscript x-run.vbs 

Em seguida, podemos executar o start.bat e configurar o painel do Xfce para nós mesmos. Observo que aqui me deparei com mais um problema - o painel é perfeitamente exibido no topo de todas as janelas, mas não pode alocar um local para si como um painel na área de trabalho do Windows. Se alguém souber uma solução para esse problema, compartilhe nos comentários.


Bem, no final desta parte, uma captura de tela da minha área de trabalho:



A interação do ambiente Windows e o ambiente do subsistema Linux


Você pode executar aplicativos Linux diretamente do Windows através dos mesmos três comandos - bash, wsl ou ubuntu. Não se esqueça que, por padrão, o lançamento é a partir da raiz; portanto, você deve diminuir os privilégios por meio do su ; lembre-se também de passar a variável de ambiente DISPLAY =: 0 se o aplicativo exigir um servidor X. Você também precisa alterar a pasta da qual o aplicativo deve trabalhar através do CD dentro da WSL. Exemplo, vamos calcular md5 para file.txt no disco D usando o Linux md5sum:


 wsl md5sum < d:\file.txt 

O acesso ao sistema de arquivos Linux também está disponível, está em %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs . Você pode ler os arquivos dessa maneira, mas não é aconselhável gravá-los; você pode interromper o sistema de arquivos. Acho que o problema é que o Windows não pode trabalhar com os direitos e proprietários do sistema de arquivos Linux.


No Linux, você também pode executar aplicativos do Windows. Basta executar o exe-shnik e ele será executado no sistema principal.


As unidades do Windows são montadas em /mnt acordo com as letras minúsculas. Por exemplo, a unidade D será montada em /mnt/d . No Linux, você pode ler e gravar livremente arquivos do Windows. Você pode criar links simbólicos neles. Os direitos de tais arquivos sempre serão 0777 e o proprietário será o root.


A pilha de rede do subsistema é comum no Windows. O servidor criado no Linux estará disponível no host local no Windows e vice-versa. No entanto, o soquete de domínio unix para Windows será apenas um arquivo vazio; você pode trabalhar com isso apenas no Linux. O Linux também tem acesso à rede externa, incluindo a escuta de portas, se o firewall não proibir isso.
O ifconfig no Linux e o ipconfig no Windows fornecem as mesmas informações sobre interfaces de rede.


No gerenciador de tarefas do Windows, você pode vencer com segurança o processo dentro do subsistema Linux. No entanto, o Linux verá apenas seus processos.


Características, limitações e armadilhas


O kernel do Linux na WSL não é real. Essa é apenas uma camada de emulador, que parte das tarefas específicas do Linux se desempenha e parte dos proxies diretamente no kernel do winNT. A maior parte da API é implementada nela, mas não todas. Você não poderá montar seu kernel, nem conectar os módulos do kernel (.ko, Kernel Object).


O processo de inicialização da WSL também é próprio e substituí-lo, por exemplo, por system.d não funcionará. Há muito que eu desejo escrever um gerenciador de daemon em movimento que funcione com os arquivos da unidade system.d e forneça uma interface semelhante, mas todas as mãos não alcançam.


Não há suporte para o openFUSE; portanto, a montagem de um sistema de arquivos virtual ou remoto falhará. Também é impossível criar mount a partir de um arquivo, o mount não parece capaz de fazer nada, exceto ligar aqui.


Também não há como particionar um sistema de arquivos Linux em várias partições / discos.


O acesso direto ao ferro está praticamente ausente. Mesmo assim, estamos na caixa de proteção do Windows e não no Linux completo. / dev e / sys estão visivelmente vazios, eles contêm apenas dispositivos virtuais. Acesso à GPU - somente através do servidor X, diretamente - de qualquer forma, para que você tenha que treinar redes neurais no Windows.


No desenvolvimento do JS, descobri que o electron.js se recusava a executar no WSL, tive que duplicar o ambiente node.js no Windows.


Sumário


O artigo acabou sendo bastante longo, espero que também seja útil.
A WSL para mim, pessoalmente, acabou sendo uma ferramenta completamente utilizável que resolve meus problemas fullstack desenvolvedor de back-end. Por seis meses, uma máquina virtual com Linux não foi necessária. O sentimento geral é que o Windows + WSL é muito mais funcional que o Linux + Wine.


Enquanto escrevia um artigo, descobri que o assembly WSL com o Debian 9.3 apareceu na Microsoft Store, essa distribuição é mais bonita para mim do que o Ubuntu, então tentarei instalá-lo.

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


All Articles