安装和启动
旧版本的 win10 需要在“控制面板->程序->启用或关闭Windows功能”勾选“适用于Linux的Windows子系统(Beta)”
由于现在这个功能已经不再是 beta 功能了,只要保证你的 windows 安装了最新的所有补丁与更新,这个选项就已经不复存在了,取而代之的,只要在 windows 自带的应用商店(Microsoft Store)上搜索 linux,下载并安装即可
可以看到,目前 windows 中提供了 Debian、Ubuntu、Kali、SUSE、openSUSE 等发行版,发行版的数量还在不断的增加,可以说是任你选择了,博主选择了现在非常流行的 ubuntu 系统安装
安装完成后,在开始菜单就会出现图标,点击进入即可,当然,你也可以选择点击 win + R 在运行窗口中键入 bash 打开
安装好的是一个非常初步的 linux 操作系统,相信诸如用户创建、默认目录创建权限等等这里就不需要介绍了
0x80070057 错误
0x80070057 错误是因为你的 windows 还不是最新版,在线安装所有更新,重启电脑后再次尝试即可
0x8007019e 错误
安装过程中可能出现下面的文本提示:
1 Installing, this may take a few minutes...
2 Installation Failed!
3 Error: 0x8007019e
4 Press any key to continue...
这个问题是因为 windows 还没有启用 windows 子系统功能
“控制面板\所有控制面板项\程序和功能”中选择“启用或者关闭Windows功能”
或者在 Windows PowerShell(管理员)中输入:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem
-Linux
执行完成后重启电脑即可
0x800703fa
有时启动时会出现下面的报错:
1 WslRegisterDistribution failed with error: 0x800703fa
此时,在运行窗口中执行“services.msc”指令,在本地服务中重启 LxssManager 服务即可
相关文件目录位置
bash.exe 文件路径
既然通过 win + R 执行 bash 就可以打开,那么 bash.exe 当然是在系统环境变量 PATH 下,找一下就会发现,果然不出所料,在 C:\Windows\System32 目录下
bash 安装路径
win10 的 linux 子系统在下面的路径中:
C:\Users\${用户名}\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
windows 硬盘挂在路径
在 linux 子系统中,是完全可以访问任何 windows 磁盘的,所有的 windows 磁盘都默认挂载在 /mnt 路径下
更改 bash 配色
可以通过右击标题栏左上角图标弹出的菜单中,选择属性或默认值,来调整当前或默认配置
但是,通过这样来更改颜色有些复杂,这里提供一个开源工具来提供几个主题风格
https://github.com/zeyu203/console
解压 tool 目录下的 zip 包,在 windows 上执行:
1 colortool.exe [options] <schemename>
可选的 <schemename> 就是 schemes 目录下的文件名,你也可以定义自己喜欢的主题
可选的 options 有:
ColorTool 命令选项
选项 | 完整选项 | 说明 |
-? | --help | 打印帮助信息 |
-c | --current | 打印当前主题 |
-q | --quiet | 不打印颜色表格 |
-d | --defaults | 只更改默认主题 |
-b | --both | 同时更改默认主题与当前主题 |
-s | --schemes | 打印所有可选主题 |
-v | --version | 打印版本号 |
使用 XShell 连接 win10 linux 子系统
也许你觉得 bash 的颜色难以调整,也许你觉得 bash 没有 XShell 或其他 shell 工具功能强大
总之,无论你出于什么理由,如果你也和博主一样,想要用 XShell 或其他 shell 工具连接到 linux 子系统上,那么就接着看吧
用 XShell 连接 linux 子系统的原理非常简单,子系统将 ssh 服务开启到某个端口(默认是 22 端口)上,然后 XShell 连接 localhost 对应的端口即可
linux 子系统中默认安装的 ssh 是缺少秘钥的,解决办法有两个,一个是手动配置 aes 等几种秘钥,这个对于大部分用户来说太过于繁琐和复杂,另一个解决办法是卸载掉 ssh 重新安装
执行下面命令即可:
1 sudo apt-get remove --purge openssh-server
2 sudo apt-get install openssh-server
重新安装后,那些密钥文件就会自动生成了,但是此时还是不能连接,博主遇到这个问题也是百思不解,按照网上的教程反复尝试都无法解决
最终,删除 ssh_config 后重启,居然就这样连接成功
1 sudo rm /etc/ssh/ssh_config
2 sudo service ssh --full-restart
xshell 配色
下面是一个博主自己设置的 xshell 配色供各位参考:
[Pastel on Black]
text(bold)=ffffff
magenta(bold)=8080c0
text=ffffff
white(bold)=ffffff
green=00ff00
red(bold)=ff0000
green(bold)=00ff00
black(bold)=000000
red=ff0000
blue=68b4ff
black=000000
blue(bold)=11b1ff
yellow(bold)=ffff00
cyan(bold)=00ffff
yellow=ffff00
magenta=8080c0
background=000000
white=c0c0c0
cyan=00bbbb
[Names]
count=1
name0=Pastel on Black
中文乱码
中文乱码的原因无非是系统没有安装中文语言包以及默认字符编码问题
针对两个问题分别解决即可
安装中文语言包
如果是 ubuntu 操作系统,那么首先要更新源,可以在网上查找到各个性能卓越的服务器上的源,这里就不罗列了
更新源以后,执行下面的命令安装中文语言包即可:
1 sudo apt install -y language-pack-zh-hans language-pack-zh-hans-base
设置默认字符编码
在用户目录下的 .profile 文件中添加:
1 LANG=zh_CN.UTF-8
如果想要影响所有用户,那么在 /etc/profile 文件中添加上述配置即可
安装 linux 第一时间应该做的事
上面所有问题都已经解决了,你已经可以上手做任何你说想要在 linux 下做的事情了
但是,也许你仍然觉得这样一个刚刚安装的系统非常不顺手,又不知道该从何变得更加顺手,那么,下面的几个建议你可以按照自己的喜好去执行
修改文件模式屏蔽字
linux 子系统默认的 umask 是 000,这意味着你创建的所有文件、目录都是 000 权限的,通过执行 umask 命令即可修改:
1 umask 002
当然了,最好是将这行命令放到 /etc/profile 或 bashrc 中
创建你的用户
刚刚安装的 linux 子系统的默认用户是 root,超级用户的权限过大,这当然是不行的,创建一个自己的用户是非常有必要的
- 创建用户
执行 adduser ${username} 即可
- 授权
执行 sudoers 会提示“未找到这个命令”,此时,执行 whereis sudoers 返回 /etc/sudoers,查看这个文件的权限会发现原来无法执行 sudoers 命令是因为没有编辑权限
此时执行下面命令为该文件添加编辑权限:
1 chmod -v u+w /etc/sudoers
打开这个配置文件,在其中添加权限描述即可:
1 ${username} ALL=(ALL) ALL
配置文件
- bashrc
博主自己用的 bashrc 可以供大家参考,里面定义了一些命令的简化版,设定了字符编码、上面提到的 umask、同时有了 git 命令的自动补全脚本、增大 history 文件默认行数等,较为实用
针对 WSL,在 bashrc 里面引用的 .init.sh 中,我加入了以下内容,用来启动必要的服务
1 nohup /usr/bin/php /root/.init.php > /dev/null 2>&1 0</dev/null &
在 .init.php 中写入了
<?php
$start_service = array("mysql", "ssh", "cron");
$input = shell_exec("/usr/sbin/service --status-all");
$arr = explode(PHP_EOL, $input);$log_base = '/root/.techlog_log/serviceinit.log-';
$log_file = $log_base.date('Y-m-d');
$old_file = $log_base.date('Y-m-d', time() - 7*86400);
if (file_exists($old_file)) {
unlink($old_file);
}foreach ($arr as $service) {
$infos = explode(']', $service);
if (sizeof($infos) == 2) {
$infos[0] = trim(str_replace("[", "", $infos[0]));
$infos[1] = trim($infos[1]);
if (in_array($infos[1], $start_service)) {
if ($infos[0] !== '+') {
$result = shell_exec('/usr/sbin/service '.$infos[1].' start');
file_put_contents($log_file, date('Y-m-d H:m:s')."\t"
.str_replace(PHP_EOL, " ", $result).PHP_EOL, FILE_APPEND);
}
}
}
}
?>