Unix程序员的Win10二三事

图片 2

图片 1

WSL

Windows
10预览版14316中已经提供bash组件,默认关闭的,启用的方法是先选中“开始->设置->更新和安全->针对开发人员->开发人员模式”,然后按 Win+X,F 打开“程序和功能”,点击左侧的“启用或关闭Windows功能”,然后找到并勾选 Windows Subsystem for Linux
(Beta) ,确定后会提示重启启动系统。

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的内置下载路径已经不能再被修改替换。
这时候说“上帝关上一扇门,总是又为你打开一扇窗”是不是有点矫情?

前言


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

图片 2

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

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

系统重启完成后,按 Win+X,A
打开命令提示符(或者按 Win+R 打开运行对话框),输入 bash
回车,第一次运行会从网上下载Ubuntu
linux组件,按提示输入y。

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

更换数据源(参考)


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
-- Beta feature --
This will install Ubuntu on Windows, distributed by Canonical
and licensed under its terms available here:
https://aka.ms/uowterms

Type "y" to continue: y
Downloading from the Windows Store... 100%
Extracting filesystem, this will take a few minutes...
????! ???????...
root@localhost:~#

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

与Windows通讯


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

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

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

查看版本信息和分区映射:

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

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


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

root@localhost:~# uname -a
Linux localhost 3.4.0+ #1 PREEMPT Thu Aug 1 17:06:05 CST 2013 x86_64 x86_64 x86_64 GNU/Linux
root@localhost:~# cat /etc/issue
Ubuntu 14.04.4 LTS n l
root@localhost:~# ls -al /mnt
total 24
drwxrwxr-x 2 root 1000 0 Apr  7 07:22 .
drwxrwxr-x 2 root root 0 Apr  7 07:22 ..
drwxrwxrwx 2 root root 0 Apr  7 06:58 c
drwxrwxrwx 2 root root 0 Apr  7 04:59 d
root@localhost:~# sudo ls /dev
adss   fb0    kmsg  ptmx  random  tty   urandom
block  input  null  pts   shm     tty0  zero
root@localhost:~#

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

设置:

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

注意是root用户,/dev 下也没有很多的设备,输入 exit 可退出bash。

ssh Administrator@192.168.1.100

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


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

 /root 目录对应Windows系统的 %localappdata%lxssroot 文件夹(注意,不要删除lxss目录,bash会失败)。

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

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

如果不幸删除了lxss或者其他原因 bash
启动失败。可以在CMD里用下面两条命令卸载再重新安装:

echo y|lxrun /uninstall
echo y|lxrun /install

更新linux子系统,在CMD里运行:

lxrun /update                    // 更新linux子系统
// - 或者 -
lxrun /update /critical          // 只更新关键更新,更新完成后会强制关闭linux进程
Port 23

在子系统上运行nginx


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

使用命令 apt-get
安装软件前建议先在 /etc/apt/sources.list
文件前端添加国内的镜像服务器,  是163的镜像源:

如果你的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的,解决这个问题,可是个麻烦事了,大概经过这些步骤:

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的。

deb http://mirrors.163.com/ubuntu trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu trusty-upadates main restricted universe multi
verse
deb http://mirrors.163.com/ubuntu trusty-security main restricted universe multiverse
  • 在linux子系统中执行:sudo dpkg-reconfigure openssh-server生成ssh服务器端证书。
  • sudo vi /etc/ssh/sshd_config,再次编辑sshd的配置文件,把UsePrivilegeSeparation yes这一行最后的yes修改成no。
  • 继续修改这个文件,把PasswordAuthentication no修改成PasswordAuthentication yes
  • 保存/etc/ssh/sshd_config退出vi。(嗯,写给小白,保存退出vi的方法是:ESC键->”:”键->x然后回车)
  • 运行sudo visudo编辑sudoers文件,增加一行:$USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D,注意这里把$USER替换成你的linux子系统用户名。保存退出。如果visudo有任何报错一定仔细检查修改直到正常,否则你的linux将无法再登陆!!!
  • 在Win10一侧建立一个vbs脚本文件,比如叫autostartssh.vbs,内容为:
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配置的

可用vi编辑:

vi /etc/apt/sources.list

style=”font-size: 12px;”>按3yy复制原来的3行,按Shift+G到结尾,按p粘贴。输入
:1,3s/w*.ubuntu/mirrors.163/
替换前3行为163的镜像,Shift+ZZ保存退出。

启用ssh(参考)


本地可以通过命令行打开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

WinSCP

PuTTY

然后用 apt-get
update 命令更新源(163的更新源最后会出现一些校验警告,可以忽略)。

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

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

运行计划任务

安装 git: 

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

关于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
apt-get --assume-yes install git
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图