程序猿经常争论的一个话题是: 日常开发到底 Windows 好还是 Linux 好? 进而演化出另一个问题: 到底选 MacBook 好还是 SurfaceBook 好?
选择 Linux 系统或者 mac 笔记本的同学最核心的理由是 Linux/Mac 开发编译工具链比较完善, 很多环境或者安装包都系统自带了, 写出来的程序可以很方便的通过开发测试与线上系统对接, 开发测试效率比较高, 而 Windows 下开发的同学可能需要考虑开发测试代码的可移植性问题就拿笔者来说, 也曾经遇到过某些 java/python API 不支持 Windows 的问题, 这给日常开发带来了不小的麻烦
在 Windows10 以前, 咱们为了解决 Windows 开发环境跨平台的问题, 往往会选择 cygwin, 这个项目本身已经很成熟了, 笔者也用了很多年, 它能在 Windows 下模拟一套类 Linux 的环境, 用它应付一般的开发测试问题不大但它的缺点在于组件包管理器比较弱, 对于日后的环境维护相当麻烦, 而且一些底层 API 模拟的并不完善, 对于一些涉及 Linux 底层的系统调用等场景显得很鸡肋幸运的是在 2016 年, 微软在 Windows10 WSL 里开始内置 Ubuntu, 之后又开始在 Microsoft Store 以 UWP APP 的形式发布各个 Linux 系统这样对于需要搭建跨平台开发环境的同学来说可以做到一套系统搞定多套平台环境, 又多了一个舍弃 Mac 的理由 :)
本文今天会详细讲解下怎样在 Windows10 下安装 Ubuntu 搭建 Linux 开发环境, 碰到的一些坑及其解决方案
1 安装 Ubuntu on Windows10
首先更新你的 Windows10 系统到最新, 然后开启开发人员模式, 最后在 Microsoft Store 里输入 Ubuntu 然后选择安装, 成功后即可点击启动
注意: 网上有些老的教程在命令行下用 lxrun /install 的形式安装, 这里不推荐, 因为这是早期 WSL beta 版本的做法, 现在正式版直接在 Microsoft Store 以 UWP APP 的形式获取更便捷, 也易于管理
2 开启 sshd
2.1 设置 sshd
重装 openssh
- sudo apt-get remove openssh-server
- sudo apt-get install openssh-server
修改 sshd 设置, 添加以下配置到 / etc/ssh/sshd_config
- AllowUsers yourusername
- PasswordAuthentication=yes
重启 sshd
sudo service ssh--full - restart
不出意外使用 ssh 客户端应该可以链接上 Bash on windows 了
2.2 问题 1:sshd 启动报错
- # /etc/init.d/ssh restart
- sshd: ../sysdeps/posix/getaddrinfo.c:2603: getaddrinfo: Assertion `IN6_IS_ADDR_V4MAPPED (sin6->sin6_addr.s6_addr32)' failed. Aborted (core dumped)
原因是 ipv6 的问题, 修改 sshd_config 配置添加 ListenAddress 0.0.0.0 即可
sudo vi / etc / ssh / sshd_config
2.3 问题 2:ssh 连接一直提示密码错误
这个问题查起来还是比较复杂的, 需要有比较系统的排查方法和理论, 笔者这里折腾了不少时间
现象就是 sshd 服务起来了, ps aux 和 top 都能见到, 但是 ssh 连接的时候一直提示密码错误或者没有权限, 但密码确认是对的, 包括新建账户也不行, 按照上篇记一次诡异的 ssh 互信免密码登录失败的排查思路发现 sshd 服务压根就没有监听指定的 sshd 端口, 换做其它端口也有同样的问题:
- nc -l 127.0.0.1 4444
- #on powershell:
- netstat -a -n -q | findstr "4444"
那可能是系统层面的问题, 进一步分析 Windows 系统事件发现是 TDI 筛选器的问题:
在 windows/system32 下咱们可以找到这个驱动文件:
本质上是因为一些软件厂商用了微软过时的 API 导致的, 比如 QQGame 和一些 VPN 软件被证实存在这样的问题, 确认原因就好办了, 首先根据软件名字找到对应注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services, 按图修改:
重启电脑, 再次测试 ok:
3sshd 开机启动
一旦关掉 bash.exe 进程, ssh 就无法连接了解决这个问题分三个步骤:
添加启动项, 让 bash.exe 随机启动
使用命令
sudo service ssh start
启动 sshd
因为
sudo service ssh start
命令需要输入密码不能自动化, 所以需要 visudo 来免除输入密码的操作
3.1 理清思路接下来记录一些过程:
使用 vbs 启动隐藏窗口开启 bash 和 运行
- sudo service ssh start
- set ws = wscript.createobject("wscript.shell") ws.run "C:\Windows\System32\bash.exe",
- 0 ws.run "C:\Windows\System32\bash.exe -c'sudo /usr/sbin/service ssh --full-restart'",
- 0
运行 sudo visudo, 添加如下配置
toor ALL = (root) NOPASSWD: /usr/sbin / service
其中 toor 是我的用户名
添加 vbs 文件到 windows 启动项, 将 vbs 文件放入到如下目录下
% AppData % \Microsoft\Windows\Start Menu\Programs\Startup
重启, 测试不出意外就可以连接上 ssh 了
3.2 问题 1: 重启 / 开机后无 sshd 进程
首先确保上述三步每一步的代码都正确, 其次看看系统日志是何原因失败, 我这里遇到的是 sudo 还需要密码, 导致开机的 VB 脚本执行出错仔细研究了下, 这个配置文件如下:
- ...
- # User privilege specification
- root ALL=(ALL:ALL) ALL
- my-username ALL=(ALL) NOPASSWD: ALL # ---> the line added by me
- # Members of the admin group may gain root privileges
- %admin ALL=(ALL) ALL
- # Allow members of group sudo to execute any command
- %sudo ALL=(ALL:ALL) ALL
- # See sudoers(5) for more information on "#include" directives:
- #includedir /etc/sudoers.d
可以看到我的配置加在了中间, 后面还有几条配置, 导致我的配置被后面的覆盖了解决方案是把我的配置移动到最后, 再次试了下, sudo 不再需要密码了
3.3 问题 2:secureCRT 卡死 / 乱码
这里的 secureCRT 卡死 / 乱码和字符集有关, 注意设置正确的终端字符集和系统字符集, Ubuntu on Windows 默认字符集是 Latin
- sudo vim /etc/default/locale
- LANG=zh_CN.UTF-8
- LANGUAGE=zh_CN:zh
- #################################
- # sudo dpkg-reconfigure locales
- # en_US.UTF-8zh_CN.GBKzh_CN.UTF-8
- #################################
- WARNING! Your environment specifies an invalid locale.
- The unknown environment variables are:
- LC_CTYPE=zh_CN.UTF-8 LC_MESSAGES=zh_CN.UTF-8 LC_ALL=
- This can affect your user experience significantly, including the
- ability to manage packages. You may install the locales by running:
- sudo apt-get install language-pack-zh
- or
- sudo locale-gen zh_CN.UTF-8
- To see all available language packs, run:
- apt-cache search "^language-pack-[a-z][a-z]$"
- To disable this message for all users, run:
- sudo touch /var/lib/cloud/instance/locale-check.skip
4WSL Ubuntu 更新
4.1 ubuntu 系统升级:
(1) 版本升级
- // 更新软件源, 最后会读取软件包列表
- sudo apt-get update
- sudo update-manager -c -d
然后选择 upgrade:apt-get -y --force-yes upgrade
(2) 普通升级
- sudo apt-get update
- sudo apt-get -y upgrade
- # apt-get -y --force-yes --fix-missing upgrade
(3) 升级单一软件
- sudo apt-get update
- sudo apt-get upgrade package_name_your_want_to_upgrade
(4) 全部升级
- // 更新所有的软件
- sudo apt - get dist - upgrade
4.2 修改 Ubuntu 镜像源:
WSL 自带的 Ubuntu 更新源国内访问非常慢, 很容易出现部分源 IP 无法连接上, 进而部分索引文件下载失败, 最后导致整个更新失败, 这里推荐阿里云的镜像比较稳定可靠, 当然也可以参考国内各个大学的镜像源
(1)Ubuntu 的软件源配置文件是 /etc/apt/sources.list, 先将系统自带的该文件做个备份:
cp /etc/apt/sources.list {,.bak}
(2) 将源文件中的 URL 替换为国内任意源, 比如阿里云: http://mirrors.aliyun.com/ubuntu
- deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
- deb http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
- deb http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
- deb http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
- # 如要用于其他版本, 把 trusty 换成版本代号就好, 比如: 15.10 willy14.04 trusty
- # 具体请参考: http://wiki.ubuntu.org.cn/源列表 http://wiki.ubuntu.org.cn/模板:14.04source
(3)sudo apt-get update, 刷新列表使其生效
- # 注意: 一定要选对版本
- # 注意: 一定要执行刷新
Refer:
[1] bash on windows 可以升级为 16.04 吗?
- www.zhihu.com/question/49
- [2] How can I SSH into Bash on Ubuntu on Windows 10?
- superuser.com/questions/1
- [3] SSHD server is running but Connection refused on WSL #2376
- github.com/Microsoft/W
- [4] Issue with WLS listening to TCP ports #1554
- github.com/Microsoft/W
[5] 折腾 Bash on Windows 开启 SSHD 并开机启动
stray.love/itshou-zha/
[6] ubuntu16.04 下安装 pip
blog.csdn.net/weixin_3791
来源: https://juejin.im/entry/5a841b895188257a856f4499