Pengalaman mengkonfigurasi dan menggunakan WSL (Linux subsystem di Windows 10)

Saya diminta untuk menulis artikel ini dengan pertanyaan tentang Toaster terkait dengan WSL. Saya, setelah beberapa tahun menggunakan sistem pada kernel Linux, sekitar enam bulan yang lalu, beralih menggunakan Windows 10 pada PC rumahan. Ketergantungan pada lingkungan terminal dan Linux dalam pekerjaan saya hampir segera membawa saya ke pertanyaan: apakah menginstal mesin virtual atau mencoba WSL. Saya memilih yang kedua, dan benar-benar puas.


Di bawah cat, saya akan memberi tahu Anda cara menginstal dan mengkonfigurasi WSL, masalah dan batasan apa yang saya temui, cara menjalankan aplikasi Linux dari Windows dan sebaliknya, serta bagaimana mengintegrasikan elemen lingkungan Xfce ke lingkungan desktop Windows.



Saya tidak pernah berpikir bahwa saya akan kembali ke Windows suatu hari, tetapi kombinasi keadaan memberi saya alasan untuk mencoba: istri saya, jauh dari IT, menarik hampir setiap kali dia perlu menggunakan komputer; bangun nostalgia untuk satu pertandingan, tetapi dia tidak ingin bekerja secara memadai di bawah anggur; dan kemudian mereka memberi saya kotak Windows 10 Pro. Saya menginstal WSL segera setelah menginstal sistem, bermain-main untuk beberapa malam, saya menyadari bahwa produk ini cocok untuk tugas-tugas saya, tetapi saya ingin terminal yang lebih akrab dan umumnya beberapa fasilitas.


Instal WSL dan distribusinya


Segera melakukan reservasi, di Internet Anda dapat menemukan deskripsi instalasi dengan menjalankan perintah lxrun /install pada baris perintah atau konsol PowerShell. Metode ini tidak lagi berfungsi (setelah rilis WSL dalam rilis stabil). Sejauh yang saya tahu, sekarang WSL hanya dapat diinstal dari Microsoft Store bersama dengan distribusi pilihan Anda.


Saya juga mencatat bahwa ketika saya melakukan instalasi, distribusi OpenSUSE, SUSE Linux Enterprise, dan Ubuntu 16.04 tersedia untuk dipilih - yang terakhir saya instal. Ubuntu 18.04, Debian 9 dan Kali Linux juga tersedia sekarang, dan distribusi lainnya dapat muncul. Langkah-langkah instalasi dapat bervariasi. Selain itu, beberapa masalah yang dijelaskan dalam artikel ini mungkin sudah diperbaiki.


Kami menemukan distribusi yang diinginkan di toko dan menginstalnya. Instalasi akan cepat, karena itu hanya akan mengunduh emulator kernel Linux dan utilitas untuk meluncurkan subsistem, yang akan berada di folder sistem dalam tiga contoh: wsl.exe, bash.exe dan ubuntu.exe (bukan ubuntu akan ada nama kit distribusi Anda). Semuanya setara dan melakukan hal yang sama - mereka menjalankan emulator terminal sendiri, di dalamnya linux'ovy bash bekerja di bawah emulator kernel. Pada awal pertama, kita akan diminta untuk membuat nama pengguna dan kata sandi default untuk pengguna, dan setelah itu distribusi akan diinstal secara langsung. Sebagai pengguna default, tentukan root tanpa kata sandi - ini akan diperlukan untuk langkah selanjutnya. Keamanan tidak akan terpengaruh, di samping itu, ketika menyiapkan bahan untuk artikel, dalam tutorial berbahasa Inggris, saya menemukan informasi bahwa versi baru WSL sekarang membuat pengguna root default tanpa kata sandi tanpa pertanyaan yang tidak perlu.


Kami sedang menunggu instalasi. Selanjutnya, hal pertama adalah memperbarui mirror apt untuk selanjutnya. Untuk melakukan ini, Anda memerlukan editor teks CLI. Hanya vi yang disertakan, tapi saya lebih suka nano, jadi saya katakan:


 apt install nano 

sudo tidak diperlukan, karena kita sudah root. Edit file /etc/apt/sources.list:


 nano /etc/apt/sources.list 

Mirror Yandex paling cocok untuk saya, jadi file saya terlihat seperti ini:


 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 

Tekan Ctrl + O untuk menyimpan dan Ctrl + X untuk keluar. Sekarang Anda dapat memperbarui sistem ke kondisi saat ini:


 apt update && apt upgrade 

