Windows10内置Linux子系统初体验

  • 本质上Linux子系统还是接近虚机的运行方式,因此,比较偏向底层的网络编程,比如socks udp操作,测试的时候你要考虑到实际上linux是通过win10的网络系统转发的,难以描述确切的症状,总之会碰到很多无法达到预期的情况,这类程序调试,可能你还是需要一台linux或者mac真机。
  • tcpdump之类的工具,在linux子系统上是无法正常执行的,因此如果要抓包,估计你只能借助windows下的软件了,不过无论如何可能达不到tcpdump这样方便。sad...
  • 上面提到过,类似关机、重启之类这样的操作,在linux子系统中无法实现,这样的功能,还是需要真机调试。

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:linuxwsl.vbs)
#==========================================
# Set ws = CreateObject("Wscript.Shell") 
# ws.run "bash /usr/anyesu/boot.sh",vbhide
#==========================================
# 5.创建计划任务

计划任务

创建基本任务

设置任务名称

设置任务触发条件——用户登录

设置任务操作——启动

设置任务操作——运行vbs脚本

运行计划任务

set ws=wscript.createobject("wscript.shell")
ws.run "C:WindowsSystem32bash.exe -c 'sudo /usr/sbin/sshd -D'",0

转载请注明出处:http://www.jianshu.com/p/bc38ed12da1d

ssh Administrator@192.168.1.100

启用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),感觉逼格提升了不少。当然,怎么能满足于此呢,接下来就要做一些环境的配置和进一步的挖掘。

但事实就是如此,Win10 RS3之后的Linux子系统,终于转正成正式版了,从而登上了Win10的应用程序商店,并且还有了Ubuntu/Suse Linux等多个版本供选择,据说还会有更多正在赶来的途中,嗯,这扇窗开的不算小吧?
无论你的Win10使用了什么版本,打开应用商店,都已经能搜索到这些Linux应用,但是,似乎只有RS3之后的版本才可以下载,其它版本的win10只能看看介绍,然后就只好洗洗睡了。
事实上,正确的打开方式是这样:

WSL

————————————————————————————————————————————————

2017-11-30追加


应用商店

目前 ( 1709 版本 16299.64 ) 已经可以在商店中搜索安装多个不同版本的子系统了,根路径为 %localappdata%Packages【根据子系统名找到对应的应用文件夹】LocalStaterootfs 。同时还新增了两个命令行工具: 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> 替换为 UbuntuLegacy , 或者其他已安装的子系统。

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

升级会耗费比较长的时间,一旦升级完成,打开应用商店,选一个你喜欢的linux版本,下载就好了。

官方资料


macOS延续自BSD Unix, Linux则是从内核开始重新编写但延续Unix使用方式的Unix。所以mac还有linux程序员,一般都算是*nix程序员,尽管其中还有不少的区别。
Windows从版本10开始做出的最大改变,可能就是内置的linux子系统,原本的安装方式很简单,网上很多介绍,一般就是三步:1.设置中打开开发人员模式;2.windows组件中安装linux子系统;3.在DOS窗口中执行bash,随后经历一场漫长而令人期待的安装。
后来这个办法不灵了,因为虽然win10几乎马不停蹄的更新了不少版本,其中的linux仍然保持着beta状态,下载的源网站也在国外,而因为我们都知道的原因,这个网站在国内访问越来越困难。
有聪明人想了办法,比如首先从第三方下载tar安装包,利用fiddle之类的软件截获win10安装linux子系统时候的下载路径,随后替换为本地的tar文件,虽然麻烦点,但还是能很快的完成安装。后来,又是后来,这个办法也失效了,win10的内置下载路径已经不能再被修改替换。
这时候说“上帝关上一扇门,总是又为你打开一扇窗”是不是有点矫情?

2017-11-21追加


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

  1. ping命令已经可以正常使用了
  2. nginx的master模式也能正常使用不会报错了
  3. 发现nginx、ssh之类的,能正常启动不报错但怎么也无法绑定端口。后来查了github上的 issues 发现是wegame(原tgp)的锅,原因是使用了一个win10上已失效的特性,wegame的开发表示会尽快修复。临时解决办法:删除文件 %systemroot%system32driversQMTgpNetflow764.sys 后重启bash,如无法删除先关闭应用或卸载再重装wegame(最好重启电脑),重装后先删除 QMTgpNetflow764.sys 再运行wegame。
  4. 内核升级为 4.4.0-43-Microsoft 了, 带上了微软的标记,推测是这个原因导致很多软件包无法正常安装了。

已知有几项限制,开发过程中可能会碰到:

1. 通过apt-get方式安装
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 amaster_process off;' /etc/nginx/nginx.conf

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

  1. 首先登陆微软官网,使用自己的微软账号登陆进去,把自己的账号转换成开发者账号,如果找不到登陆链接,可以直接从下面第2步链接账号的地方进去。
  2. 菜单路径是:开始菜单->齿轮图标进入设置->更新和安全->Windows预览体验计划,先选择链接Microsoft账户,使用你的微软账号捆绑到Win10系统,然后在上面的获取Insider Preview中,打开开发者预览功能。
  3. 同一个设置界面中,选择最上面的Windows更新,这时候你会找到很多预览版的升级,踏踏实实升级到这个最新的预览版。你问是否稳定?你个*nix码农,关心Win10稳定不稳定干啥?

在子系统上运行nginx


因工作项目中用到了 ssi 技术,而已经windows上已经编译好的 nginx 是不支持相对路径引用的(需要修改源码重新编译),只能委屈求全用着 Apache 。不过既然现在都能跑linux了,那就试试在linux上运行 nginx,然后在windows上进行调用。

与Windows通讯


目前子系统与Windows之间通过以下两种方式进行通讯

  1. 通过tcp协议进行通讯(简单点说就是用网络,端口都是通的)
  2. 通过 /mnt/【盘符】/目录 的方式访问Windows目录

试过在Windows的资源管理器中直接对子系统环境目录下的文件所做的修改不能被子系统所识别,因此需要在bash下进行操作。

Port 23
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 amaster_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配置的

本文由最新澳门网站网址游戏发布于产品展示,转载请注明出处:Windows10内置Linux子系统初体验

您可能还会对下面的文章感兴趣: