1. 程式人生 > >Windows10內建Linux子系開啟指南

Windows10內建Linux子系開啟指南

啟用linux子系統


設定
Windows功能
安裝ing...
  1. 系統升級到一週年正式版及以上(1607)

  2. 依次在設定-更新與安全-針對開發人員選項中,啟用"開發人員模式"

  3. 在資源管理器中開啟控制面板\所有控制面板項\程式和功能,開啟"啟用或關閉 Windows功能",勾選"適用於Linux的Windows子系統(Beta)"

  4. 重啟電腦
  5. 命令列執行lxrun /install /y開始安裝
    安裝速度取決於網路情況,下載的檔案在%localappdata%\lxss目錄下lxss.tar.gz(181M),解壓後大概500M,rootfs目錄即為子系統根目錄。
  6. 命令列執行bash進入Ubuntu

    預設使用的root帳號登入,通過指令passwd設定密碼。
  7. 畢竟愛折騰,難免會把子系統環境(lxss目錄)玩壞掉,因此幹正事前最好先備份下以便快速還原。注意,不要直接右鍵複製或者打包,可能會導致檔案許可權丟失的。
    xcopy %localappdata%\lxss %localappdata%\lxss.bak /E
  8. 當然,如果你比較任性也可以不執行上一步的備份操作,通過命令列執行lxrun /uninstall /full輕鬆解除安裝子系統,重複上面的步驟即可重灌,不過要注意下載速度時好時壞哦。

通過上面的步驟,已經啟用了win10自帶的linux子系統(WSL),感覺逼格提升了不少。當然,怎麼能滿足於此呢,接下來就要做一些環境的配置和進一步的挖掘。

更換資料來源(參考)

Ubuntu下我們可以通過apt-get命令很方便的安裝/解除安裝軟體,由於預設的軟體包倉庫是位於國外的,安裝軟體的時候就可能遇到各種網路問題或者下載到的一些資源不完整,因此就需要切換資料來源為國內的映象站點來改善。

# 1.備份原來的資料來源配置檔案
cp /etc/apt/sources.list /etc/apt/sources.list_backup
# 2.編輯資料來源配置檔案
vim /etc/apt/sources.list
# 在這裡我使用的是阿里雲的資料來源:
#==============================================================================================
# deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse # deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse # deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse # deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse # deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse # deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse #=============================================================================================== # 3.更新配置 apt-get update

與Windows通訊

目前子系統與Windows之間通過以下兩種方式進行通訊

  1. 通過tcp協議進行通訊(簡單點說就是用網路,埠都是通的)
  2. 通過"/mnt/【碟符】/目錄"的方式訪問Windows目錄

    試過在Windows的資源管理器中直接對子系統環境目錄下的檔案所做的修改不能被子系統鎖識別,因此需要在bash下進行操作。

使用bash客戶端軟體cmder(參考)

Windows自帶的命令提示符cmd並不是很好用(文字選中、複製貼上等等操作),在這裡使用cmder作為替代品,體驗效果很好。去cmder官網下載mini版(完整版附帶了模擬的bash環境,由於已經安裝linux子系統,就不再需要了)的解壓即可使用。

設定:

1.啟動cmder直接執行bash:

  1. 進入"Settings>Startup>Startup options",
  2. 選擇Command line,輸入"bash -cur_console:p"

啟動直接執行bash

2.通過軟體底部的加號按鈕新開標籤頁並進入bash:

  1. 進入"Settings>Startup>Startup options>Tasks",
  2. 選擇"bash::bash",將指令修改為"cmd /c "bash" -cur_console:p -new_console:d:%USERPROFILE%"

新標籤頁

小貼士:將cmder目錄新增到環境變數path中或者複製快捷方式到C:\Windows\System32"目錄下,就可通過win+R快捷鍵快速打開了

執行圖形介面程式(參考)

什麼!linux不是就這麼個黑白介面的視窗嗎?是的,你沒看錯,就是圖形介面,這裡用到的是Xserver這個東東,至於原理什麼的各位自行度娘吧。


