http://www.jianshu.com/p/bc38ed12da1dhttp://www.jianshu.com/p/bc38ed12da1dhtml
前段时间,机子上的win10又偷偷摸摸升级到了一周年正式版,比较无奈。不过以前听闻这个版本已经支持内置的linux子系统,因而就怀着好奇心试玩了一把。虽然期间遇到了不少问题,但整体来讲这个子系统体验还不错,在这里就分享一些关键步骤和遇到的问题,剩下的你们本身折腾吧。。mysql
系统升级到一周年正式版及以上(1607)linux
依次在
设置
-更新与安全
-针对开发人员
选项中,启用"开发人员模式"nginx在资源管理器中打开
控制面板\全部控制面板项\程序和功能
,打开"启用或关闭 Windows功能",勾选"适用于Linux的Windows子系统(Beta)"git重启电脑github
命令行运行
lxrun /install /y
开始安装
安装速度取决于网络状况,下载的文件在%localappdata%\lxss
目录下lxss.tar.gz
(181M),解压后大概500M,rootfs
目录即为子系统根目录。sql命令行运行
bash
进入Ubuntu
默认使用的root账号登陆,经过指令passwd
设置密码。docker毕竟爱折腾,不免会把子系统环境(lxss目录)玩坏掉,所以干正事前最好先备份下以便快速还原。注意,不要直接右键复制或者打包,可能会致使文件权限丢失的。
xcopy %localappdata%\lxss %localappdata%\lxss.bak /E
shell固然,若是你比较任性也能够不执行上一步的备份操做,经过命令行运行
lxrun /uninstall /full
轻松卸载子系统,重复上面的步骤便可重装,不过要注意下载速度时好时坏哦。apache
经过上面的步骤,已经启用了win10自带的linux子系统(WSL),感受逼格提高了很多。固然,怎么能知足于此呢,接下来就要作一些环境的配置和进一步的挖掘。
在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
目前子系统与Windows之间经过如下两种方式进行通信
- 经过tcp协议进行通信(简单点说就是用网络,端口都是通的)
- 经过"/mnt/【盘符】/目录"的方式访问Windows目录
试过在Windows的资源管理器中直接对子系统环境目录下的文件所作的修改不能被子系统锁识别,所以须要在bash下进行操做。
Windows自带的命令提示符cmd并非很好用(文本选中、复制粘贴等等操做),在这里使用cmder做为替代品,体验效果很好。去cmder官网下载mini版(完整版附带了模拟的bash环境,因为已经安装linux子系统,就再也不须要了)的解压便可使用。
1.启动cmder直接运行bash:
- 进入"Settings>Startup>Startup options",
- 选择Command line,输入"bash -cur_console:p"
2.经过软件底部的加号按钮新开标签页并进入bash:
- 进入"Settings>Startup>Startup options>Tasks",
- 选择"bash::bash",将指令修改成"cmd /c "bash" -cur_console:p -new_console:d:%USERPROFILE%"
小贴士:将cmder目录添加到环境变量path中或者复制快捷方式到C:\Windows\System32"目录下,就可经过win+R快捷键快速打开了
什么!linux不是就这么个黑白界面的窗口吗?是的,你没看错,就是图形界面,这里用到的是Xserver这个东东,至于原理什么的各位自行度娘吧。
- 安装Xming 下载地址
- 安装完直接打开
Xming
便可- 安装一个firefox测试
apt-get install firefox
- 运行(在程序指令前加上"DISPLAY=:0 ")
DISPLAY=:0 firefox- 简化配置
每次运行程序都要输入DISPLAY=:0挺累的,执行下列指令后重启bash便可省去这个步骤echo "export DISPLAY=:0.0" >> ~/.bashrc
既然均可以运行图形界面了,编辑器也要换成可视化的,毕竟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
图形界面程序都能运行了,不试试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打开了三个窗口,分别是桌面、任务栏、菜单栏。逼格是提高了很多,不过确实很卡。
因工做项目中用到了ssi技术,而已经windows上已经编译好的nginx是不支持相对路径引用的(须要修改源码从新编译),只能委屈求全用着apache。不过既然如今都能跑linux了,那就试试在linux上运行nginx,而后在windows上进行调用。
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 a\master_process off;' /etc/nginx/nginx.conf
再次启动,终于没报错了,Windows中打开浏览器访问127.0.0.1,还真的实验成功了,不过nginx版本有点老,是1.4.6的。
# 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 a\master_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
出现的fec0:0:0:ffff::1是个什么鬼,度娘了一番,貌似是dsn,打开dns配置文件/etc/resolv.conf
果真发现了这东西,应该是Windows下只分配了1个dns,因此linux就给了这么两个默认值的吧。将它们注释掉,从新启动nginx,成功运行Tengine/2.1.1!注意,每次重启bash都会重置dns配置的
本地能够经过命令行打开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
打开任务管理器咱们能够发现,在运行子系统的时候,后台其实有一个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:\linux\wsl.vbs) #========================================== # Set ws = CreateObject("Wscript.Shell") # ws.run "bash /usr/anyesu/boot.sh",vbhide #========================================== # 5.建立计划任务
# 打开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.ubuntu\rootfs rootfs # 设置默认登陆用户 lxrun /setdefaultuser root # 从新进入bash bash #查看发行版本 cat /etc/issue
WSL折腾完有一段时间了,只是一直没时间记录下来(也许是懒吧)。在此以前,因为工做须要,偶尔兼职运维的角色,折腾下服务器什么的,就很业余的学习了一些linux指令。之前装过vmware,体验不是很好就不想装了,因此写shell脚本、编译源码什么的都是在公司测试服务器上练习的,如今有了WSL以后就能够在本身本地练习了(肆意折腾,哈哈哈)。使用方面,体验和使用终端工具链接远程服务器是差很少的;性能方面,子系统(bash进程)自己是不占多少内存的,启动程序几乎至关于启动Windows程序了,不显示图形界面内存都占用比较小,确定优于"印象中的虚拟机"。总的来讲,WSL仍是比较值得推荐去折腾的,也比较适合新手学习linux,虽然我也只是个小白⊙﹏⊙