Setelah pembaruan, Anda dapat membuat pengguna utama kami. Pada artikel ini saya akan menyebutnya user1, tetapi Anda dapat menentukan nama yang biasa:


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

Selanjutnya, buka folder pengguna, buka di bawahnya, setel kata sandi dan edit file ~ / .bashrc:


 cd /home/user1 su user1 passwd nano .bashrc 

Bashrc dasar saya terlihat seperti ini
 # 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 

Semuanya, subsistem siap digunakan ... hampir ...


Menginstal X Server, Xfce, dan Aplikasi GUI Lainnya


Masalah pertama yang saya temui - bash-completion di emulator terminal yang diusulkan bekerja, untuk membuatnya lebih ringan, salah. Selain itu, emulator ini tidak tahu cara menggunakan tab, dan setiap instance memulai segala sesuatu dalam ruang proses baru, dengan init terpisah (yang, omong-omong, tidak dapat diganti). Saya ingin emulator terminal normal, beberapa aplikasi GUI lainnya, serta soket untuk memulai semuanya dengan cepat.


Ketika saya mencari pertanyaan ini di Google, saya menemukan banyak masalah, seperti kebutuhan untuk menerjemahkan dbus ke protokol tcp. Saat ini, tidak ada masalah seperti itu. Unix-domain-sockets bekerja secara normal di subsistem dan semuanya berkomunikasi dengan tenang melalui mereka.


Pertama-tama, kita perlu X-server, apalagi, diinstal di sistem utama (di Windows). Secara pribadi, saya menggunakan VcXsrv untuk tujuan ini - port X11 pada Windows. Situs resmi yang ditentukan dalam tentang utilitas itu sendiri tidak menyediakannya sekarang, oleh karena itu kami memasang google installer dan menginstal semuanya secara default.


Ketika instalasi sedang berlangsung, kami kembali ke terminal WSL, dengan perintah keluar kami keluar kembali ke root. Pertama, konfigurasikan lokal Rusia:


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

Selanjutnya, instal beberapa komponen Xfce. Tentu saja, Anda dapat menginstalnya sepenuhnya dari paket-meta, tetapi kita tidak akan memerlukan sebagian besar komponen, dan arsitektur modular Xfce memungkinkan kita untuk memasok hanya yang diperlukan:


 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 

Sangat tidak nyaman menjalankan lingkungan dengan tangan Anda setiap kali, jadi saya mengotomatiskan proses ini. Untuk melakukan ini, di sistem utama, buat folder di tempat yang nyaman bagi kami, dan di dalamnya 3 file untuk dijalankan:


  1. config.xlaunch - file pengaturan untuk 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 selalu dimulai dengan emulator terminalnya, jika Anda menutupnya, semua proses turunannya akan berakhir. Agar jendela ini tidak berperasaan mata, ada baiknya menjalankannya tersembunyi. Untungnya, Windows memiliki interpreter VBScript bawaan yang memungkinkan Anda melakukan ini dalam satu baris:


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

    Izinkan saya menjelaskan apa yang terjadi di sini. Kami memberi tahu VBscript untuk menjalankan aplikasi wsl dengan 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 , folder awal tidak penting bagi kami, jadi baris kosong, tindakan terbuka - mulai, 0 - mode tersembunyi. Kami memberikan wsl sendiri perintah untuk dieksekusi: buka folder pengguna, kemudian dengan pengaturan variabel lingkungan DISPLAY (tampilan server X) dan LANG (digunakan lokal) kami menjalankan sesi xfce4 atas nama pengguna pengguna kami1 (berkat perintah su)


  3. start.bat - file batch untuk dijalankan, opsional Anda dapat memasukkannya ke startup
     start config.xlaunch wscript x-run.vbs 

Selanjutnya, kita dapat menjalankan start.bat dan mengkonfigurasi panel Xfce untuk diri kita sendiri. Saya perhatikan bahwa di sini saya menemukan satu masalah lagi - panel ditampilkan dengan sempurna di atas semua jendela, tetapi tidak dapat mengalokasikan tempat untuk dirinya sendiri seperti panel di desktop Windows. Jika ada yang tahu solusi untuk masalah ini, bagikan di komentar.


Nah, di akhir bagian ini, tangkapan layar desktop saya:



Interaksi lingkungan Windows dan lingkungan subsistem Linux