Xming
  1. 安裝Xming 下載地址

  2. 安裝完直接開啟Xming即可

  3. 安裝一個firefox測試
    apt-get install firefox
  4. 執行(在程式指令前加上"DISPLAY=:0 ")
    DISPLAY=:0 firefox
  5. 簡化配置
    每次執行程式都要輸入DISPLAY=:0挺累的,執行下列指令後重啟bash即可省去這個步驟
    echo "export DISPLAY=:0.0" >> ~/.bashrc

Sublime Text 3安裝

既然都可以執行圖形介面了,編輯器也要換成視覺化的,畢竟vim還是不太適合我。

cd /
# 下載
wget https://download.sublimetext.com/sublime-text_build-3126_amd64.deb
# 安裝
dpkg -i sublime-text_build-3126_amd64.deb
# 執行
subl

什麼鬼,報錯了!應該是少了什麼依賴包,嗯,安裝下搞定。

apt-get -y install libgtk2.0-0

啟動xfce桌面環境(參考)

圖形介面程式都能運行了,不試試ubuntu的桌面環境怎麼能甘心,於是又是噼裡啪啦一頓搜尋。一開始參照這篇國外的教程折騰了許久,每次執行總是報一個composite的外掛沒載入進來,各種軟體包安裝一通還是不行,後來實在失去耐心就放棄了這條路。後來看到好像有人成功運行了xfce,但沒有具體步驟,只能自己一頓摸索,結果還真誤打誤撞成功了。

# 1.安裝xfce4
apt-get install xfce4
# 2.安裝xubuntu桌面及附帶應用
apt-get install xubuntu-desktop
# 3.啟動
xfce4-session

啟動報錯了,解決辦法參考
sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf

再次嘗試開啟,現在可以看到Xming打開了三個視窗,分別是桌面、工作列、選單欄。逼格是提升了不少,不過確實很卡。


xfce4

在子系統上執行nginx

因工作專案中用到了ssi技術,而已經windows上已經編譯好的nginx是不支援相對路徑引用的(需要修改原始碼重新編譯),只能委屈求全用著apache。不過既然現在都能跑linux了,那就試試在linux上執行nginx,然後在windows上進行呼叫。

1.通過apt方式安裝
apt install nginx
# 啟動報錯了:
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
# 80埠實際沒被佔用,那應該就是ipv6的問題,將其禁用: 
vim /etc/nginx/sites-available/default
# 找到default_server ipv6only=on;註釋掉
# 再次啟動沒報錯,不過瀏覽器無法訪問,80埠也沒被使用,檢視error.log
cat /var/log/nginx/error.log
# 看到錯誤資訊:
ioctl(FIOASYNC) failed while spawning "worker process" (22: Invalid argument)
# 解決方法:禁用master程序模式
sed -i '1 a\master_process off;' /etc/nginx/nginx.conf

再次啟動,終於沒報錯了,Windows中開啟瀏覽器訪問127.0.0.1,還真的實驗成功了,不過nginx版本有點老,是1.4.6的。

2.通過編譯原始碼的方式安裝
# 1.安裝依賴包
apt-get -y install build-essential autoconf libtool libxml2-dev openssl libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng12-dev libfreetype6-dev libldap2-dev libmcrypt-dev libmysqlclient-dev libxslt1-dev libxt-dev libpcre3-dev libreadline-dev
# 2.下載原始碼
wget http://tengine.taobao.org/download/tengine-2.1.1.tar.gz
# 3.解壓
tar -zxvf tengine-2.1.1.tar.gz
# 4.進入目錄
cd tengine-2.1.1
# 修改原始碼...
# 5.配置
./configure --prefix=/usr/anyesu/nginx
# 6.編譯&安裝
make && make install
# 7.修改配置檔案
sed -i '1 a\master_process off;' /usr/anyesu/nginx/conf/nginx.conf
# 8.啟動
/usr/anyesu/sbin/nginx

