皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Windows10 内置 Linux 子系统初体验

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

启用 linux 子系统

图0:Windows10内置Linux子系统初体验

设置

图1:Windows10内置Linux子系统初体验

Windows 功能

图2:Windows10内置Linux子系统初体验

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

更换数据源 ( 参考 )


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 通讯


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

  1. 通过 tcp 协议进行通讯(简单点说就是用网络,端口都是通的)
  2. 通过”/mnt/【盘符】/目录”的方式访问 Windows 目录试过在 Windows 的资源管理器中直接对子系统环境目录下的文件所做的修改不能被子系统锁识别,因此需要在 bash 下进行操作。

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


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

设置:

1. 启动 cmder 直接运行 bash:

  1. 进入”Settings>Startup>Startup options”,
  2. 选择 Command line,输入”bash -cur_console:p”

图3:Windows10内置Linux子系统初体验

启动直接运行 bash

2. 通过软件底部的加号按钮新开标签页并进入 bash:

  1. 进入”Settings>Startup>Startup options>Tasks”,
  2. 选择”bash::bash”,将指令修改为”cmd /c “bash” -cur_console:p -new_console:d:%USERPROFILE%”

图4:Windows10内置Linux子系统初体验

新标签页

小贴士:将 cmder 目录添加到环境变量 path 中或者复制快捷方式到 C:\Windows\System32"目录下,就可通过 win+R 快捷键快速打开了

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


什么!linux 不是就这么个黑白界面的窗口吗?是的,你没看错,就是图形界面,这里用到的是 Xserver 这个东东,至于原理什么的各位自行度娘吧。

图5:Windows10内置Linux子系统初体验

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

图6:Windows10内置Linux子系统初体验

什么鬼,报错了!应该是少了什么依赖包,嗯,安装下搞定。

apt-get -y install libgtk2.0-0

启动 xfce 桌面环境 ( 参考 )


图形界面程序都能运行了,不试试 ubuntu 的桌面环境怎么能甘心,于是又是噼里啪啦一顿搜索。一开始参照这篇 国外的教程 折腾了许久,每次运行总是报一个 composite 的插件没加载进来,各种软件包安装一通还是不行,后来实在失去耐心就放弃了这条路。后来看到好像有人成功运行了 xfce, 但没有具体步骤,只能自己一顿摸索,结果还真误打误撞成功了。

# 1. 安装 xfce4
apt-get install xfce4
# 2. 安装 xubuntu 桌面及附带应用 
apt-get install xubuntu-desktop
# 3. 启动 
xfce4-session

图7:Windows10内置Linux子系统初体验

启动报错了,解决办法 参考
sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf

再次尝试打开,现在可以看到 Xming 打开了三个窗口,分别是桌面、任务栏、菜单栏。逼格是提升了不少,不过确实很卡。

图8:Windows10内置Linux子系统初体验

xfce4

在子系统上运行 nginx


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

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 a\master_process off;' /etc/nginx/nginx.conf

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

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

图9:Windows10内置Linux子系统初体验

/etc/resolv.conf

出现的 fec0:0:0:ffff::1 是个什么鬼,度娘了一番,貌似是 dsn,打开 dns 配置文件 /etc/resolv.conf 果然发现了这东西,应该是 Windows 下只分配了 1 个 dns,所以 linux 就给了这么两个默认值的吧。将它们注释掉,重新启动 nginx,成功运行 Tengine/2.1.1
注意,每次重启 bash 都会重置 dns 配置的

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

图10:Windows10内置Linux子系统初体验

WinSCP

图11:Windows10内置Linux子系统初体验

PuTTY

WSL 开机启动


图12:Windows10内置Linux子系统初体验

任务管理器

打开任务管理器我们可以发现,在运行子系统的时候,后台其实有一个 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. 创建计划任务 

图13:Windows10内置Linux子系统初体验

计划任务

图14:Windows10内置Linux子系统初体验

创建基本任务

图15:Windows10内置Linux子系统初体验

设置任务名称

图16:Windows10内置Linux子系统初体验

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

图17:Windows10内置Linux子系统初体验

设置任务操作——启动

图18:Windows10内置Linux子系统初体验

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

图19:Windows10内置Linux子系统初体验

运行计划任务

关于 Linux 发行版本


1. 升级 Ubuntu 版本至 Xenial(16.04)

2. 使用 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.ubuntu\rootfs rootfs
# 设置默认登录用户 
lxrun /setdefaultuser root
# 重新进入 bash
bash
#查看发行版本 
cat /etc/issue

写在最后

WSL 折腾完有一段时间了,只是一直没时间记录下来(也许是懒吧)。在此之前,由于工作需要,偶尔兼职运维的角色,折腾下服务器什么的,就很业余的学习了一些 linux 指令。以前装过 vmware,体验不是很好就不想装了,所以写 shell 脚本、编译源码什么的都是在公司测试服务器上练习的,现在有了 WSL 之后就可以在自己本地练习了 (肆意折腾,哈哈哈)。使用方面,体验和使用终端工具连接远程服务器是差不多的;性能方面,子系统 (bash 进程) 本身是不占多少内存的,启动程序几乎相当于启动 Windows 程序了,不显示图形界面内存都占用比较小,肯定优于”印象中的虚拟机”。总的来说,WSL 还是比较值得推荐去折腾的,也比较适合新手学习 linux,虽然我也只是个小白⊙﹏⊙

来源:程序师

分享到:更多 ()