http://www.jianshu.com/p/bc38ed12da1dhttp://www.jianshu.com/p/bc38ed12da1dhtml
前段時間,機子上的win10又偷偷摸摸升級到了一週年正式版,比較無奈。不過以前聽聞這個版本已經支持內置的linux子系統,因而就懷着好奇心試玩了一把。雖然期間遇到了不少問題,但整體來講這個子系統體驗還不錯,在這裏就分享一些關鍵步驟和遇到的問題,剩下的你們本身折騰吧。。mysql
系統升級到一週年正式版及以上(1607)linux
依次在
設置
-更新與安全
-針對開發人員
選項中,啓用"開發人員模式"nginx在資源管理器中打開
控制面板\全部控制面板項\程序和功能
,打開"啓用或關閉 Windows功能",勾選"適用於Linux的Windows子系統(Beta)"git重啓電腦github
命令行運行
lxrun /install /y
開始安裝
安裝速度取決於網絡狀況,下載的文件在%localappdata%\lxss
目錄下lxss.tar.gz
(181M),解壓後大概500M,rootfs
目錄即爲子系統根目錄。sql命令行運行
bash
進入Ubuntu
默認使用的root賬號登陸,經過指令passwd
設置密碼。docker畢竟愛折騰,不免會把子系統環境(lxss目錄)玩壞掉,所以幹正事前最好先備份下以便快速還原。注意,不要直接右鍵複製或者打包,可能會致使文件權限丟失的。
xcopy %localappdata%\lxss %localappdata%\lxss.bak /E
shell固然,若是你比較任性也能夠不執行上一步的備份操做,經過命令行運行
lxrun /uninstall /full
輕鬆卸載子系統,重複上面的步驟便可重裝,不過要注意下載速度時好時壞哦。apache
經過上面的步驟,已經啓用了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之間經過如下兩種方式進行通信
- 經過tcp協議進行通信(簡單點說就是用網絡,端口都是通的)
- 經過"/mnt/【盤符】/目錄"的方式訪問Windows目錄
試過在Windows的資源管理器中直接對子系統環境目錄下的文件所作的修改不能被子系統鎖識別,所以須要在bash下進行操做。
Windows自帶的命令提示符cmd並非很好用(文本選中、複製粘貼等等操做),在這裏使用cmder做爲替代品,體驗效果很好。去cmder官網下載mini版(完整版附帶了模擬的bash環境,因爲已經安裝linux子系統,就再也不須要了)的解壓便可使用。
1.啓動cmder直接運行bash:
- 進入"Settings>Startup>Startup options",
- 選擇Command line,輸入"bash -cur_console:p"
2.經過軟件底部的加號按鈕新開標籤頁並進入bash:
- 進入"Settings>Startup>Startup options>Tasks",
- 選擇"bash::bash",將指令修改成"cmd /c "bash" -cur_console:p -new_console:d:%USERPROFILE%"
小貼士:將cmder目錄添加到環境變量path中或者複製快捷方式到C:\Windows\System32"目錄下,就可經過win+R快捷鍵快速打開了
什麼!linux不是就這麼個黑白界面的窗口嗎?是的,你沒看錯,就是圖形界面,這裏用到的是Xserver這個東東,至於原理什麼的各位自行度娘吧。
- 安裝Xming 下載地址
- 安裝完直接打開
Xming
便可- 安裝一個firefox測試
apt-get install firefox
- 運行(在程序指令前加上"DISPLAY=:0 ")
DISPLAY=:0 firefox- 簡化配置
每次運行程序都要輸入DISPLAY=:0挺累的,執行下列指令後重啓bash便可省去這個步驟echo "export DISPLAY=:0.0" >> ~/.bashrc
既然均可以運行圖形界面了,編輯器也要換成可視化的,畢竟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
圖形界面程序都能運行了,不試試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打開了三個窗口,分別是桌面、任務欄、菜單欄。逼格是提高了很多,不過確實很卡。
因工做項目中用到了ssi技術,而已經windows上已經編譯好的nginx是不支持相對路徑引用的(須要修改源碼從新編譯),只能委屈求全用着apache。不過既然如今都能跑linux了,那就試試在linux上運行nginx,而後在windows上進行調用。
apt-get 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的。
# 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
出現的fec0:0:0:ffff::1是個什麼鬼,度娘了一番,貌似是dsn,打開dns配置文件/etc/resolv.conf
果真發現了這東西,應該是Windows下只分配了1個dns,因此linux就給了這麼兩個默認值的吧。將它們註釋掉,從新啓動nginx,成功運行Tengine/2.1.1!注意,每次重啓bash都會重置dns配置的
本地能夠經過命令行打開bash,若是要遠程訪問(如同訪問線上服務器同樣),那麼就須要啓用ssh。
# 1.安裝ssh(通常不須要這步) apt-get 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
打開任務管理器咱們能夠發現,在運行子系統的時候,後臺其實有一個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.建立計劃任務
# 打開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
WSL折騰完有一段時間了,只是一直沒時間記錄下來(也許是懶吧)。在此以前,因爲工做須要,偶爾兼職運維的角色,折騰下服務器什麼的,就很業餘的學習了一些linux指令。之前裝過vmware,體驗不是很好就不想裝了,因此寫shell腳本、編譯源碼什麼的都是在公司測試服務器上練習的,如今有了WSL以後就能夠在本身本地練習了(肆意折騰,哈哈哈)。使用方面,體驗和使用終端工具鏈接遠程服務器是差很少的;性能方面,子系統(bash進程)自己是不佔多少內存的,啓動程序幾乎至關於啓動Windows程序了,不顯示圖形界面內存都佔用比較小,確定優於"印象中的虛擬機"。總的來講,WSL仍是比較值得推薦去折騰的,也比較適合新手學習linux,雖然我也只是個小白⊙﹏⊙