windows10子系统
2018年11月13日

概述

windows10子系统(Windows Subsystem for Linux,简称WSL)是windows10的一个新特性,相较于cygwin,WSL是内核实现,而cygwin是再用户态实现,效率会更高.

配置启用子系统

  1. 开始菜单-设置-更新和安全-开发者选项-开发人员模式
    此操作会激活开发者模式,并安全相关的软件包
  2. 开始菜单-设置-应用-程序和功能(右侧最下面)-启用或关闭Windows功能-适用于Linux的Windows子系统(勾选)
    确定后,重启电脑,系统更新配置
  3. 打开Windows应用市场,输入Linux挑一个自己喜欢的Linux发行版,根据个人偏好选择(debian系还算熟悉,所以安装了debian)
  4. 开始菜单启动WSL(debian),初次启动会有一个短暂的初始化过程,然受输入一个WSL用户名就可以使用了.

基本配置

  1. 为了保证后续操作的顺利进行,先更新下本地软件包缓存
sudo apt-get update
  1. 修复umask问题
vim ~/.profile
if [[ "$(umask)" == '000' ]]; then
    umask 022
fi

常用技巧

ssh连接

使用子系统主要就是ssh连接了,相对于debian来说,操作如下

  1. 安装openssh-client
sudo apt-get install openssh-client
  1. 修改ssh-agent
    直接使用ssh-add命令添加公钥失败,需要使用ssh-agent
vim ~/.bashrc
# ssh-agent configuration
if [ -z "$(pgrep ssh-agent)" ]; then
    rm -rf /tmp/ssh-*
    eval $(ssh-agent -s) > /dev/null
else
    export SSH_AGENT_PID=$(pgrep ssh-agent)
    export SSH_AUTH_SOCK=$(find /tmp/ssh-* -name agent.*)
fi

Error: 0x800703fa - Press any key to continue

启动Ubuntu的时候报错如下:

Error: 0x800703fa - Press any key to continue

解决办法只要打开服务管理,重启LxssManager服务解决
我的服务管理器里显示LxssManager为手动模式,且无法改成自动(非管理员账户,权限不够),可以使用管理员cmd解决

  1. 开始菜单-cmd-(右键-以管理员身份启动)
  2. 执行以下命令
sc config LxssManager start=auto

每个子系统通常都有一个子系统服务进程和一个内核态驱动,对于Windows子系统,分别是著名的CSRSS.exe和Win32K.sys.对于WSL,以系统服务形式运行的子系统服务进程LxssManager.LXSSManager服务支持运行本机ELF二进制文件.该服务提供在Windows上运行ELF二进制文件所需的基础结构

WSL访问Windows文件,没有权限

WSL默认会再/mnt/下面挂在Windows的各个分区
可以通过mount参数查看挂载参数,drvfs是windows10最近新增加的挂在模式,能有效避免WSL内文件权限污染问题.
gid,uid决定挂载后的文件归属信息,umask,fmask决定文件的默认权限

umount /mnt/c
mount -t drvfs C: /mnt/c/ -o metadata,uid=1000,gid=1000,umask=022,fmask=111

持久化修改

  1. 修改配置文件
vim /etc/wsl.conf
[automount]
enabled = true
root = /mnt/
options = "metadata,uid=1000,gid=1000,dmask=022,fmask=133"
mountFsTab = false
  1. 重启lxssManager服务

参考链接:https://blogs.msdn.microsoft.com/commandline/2018/01/12/chmod-chown-wsl-improvements/

值得注意的是:外部Windows的权限设置大于WSL内的权限设置,所以如果外部文件没有访问权限,即便WSL内有权限也无法访问

修改WSL默认用户

  1. 打开cmd
  2. 输入以下内容
debian config --default-user <username>

debian 为WSL名称
username 改为需要设置的用户名,如果用户名不存在会自动创建

Windows内执行WSL命令

  1. Win+r打开运行命令对话框
  2. 输入命令
bash -c "command"

参考链接:https://www.howtogeek.com/262086/how-to-run-linux-commands-from-outside-the-bash-shell-on-windows-10/

研究执行外部命令主要还是想运行vim,替代windows上的gvim,毕竟原生vim在环境上有很多功能加持(例如:shell命令),但是很无奈共享剪贴板是个天然大坑,以及终端模式vim的效果有些丑陋,并非主题能拯救的,所以还是老老实实用windows上的vim吧.

总结

整体来说,WSL就是一个完整的系统,并不像cygwin那样只是命令环境的模仿,所以能更接近真实linux环境.