WSL

前言


前段时间,机子上的win10又偷偷摸摸升级到了一周年正式版,比较无奈。不过之前听闻这个版本已经支持内置的linux子系统,于是就怀着好奇心试玩了一把。虽然期间遇到了很多问题,但总体来说这个子系统体验还不错,在这里就分享一些关键步骤和遇到的问题,剩下的大家自己折腾吧。。

启用linux子系统


 
设置(16215版之后不再需要开发人员模式)
 
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. # 1.备份原来的数据源配置文件
  2. cp /etc/apt/sources.list /etc/apt/sources.list_backup
  3. # 2.编辑数据源配置文件
  4. vim /etc/apt/sources.list
  5. # 在这里我使用的是阿里云的数据源:
  6. #==============================================================================================
  7. # deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
  8. # deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
  9. # deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
  10. # deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
  11. # deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
  12. # deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
  13. # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
  14. # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
  15. # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
  16. # deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
  17. #===============================================================================================
  18. # 3.更新配置
  19. 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 下载地址
  1. 安装完直接打开Xming即可
  2. 安装一个firefox测试
    apt-get install firefox
  3. 运行(在程序指令前加上"DISPLAY=:0 ")
    DISPLAY=:0 firefox
  4. 简化配置
    每次运行程序都要输入DISPLAY=:0挺累的,执行下列指令后重启bash即可省去这个步骤
    echo "export DISPLAY=:0.0" >> ~/.bashrc

Sublime Text 3安装


既然都可以运行图形界面了,编辑器也要换成可视化的,毕竟vim还是不太适合我。

  1. cd /
  2. # 下载
  3. wget https://download.sublimetext.com/sublime-text_build-3126_amd64.deb
  4. # 安装
  5. dpkg -i sublime-text_build-3126_amd64.deb
  6. # 运行
  7. subl
 
什么鬼,报错了!应该是少了什么依赖包,嗯,安装下搞定。

apt-get -y install libgtk2.0-0

启动xfce桌面环境(参考)


图形界面程序都能运行了,不试试ubuntu的桌面环境怎么能甘心,于是又是噼里啪啦一顿搜索。一开始参照这篇国外的教程折腾了许久,每次运行总是报一个composite的插件没加载进来,各种软件包安装一通还是不行,后来实在失去耐心就放弃了这条路。后来看到好像有人成功运行了xfce,但没有具体步骤,只能自己一顿摸索,结果还真误打误撞成功了。

  1. # 1.安装xfce4
  2. apt-get install xfce4
  3. # 2.安装xubuntu桌面及附带应用
  4. apt-get install xubuntu-desktop
  5. # 3.启动
  6. xfce4-session

