新普京网站-澳门新普京 > 计算机 > Windows10内置Linux子系统初体验,Unix程序员的Win10二三事

Windows10内置Linux子系统初体验,Unix程序员的Win10二三事

2019/12/29 19:51
ssh Administrator@192.168.1.100

更换数据源(参考)


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

Win10下面Linux子系统的日常维护跟标准的Linux系统一样,比如Ubuntu版本也是使用apt进行包管理,日常要经常进行一些apt update / apt upgrade这样的操作。感觉上,90%原来服务器端的开发工作,都可以在这里面完成了。有些用户喜欢GUI界面,可以尝试安装Xming之类的X11 Windows Server,官方网址是:https://xming.en.softonic.com,不过我觉得必要不是很大,开发工具、办公工具以及其它一些常用软件,windows下已经有很多了,真的没有必要自讨无趣。

设置:

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:WindowsSystem32"目录下,就可通过win+R快捷键快速打开了

如果你的win10开了防火墙,记着修改防火墙设置,允许传入的连接申请(allow incoming traffic)到23号端口,以便允许你远程登陆。
linux子系统再次启动之后,ssh -p 23 username@192.168.1.100就可以登陆到linux之中了。
如果你根本不使用windows自己的命令行,那在win10 services中关闭SSH Server Broker、SSH Server Proxy两项,就可以让出来22号端口,从而不修改linux子系统的ssh端口,这样也是可以的。不过我不建议这样,比如你想远程关机,就只能在CMD中执行,Linux子系统根本没有这个权限。
这时候还存在一个问题,如果win10重新启动,而linux子系统还没有启动,ssh是无法登陆到linux的,解决这个问题,可是个麻烦事了,大概经过这些步骤:

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

图片 1

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稳定不稳定干啥?

运行图形界面程序(参考)


什么!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
Port 23

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 应用, 即再次执行该应用又会重新安装了。

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

前言


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

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

关于Linux发行版本


  • #### 升级Ubuntu版本至Xenial(16.04)

  • #### 使用openSUSE替换Ubuntu

# 打开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.ubunturootfs rootfs
# 设置默认登录用户
lxrun /setdefaultuser root
# 重新进入bash
bash
#查看发行版本
cat /etc/issue
  • 本质上Linux子系统还是接近虚机的运行方式,因此,比较偏向底层的网络编程,比如socks udp操作,测试的时候你要考虑到实际上linux是通过win10的网络系统转发的,难以描述确切的症状,总之会碰到很多无法达到预期的情况,这类程序调试,可能你还是需要一台linux或者mac真机。
  • tcpdump之类的工具,在linux子系统上是无法正常执行的,因此如果要抓包,估计你只能借助windows下的软件了,不过无论如何可能达不到tcpdump这样方便。sad...
  • 上面提到过,类似关机、重启之类这样的操作,在linux子系统中无法实现,这样的功能,还是需要真机调试。

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 了, 带上了微软的标记,推测是这个原因导致很多软件包无法正常安装了。

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

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脚本

运行计划任务

不管怎么样,我们想开机自动运行Linux ssh的目的,终于达到了。

在子系统上运行nginx


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

上一篇:创建属于其他Session的进程 下一篇:window批处理修改计算机名,计算机描述的代码