上面的步驟,我試了兩臺電腦,其中一臺報錯:

nginx: [emerg] invalid port in resolver "fec0:0:0:ffff::1" in /usr/anyesu/nginx/conf/nginx.conf:123


/etc/resolv.conf

出現的fec0:0:0:ffff::1是個什麼鬼,度娘了一番,貌似是dsn,開啟dns配置檔案/etc/resolv.conf果然發現了這東西,應該是Windows下只分配了1個dns,所以linux就給了這麼兩個預設值的吧。將它們註釋掉,重新啟動nginx,成功執行Tengine/2.1.1
注意,每次重啟bash都會重置dns配置的

啟用ssh(參考)

本地可以通過命令列開啟bash,如果要遠端訪問(如同訪問線上伺服器一樣),那麼就需要啟用ssh。

# 1.安裝ssh(一般不需要這步)
apt install openssh-server
# 2.修改配置檔案
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config
#=======(修改以下選項內容)=========#
# Port 23(22埠已被佔用)        #
# (取消註釋)ListenAddress 0.0.0.0 #
# UsePrivilegeSeparation no      #
# PermitRootLogin yes            #
# (註釋)StrictModes yes         #
# PasswordAuthentication yes     #
#================================#
# 3.啟動ssh
service ssh start
# 4.如果提示“sshd error: could not load host key”,則用下面的命令重新生成
rm /etc/ssh/ssh*key
dpkg-reconfigure openssh-server

使用終端工具訪問,這裡我用的是WinSCP + PuTTY


WinSCP
PuTTY

WSL開機啟動


工作管理員

開啟工作管理員我們可以發現,在執行子系統的時候,後臺其實有一個bash的程序在執行,我們每開一個命令列視窗就會多一個bash.exe,如果我們把所有的bash.exe都關閉則這個bash程序就關閉了(相當於是子系統關機了),跟著之前在子系統中開啟的程式如nginx、sshd等也隨之關閉了。為了讓linux程式能夠在後臺繼續執行,這裡通過vbs指令碼在後臺開啟一個bash.exe來保證bash程序一直開著。當然,還可以通過Windows的計劃任務實現開機啟動WSL並開啟其中的程式。

# 1.新建開機啟動指令碼
vim /usr/anyesu/boot.sh
# 2.編輯
#================================================================
# #!/bin/sh
# /usr/anyesu/nginx/sbin/nginx
# service ssh start
# $SHELL  #這句很重要,掛起當前指令碼程序,進而維持base.exe一直開啟
#================================================================
# 3.設定許可權
chmod 777 /usr/anyesu/boot.sh
# 4.建立vbs指令碼(D:\linux\wsl.vbs)
#==========================================
# Set ws = CreateObject("Wscript.Shell") 
# ws.run "bash /usr/anyesu/boot.sh",vbhide
#==========================================
# 5.建立計劃任務

計劃任務
建立基本任務
設定任務名稱
設定任務觸發條件——使用者登入
設定任務操作——啟動
設定任務操作——執行vbs指令碼
執行計劃任務

關於Linux發行版本

# 開啟cmd,進入bash
bash
cd /
# 下載openSUSE
wget -O openSUSE-42.2.tar.xz https://github.com/openSUSE/docker-containers-build/blob/openSUSE-42.2/docker/openSUSE-42.2.tar.xz?raw=true
# 解壓
xz -d /openSUSE-42.2.tar.xz
mkdir rootfs
tar -C rootfs -xvf openSUSE-42.2.tar
# 退出bash,返回cmd
exit
# 進入子系統所在路徑
cd %localappdata%\lxss
# 備份ubuntu使用者空間(看下工作管理員中bash是不是徹底關閉了)
rename rootfs rootfs.ubuntu
# 使用openSUSE使用者空間替換預設使用者空間
move rootfs.ubuntu\rootfs rootfs
# 設定預設登入使用者
lxrun /setdefaultuser root
# 重新進入bash
bash
#檢視發行版本
cat /etc/issue