[图片上传失败...(image-21e5b1-1511161285283)]](//upload-images.jianshu.io/upload_images/1836534-54cf992844fd2486.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  1. 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-get方式安装
  1. apt-get install nginx
  2. # 启动报错了:
  3. nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
  4. # 80端口实际没被占用,那应该就是ipv6的问题,将其禁用:
  5. vim /etc/nginx/sites-available/default
  6. # 找到default_server ipv6only=on;注释掉
  7. # 再次启动没报错,不过浏览器无法访问,80端口也没被使用,查看error.log
  8. cat /var/log/nginx/error.log
  9. # 看到错误信息:
  10. ioctl(FIOASYNC) failed while spawning "worker process" (22: Invalid argument)
  1. # 解决方法:禁用master进程模式
  2. sed -i '1 a\master_process off;' /etc/nginx/nginx.conf

再次启动,终于没报错了,Windows中打开浏览器访问127.0.0.1,还真的实验成功了,不过nginx版本有点老,是1.4.6的。

2.通过编译源码的方式安装
  1. # 1.安装依赖包
  2. 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
  3. # 2.下载源码
  4. wget http://tengine.taobao.org/download/tengine-2.1.1.tar.gz
  5. # 3.解压
  6. tar -zxvf tengine-2.1.1.tar.gz
  7. # 4.进入目录
  8. cd tengine-2.1.1
  9. # 修改源码...
  10. # 5.配置
  11. ./configure --prefix=/usr/anyesu/nginx
  12. # 6.编译&安装
  13. make && make install
  14. # 7.修改配置文件
  15. sed -i '1 a\master_process off;' /usr/anyesu/nginx/conf/nginx.conf
  16. # 8.启动
  17. /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. # 1.安装ssh(一般不需要这步)
  2. apt-get install openssh-server
  3. # 2.修改配置文件
  4. cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
  5. vim /etc/ssh/sshd_config
  6. #=======(修改以下选项内容)=========#
  7. # Port 23(22端口已被占用) #
  8. # (取消注释)ListenAddress 0.0.0.0 #
  9. # UsePrivilegeSeparation no #
  10. # PermitRootLogin yes #
  11. # (注释)StrictModes yes #
  12. # PasswordAuthentication yes #
  13. #================================#
  14. # 3.启动ssh
  15. service ssh start
  16. # 4.如果提示“sshd error: could not load host key”,则用下面的命令重新生成
  17. rm /etc/ssh/ssh*key
  18. 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. # 1.新建开机启动脚本
  2. vim /usr/anyesu/boot.sh
  3. # 2.编辑
  4. #================================================================
  5. # #!/bin/sh
  6. # /usr/anyesu/nginx/sbin/nginx
  7. # service ssh start
  8. # $SHELL #这句很重要,挂起当前脚本进程,进而维持base.exe一直打开
  9. #================================================================
  10. # 3.设置权限
  11. chmod 777 /usr/anyesu/boot.sh
  12. # 4.创建vbs脚本(D:\linux\wsl.vbs)
  13. #==========================================
  14. # Set ws = CreateObject("Wscript.Shell")
  15. # ws.run "bash /usr/anyesu/boot.sh",vbhide
  16. #==========================================
  17. # 5.创建计划任务
 
计划任务
 
创建基本任务
 
设置任务名称
 
设置任务触发条件——用户登录
 
设置任务操作——启动
 
设置任务操作——运行vbs脚本
 
运行计划任务

关于Linux发行版本


1. 升级Ubuntu版本至Xenial(16.04)

2. 使用openSUSE替换Ubuntu

  1. # 打开cmd,进入bash
  2. bash
  3. cd /
  4. # 下载openSUSE
  5. 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
  6. # 解压
  7. xz -d /openSUSE-42.2.tar.xz
  8. mkdir rootfs
  9. tar -C rootfs -xvf openSUSE-42.2.tar
  10. # 退出bash,返回cmd
  11. exit
  12. # 进入子系统所在路径
  13. cd %localappdata%\lxss
  14. # 备份ubuntu用户空间(看下任务管理器中bash是不是彻底关闭了)
  15. rename rootfs rootfs.ubuntu
  16. # 使用openSUSE用户空间替换默认用户空间
  17. move rootfs.ubuntu\rootfs rootfs
  18. # 设置默认登录用户
  19. lxrun /setdefaultuser root
  20. # 重新进入bash
  21. bash
  22. #查看发行版本
  23. cat /etc/issue

官方资料


2017-11-21追加


最近系统又被强更到了1709(16299.64),发现几点变化做个记录:

  1. ping命令已经可以正常使用了
  2. nginx的master模式也能正常使用不会报错了
  3. 发现nginx、ssh之类的,能正常启动不报错但怎么也无法绑定端口。后来查了github上的issues发现是wegame(原tgp)的锅,原因是使用了一个win10上已失效的特性,wegame的开发表示会尽快修复。临时解决办法:删除文件 %systemroot%\system32\drivers\QMTgpNetflow764.sys 后重启bash,如无法删除先关闭应用或卸载再重装wegame(最好重启电脑),重装后先删除QMTgpNetflow764.sys再运行wegame。

2017-11-30追加


 
应用商店

目前(1709版本 16299.64)已经可以在商店中搜索安装多个不同版本的子系统了, 同时还新增了两个命令行工具 wsl.exewslconfig.exe

其中 wsl.exe 应该等价于 bash.exe , 两者之间的细微差别暂时还没发现。至于 wslconfig.exe 的作用主要是以下三个:(参考)

1. 查看安装所有已安装的子系统: wslconfig /l

适用于 Linux 的 Windows 子系统:
Ubuntu (默认)
Legacy

其中Ubuntu是商店中下载的版本,Legacy是按老方法安装的默认wsl。

2. 切换bash.exe默认使用的子系统: wslconfig /s <DistributionName>
其中<DistributionName> 替换为Ubuntu或Legacy, 或者其他已安装的子系统。

3. 卸载已安装的子系统: wslconfig /u <DistributionName>
同上替换<DistributionName>。经测试发现,此"卸载"并不会卸载商店中安装的 Ubuntu 应用, 即再次执行该应用又会重新安装了。

写在最后


WSL折腾完有一段时间了,只是一直没时间记录下来(也许是懒吧)。在此之前,由于工作需要,偶尔兼职运维的角色,折腾下服务器什么的,就很业余的学习了一些linux指令。以前装过vmware,体验不是很好就不想装了,所以写shell脚本、编译源码什么的都是在公司测试服务器上练习的,现在有了WSL之后就可以在自己本地练习了(肆意折腾,哈哈哈)。使用方面,体验和使用终端工具连接远程服务器是差不多的;性能方面,子系统(bash进程)本身是不占多少内存的,启动程序几乎相当于启动Windows程序了,不显示图形界面内存都占用比较小,肯定优于"印象中的虚拟机"。总的来说,WSL还是比较值得推荐去折腾的,也比较适合新手学习linux,虽然我也只是个小白⊙﹏⊙

Windows10内置Linux子系统的更多相关文章

  1. [转]Windows10内置Linux子系统初体验

    Windows10内置Linux子系统初体验 https://www.jianshu.com/p/bc38ed12da1d

  2. Windows10内置Linux子系统初体验

    http://www.jianshu.com/p/bc38ed12da1dhttp://www.jianshu.com/p/bc38ed12da1d WSL 前言 前段时间,机子上的win10又偷偷摸 ...

  3. Windows10内置ubuntu子系统安装后中文环境设置

    原文:Windows10内置ubuntu子系统安装后中文环境设置 第一开启相关设置,使用小娜(Win键+c)直接查找关键字打开更快.   ①设置→查找"针对开发人员"→开发人员模式 ...

  4. 打开设置windows10内置linux功能-启用linux子系统

    第一步设置开发者模式 步骤:windows+s打开娜娜,输入设置,并点击. 点击更新与安全 点击开发者选项,选择开发者模型,弹出的对话框选确定之后等待安装完毕. 第二步:安装linux 点击确定后等待 ...

  5. Windows10 下运行Linux子系统

    关于Windows10 下运行Linux子系统: Windows10内置Linux子系统初体验:http://www.jianshu.com/p/bc38ed12da1d Win10运行Ubuntu版 ...

  6. Windows10系统内置Linux

    主要是在等电脑安装系统,有点慢,于是写个博客…… 还是那句话,从今年开始NOIP应该就不让用Windows了,所以还是尽早转Linux吧,不然NOIP考场上不会编译太尴尬对吧. 在学校电脑有Linux ...

  7. Windows10内嵌Ubuntu子系统配置python开发环境

    Windows10内嵌Ubuntu子系统配置python开发环境 安装pycharm. 到intellij idea网站下载Linux环境下载免费的pycharm,通过ubuntu子系统内部的/mnt ...

  8. 流程自动化RPA,Power Automate Desktop系列 - 不讲武德的Windows10内置应用

    简介 Power Automate Desktop 扩展Power Automate中的现有机器人流程自动化(RPA)功能,并使您能够自动化所有重复的桌面流程. 使用预生成的拖放操作或记录您自己的桌面 ...

  9. Windows10上使用Linux子系统(WSL)

    Linux的Windows子系统让开发人员可以直接在Windows上运行Linux环境(包括大多数命令行工具,实用程序和应用程序),而无需建立在虚拟机的开销之上,整个系统共200多M,但包含了你能用到 ...

随机推荐

  1. (转)AssetBundle系列——共享资源打包/依赖资源打包

    有人在之前的博客中问我有关共享资源打包的代码,其实这一块很简单,就两个函数: BuildPipeline.PushAssetDependencies():依赖资源压栈: BuildPipeline.P ...

  2. 让你的Python代码更加pythonic

    http://wuzhiwei.net/be_pythonic/ 何为pythonic? pythonic如果翻译成中文的话就是很python.很+名词结构的用法在中国不少,比如:很娘,很国足,很CC ...

  3. Windows xcopy

    1.考虑下面的需求,把aaa目录下面的111.txt 拷贝到 bbb,如下:echo onxcopy .\aaa\111.txt .\bbb\ /ypause2.注意这里表示路径要用右斜杠,因为左斜杠 ...

  4. 电脑技巧 如何保存网页为PDF

    安装Adobe Acrobat X pro(要安装版本,不要绿色版),完成之后再打印机里面可以看到添加了新的Adobe PDF打印机   对于任意的Office文档,都可以直接打印到PDF得到PDF文 ...

  5. poj 3042 Grazing on the Run

    这个题目原型应该是吃完所有的草丛的最小时间,现在变成了每个草丛被吃的时间和,貌似如果还是按照原来的dp方法dp[i][j]表示吃完i到j的草丛的花掉的时间的话,有两个因素会影响后面的决策,一个是花掉的 ...

  6. vSphere Data Protection – a new backup product included with vSphere 5.1

    August 27, 2012 By Vladan SEGET This new backup product replaces VMware Data Recovery, which has bee ...

  7. JAVA设计模式——第 3 章 单例模式【Singleton Pattern】(转)

    这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...

  8. httpclient Accept-Encoding 乱码

    解决方法 HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { if (httpEntity.getC ...

  9. GitHub如何下载clone指定的tag

    如上图,我想下载Tags标签为solution-4 的代码,如何处理呢? 命令如下: git clone --branch solution-4 git@github.com:zspo/learngi ...

  10. Java的PriorityQueue

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6538654.html  优先队列实质上就是数据结构中的最小堆,而堆从概念图来看类似于一棵二叉树,从具体实现来说 ...