微软的良心产品,不用在windows主机上面装虚拟机了,开发者的福音,如果你是一个开发人员,可以立即用起来!以下是在几个月的使用过程中遇到的一些问题,希望能帮到有需要的用户,不要为了重复踩坑而花费太多时间

安装

  1. ltsb版本不支持,32位不支持;home及以上版本支持。
  2. 在设置 - 针对开发人员 - 勾选开发人员模式。
  3. 在控制面板 - 程序 - 启用或关闭windows功能 - 勾选“适用于Linux 的 Windows 子系统(Beta)”
  4. 重启电脑后,win+r打开cmd,输入bash等待安装完成,可能会很慢很慢,建议翻墙后安装

切换apt源

# 备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改
sudo vim /etc/apt/sources.list
# 将原来的删除后,加入
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

设置root为默认用户并清空密码

lxrun /setdefaultuser root

重新安装windows bash wls

bash版本无法自动更新更新,必需重新卸载再安装,关于bash的一些bug反馈和问题查找可以移步官方github repo:https://github.com/Microsoft/BashOnWindows/issues非常活跃

lxrun /unstinall /full /y
lxrun /install

中文乱码

sudo locale-gen zh_CN.UTF-8

安装lnmp的一些问题

lnmp一键安装包提示错误:

&& make install_sw LIBDIR=lib
make[2]: Entering directory '/mnt/c/Users/hisune/Downloads/Compressed/lnmp1.4-full/src/openssl-1.0.2l'
Makefile is older than Makefile.org, Configure or config.
Reconfigure the source tree (via './config' or 'perl Configure'), please.
Makefile:410: recipe for target 'Makefile' failed
make[2]: *** [Makefile] Error 1

看起来像是linux系统时间或makefile的文件时间问题,但是谷歌了N久没有解决,甚至在lnmp论坛上发帖求助大神依旧无果。最后发现这是windows bash的一个bug。。。解决:

不要在mnt的目录中安装,到/data中安装执行install.sh 关于mnt目录,多说两句,他会挂载windows的盘符。例如/mnt/c就是对应windows下的C盘,实现两个系统文件公用,是不是很方便?

mysql出错

Warning: World-writable config file '/etc/my.cnf' is ignored
Starting MySQL
... * The server quit without updating PID file (/usr/local/mysql/data/DESKTOP-K9LKR9D.pid).

解决办法,修改权限:

chmod 644 /etc/my.cnf

php-fpm与nginx通信异常

方案1

安装完成后,通过fastcgi_pass 127.0.0.1:9000;的方式来和php-fpm交互,而非sock(此方式可能会导致bash中的fpm响应非常慢,推荐第二种方式)

#修改/usr/local/php/etc/php-fpm.conf
;listen = /tmp/php-cgi.sock
listen = 127.0.0.1:9000

#修改/usr/local/nginx/conf/nginx.conf
#fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_pass  127.0.0.1:9000;

方案2

使用/tmp/php-cgi.sock进行交互,但nginx需要做修改(sock文件方式不再细述):

worker_processes auto;
master_process off; # 关闭master_process
pid /run/nginx.pid;
http {
    ...
    fastcgi_buffering off; # 关闭fastcgi_buffering
    ...
}

php-fpm报错

ERROR: failed to retrieve TCP_INFO for socket: Invalid argument (22)

这个错误虽然不影响程序正常执行和使用,但是频繁生成的错误文件很吃硬盘IO,的建议是关掉他:

# 修改php-fpm.conf提高日志等级:
log_level = alert

存在的其他无法解决的问题

由于windows bash对网络方面的命令有很多还不支持,其中就包括netstat,这样就导致nginx无法通过注册的service进行开关重启,也就是以下命令不可用:

sudo service nginx restart
sudo nginx -s reload

目前的解决方案是,只能kill掉nginx的进程后通过service nginx start来达到重启和修改配置后的reload的目的

关于ssh的开启

vim /etc/ssh/sshd_config

# 修改配置:
ListenAddress 0.0.0.0
UsePrivilegeSeparation no
PasswordAuthentication yes

#开启服务:
service ssh start

#如果无法开启服务,可能是22端口被占用了,可以使用下面的命令打开详细的开启服务debug:
/usr/sbin/sshd -D -d -e

#找到:
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
#去掉这三行的注释

mkdir ~/.ssh
vim ~/.ssh/authorized_keys
#加入public key
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
service ssh restart

提示:

* Starting OpenBSD Secure Shell server sshd                Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

执行:

/usr/bin/ssh-keygen -A

bash和ssh的自动开启(此章节有部分内容来自google)

关闭bash窗口,整个linux会被关闭,所以们需要做一个启动win10就开启sshd服务的bash 利用sudoers使得开启进程的sudo命令sudo /usr/sbin/sshd -D可以被任何用户执行而不需要输入密码。 在bash中输入:

sudo visudo -f /etc/sudoers.d/sshd

# 然后键入如下命令:
%sudo ALL=(ALL) NOPASSWD: /usr/sbin/sshd -D

按Ctrl+X退出,会提示保存,一定要修改保存的文件名,把 sshd.tmp中的.tmp删去,因为按照README中的内容,如果有.,那么这个文件就无效 直接在一个你喜欢的位置,写两个文件(同一目录下)文件1 : startsshd.bat,内容是:

cd C:\Windows\System32
bash.exe -c "sudo /usr/sbin/sshd -D"

文件2 : runinbackground.vbe (文件名随意),内容是:

dirPath = createobject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path
shellPath = dirPath & "\" &"startsshd.bat"
' wscript.echo shellPath
set ws=wscript.createobject("wscript.shell")
ws.run shellPath & " /start",0

Win+Q , 然后cmd中输入taskschd.msc. 点开就是一个设置计划任务的程序。 点击菜单栏的操作,选择创建基本任务:

  1. 第一步,填任务名称和说明
  2. 触发器选 当用户登录时,当然其他也可以,随意。
  3. 操作,选 启动程序
  4. 通过浏览,定位到刚刚的runinbackground.vbe,
  5. 完成。

这样在开机的时候执行runinbackground.vbe就可以开机启动bash和sshd了。你也可以双击打开runinbackground.vbe试试服务正常与否,开启后在windows的任务管理器能看到linux中的进程。

如果启动不起来的故障排除小技巧,在cmd中输入

cd C:\Windows\System32
bash.exe -c "sudo /usr/sbin/sshd -D"

看看报什么错,例如这边报错:

C:\Users\hisune>cd C:\Windows\System32
C:\Windows\System32>bash.exe -c "sudo /usr/sbin/sshd -D"
Missing privilege separation directory: /var/run/sshd

在bash中输入:

mkdir -p /var/run/sshd

另一个遇到的错误:

C:\Windows\System32>bash.exe -c "sudo /usr/sbin/sshd -D"
/var/run/sshd must be owned by root and not group or world-writable.

在bash中输入:

chmod 600 /var/run/sshd/

如果提示需要密码,可以清空密码:

lxrun /setdefaultuser root

以上就是所有在使用bash和lnmp环境下遇到的坑。最后列举一下到目前为止,windows bash所有支持或还不支持的网络命令:

支持:

  1. ping
  2. dig
  3. ifconfig
  4. ip link
  5. ip addr show
  6. ifconfig
  7. whois
  8. nslookup
  9. ip route
  10. ip addr add/delete

不支持:

  1. netstat
  2. nmap
  3. tracepath
  4. traceroute
  5. traceroute6

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: win10的自带BASH ubuntu(WSL)下的一些使用情况汇总 - hisune.com