【必赢官网】Unix程序员的Win10二三事,Windows10内置Linux子系统初体验

ssh Administrator@192.168.1.100

前言


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

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

官方资料


  • #### github

  • #### 博客

  • #### insider build的更新记录

  • 现在可以先测试一下,双击autostartssh.vbs文件,应当能顺利的打开linux子系统并启动ssh服务器。
  • 如果测试没有问题,在开始菜单->Windows管理程序文件夹中启动win10的“任务计划程序”,增加一个开机自动执行任务,操作是启动程序,程序内容就是刚刚编写的这个autostartssh.vbs脚本。在这里碰到一个我相信是bug,本来触发器应当设置为“电脑启动时”自动执行,但死活无效,最后设置成了”当任何用户登录时”反而没有任何人登陆就执行了,实际是开机自动执行的效果。

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

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

关于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

这样来登陆到Win10,随后可以用bash启动linux。
但是如果linux已经在电脑桌面其他的CMD窗口启动了怎么办?这时候bash命令会报错,说已经有其它实例运行,怎么解决呢?可以在桌面进入linux子系统,编辑一下/etc/ssh/sshd_config文件,把其中的22号端口,修改为比如23,修改完是这样子的:

与Windows通讯


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

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

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

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

在子系统上运行nginx


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

很多unix程序员的工作方式都是ssh登陆,然后vi修改程序,接着make编译。
到了win10你会发现,同样的ssh不管用了……
实际的情况是这样,win10默认的ssh留给了自己的CMD应用,也就是Windows命令行,你只能使用Win10的管理员登陆,比如一般默认的Administrator,也就是说,你应当用类似:

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


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

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

启动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

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

使用bash客户端软件cmder(参考)


Windows自带的命令提示符cmd并不是很好用(文本选中、复制粘贴等等操作),在这里使用cmder作为替代品,体验效果很好。去cmder官网下载mini版(完整版附带了模拟的bash环境,由于已经安装linux子系统,就不再需要了)的解压即可使用。

必赢官网 1

设置:

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快捷键快速打开了

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注