Anda dapat menjalankan aplikasi Linux langsung dari Windows melalui 3 perintah yang sama - bash, wsl atau ubuntu. Jangan lupa bahwa secara default peluncurannya adalah dari root, jadi Anda harus menurunkan privilege melalui su , Anda juga harus ingat untuk melewati variabel lingkungan DISPLAY =: 0 jika aplikasi memerlukan server X. Anda juga perlu mengubah folder dari mana aplikasi harus bekerja melalui cd di dalam WSL. Contoh, mari kita hitung md5 untuk file.txt pada disk D menggunakan Linux md5sum:


 wsl md5sum < d:\file.txt 

Akses ke sistem file Linux juga tersedia, terletak di %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs . Anda dapat membaca file dengan cara ini, tetapi menulisnya tidak disarankan, Anda dapat merusak sistem file. Saya pikir masalahnya adalah bahwa Windows tidak dapat bekerja dengan hak dan pemilik sistem file Linux.


Dari Linux, Anda juga dapat menjalankan aplikasi Windows. Jalankan saja exe-shnik dan itu akan dieksekusi di sistem utama.


Drive Windows dipasang di /mnt menurut huruf kecilnya. Misalnya, drive D akan dipasang di /mnt/d . Dari Linux, Anda dapat dengan bebas membaca dan menulis file Windows. Anda dapat membuat symlink pada mereka. Hak file tersebut akan selalu 0777, dan pemiliknya akan root.


Tumpukan jaringan subsistem ini umum untuk Windows. Server yang dibangkitkan di Linux akan tersedia di localhost di Windows dan sebaliknya. Namun, unix-domain-socket untuk Windows hanya berupa file kosong, Anda hanya bisa menggunakannya di Linux. Linux juga memiliki akses ke jaringan eksternal, termasuk mendengarkan port, jika firewall tidak melarang ini.
ifconfig di Linux dan ipconfig di Windows memberikan informasi yang sama tentang antarmuka jaringan.


Dari task manager Windows, Anda dapat dengan aman mengalahkan proses di dalam subsistem Linux. Namun, Linux hanya akan melihat prosesnya.


Fitur, batasan, dan jebakan


Kernel Linux di WSL tidak nyata. Ini hanya lapisan emulator, yang bagian dari tugas spesifik Linux melakukan sendiri, dan bagian proksi langsung ke kernel winNT. Sebagian besar api diimplementasikan di dalamnya, tetapi tidak semua. Anda tidak akan dapat merakit kernel Anda, Anda juga tidak dapat menghubungkan modul kernel (.ko, Obyek Kernel).


Proses init WSL juga miliknya sendiri dan menggantinya, misalnya dengan system.d tidak akan berfungsi. Saya sudah lama memiliki keinginan untuk menulis daemon manager saat bepergian yang akan bekerja dengan file system.d unit dan menyediakan antarmuka yang sama, tetapi semua tangan tidak dapat menjangkau.


Tidak ada dukungan untuk openFUSE, karenanya, pemasangan sistem file virtual atau jarak jauh akan gagal. Tidak mungkin untuk membuat mount dari file, mount sepertinya tidak dapat melakukan apa pun kecuali mengikat di sini.


Juga tidak ada cara untuk mempartisi sistem file Linux menjadi beberapa partisi / disk.


Akses langsung ke zat besi praktis tidak ada. Semua sama, kita berada di kotak pasir Windows, dan tidak di Linux penuh. / dev dan / sys terasa kosong, mereka hanya berisi perangkat virtual. Akses ke GPU - hanya melalui X-server, secara langsung - dengan cara apa pun, sehingga Anda harus melatih jaringan saraf pada Windows.


Dalam pengembangan JS, saya menemukan fakta bahwa electron.js menolak untuk berjalan di WSL, saya harus menduplikasi lingkungan node.js pada Windows.


Ringkasan


Artikelnya ternyata cukup panjang, semoga bermanfaat juga.
WSL bagi saya pribadi ternyata menjadi alat yang sepenuhnya dapat digunakan yang memecahkan masalah saya fullstack pengembang backend. Selama enam bulan, mesin virtual dengan Linux tidak diperlukan. Perasaan umum adalah bahwa Windows + WSL jauh lebih fungsional daripada Linux + Wine.


Saat menulis artikel, saya menemukan bahwa perakitan WSL dengan Debian 9.3 muncul di Microsoft Store, distribusi ini lebih cantik bagi saya daripada Ubuntu, jadi saya akan mencoba menginstalnya.

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


All Articles