08 常见问题及解决方案
WSL无法启动
-
确认
WSL是否开启打开 控制面板,选择 程序和功能,选择 启用和关闭Windows功能,确认图中红框内的两项都被勾选:
如果缺某项,勾选它,按“确定”,Windows会自动安装相应的组件并要求重新启动。此后看看
WSL能否正确启动。 -
尝试更新
WSL在
Powershell中发出:wsl --update然后重启Windows。此后看看
WSL能否正确启动。 -
重置网络
用管理员身份启动
cmd或者Powershell,然后输入如下命令:wsl -l如果长时间没有信息出现,那么按
CTRL+C强制结束命令,然后试试这条命令:netsh winsock reset重启电脑,看看能不能解决问题。
-
其它方法
实际上,导致错误的原因较多。因此,请记下系统提示的以0x开头的错误码,然后上网查询解决方案。
Code无法连接WSL
- 首先,在
Powershell中发出如下命令:wsl -l -v这会列出
WSL的版本,类似于:NAME STATE VERSION * UbuntuXXX Running 2如果版本还是1,那么可能会导致
VS Code连不上WSL。此时,请在Powershell中发出如下命令:wsl --set-version UbuntuXXX 2稍等一段时间,等转换完成后,
VS Code应该就能连上了。 -
如果不是上述情况,可以试试这样做:
打开
Ubuntu终端,发出如下命令:cd ~ sudo mv .vscode-server .vscode-server.bak重启
VS Code应该就可以了。不过,你安装在WSL中的插件也丢失了。但别担心,VS Code有历史记录,点击它们以重新安装。
命令不存在或找不到
无论是Powershell还是Linux的bash终端,在其中发出的命令都是这样的格式:
命令名 <选项> 参数
其中每一项之间都需要一个或多个空格;选项都有前导的-或者--。命令也可以不需要选项。
常见的错误是:
- 输错命令名、选项名(包括大小写错误)。
- 命令项之间少了空格。以下是错误示例:
cd/mnt/d ssh-T gitee正确的命令应该是:
cd /mnt/d ssh -T gitee
测试SSH时遇到问题
-
秘钥文件访问权限过于开放
在测试ssh时,可能会提示秘钥文件访问权限过于开放。 解决方案是:在终端中发出如下命令(假设私有文件是paf):
cd ~/.ssh chmod 600 paf -
未知的主机名或服务
在测试ssh时,出现类似于这样的错误:
ssh: Could not resolve hostname \342\200\223t: Name or service not known错误原因
你可能把命令中的
-号输错了,它应该是英文半角字符,而不是其他类似的符号。非常感谢 王潇霈 同学指出了博客中的错误:我把那个-T选项中的-号弄成了unicode的,结果有同学复制这条命令运行就出现了上述错误。
-
与远端主机的连接被拒绝
系统提示找不到仓库,或者权限不够被拒绝。此时,请发出如下命令:
cd ~/.ssh cat config显示的结果类似于:
Host xxx Hostname ... ...其中,
xxx就是一个服务器名。请看看你连接的服务器名(列在Host项目后面)有没有出现,或者是否输入正确。例如,我给大家的C++仓库的服务器名是
cpp以及配套的密钥文件,但如果用这条命令:ssh -T paf那肯定是联不通啦! 正确的做法是将
paf替换成cpp。
使用git克隆时遇到的问题
-
与远端主机的连接被拒绝
导致这个问题的多数原因是SSH配置不成功。请参阅前面的内容。
-
xxx.git不存在
请向老师询问xxx的具体名字。这个名字可能和告知你的服务器名不一样哦!
-
目录没有写权限
系统可能会提示类似于如下的错误(以D盘为例):
Cloning into 'cppprog'... error: chmod on /mnt/d/cppprog/.git/config.lock failed: ...错误原因
Windows的磁盘D在挂载到Linux的文件系统下时,默认的用户组和拥有者是root,而登录到Linux的用户不是root,没有在D盘的写权限。因此,git修改D盘文件的请求会被拒绝。
解决方案
将挂载时的用户设置为登录用户以获得写权限。 在终端中发出如下命令:
cd /mnt/d ll如果列出的目录和文件用户组和拥有者是root,那么这么做: 在Linux终端中,发出如下命令:
cd /etc sudo vim wsl.conf如果
wsl.conf文件已存在,那么将会被打开;如果不存在,则将创建它。 在vim中,按ESC,在按i,然后将以下内容写进去:[automount] enabled = true options = "metadata" mountFsTab = false然后重启启动系统,打开Linux终端,发出命令:
cd /mnt/d ll如果目录和文件的组和拥有者都是登录用户,那么问题就解决了。
使用非WSL系统可能遇到的问题
你可能因为电脑品牌、其他课程或项目的需要,会使用Windows之外的操作系统。我经常被问道的就是如何在这些系统上安装、配置学习环境。以下就这些问题作出简单回答。
1. 独立安装的Linux系统
如果你的电脑安装了Windows和Linux双系统,那么建议你在Windows下使用WSL。如果你打算这么做,那么请忽略后面的内容。
在安装软件包方面,可能唯一与WSL不同的,就是需要安装适用于Linux的VS Code。这样一来,你就只需在Code中直接打开程序目录,无须远程连接。
在配置方面,与在WSL中的操作很相似,但可能会遇到些小麻烦。例如,无法方便地将我分发的文件复制到系统中。也许解决这个问题的最简单方案就是使用U盘。如果你的系统不能自动识别U盘,那么可以这么做(以Ubuntu为例)。
-
通过方便的渠道将
config、paf、paf.pub三个复制到U盘上。如果你以前曾经挂载过U盘,那么请跳过第2~3步,直接到第4步。
- 为挂载U盘做准备。
- 检查你的U盘文件系统的类型。一般情况下是
fat32。 - 发出如下命令:
cd /mnt sudo mkdir usb你的U盘将会挂载到这个目录下。
- 检查你的U盘文件系统的类型。一般情况下是
-
先不插入U盘。在Linux系统中,发出如下命令:
fdisk -l查看列出的存储设备情况。
-
插入U盘,再次发出上述命令,查看系统多了什么存储设备。多出的设备就是U盘。假设这个设备是
/dev/sda1。发出如下命令进行挂载:sudo mount -t vfat /dev/sda1 /mnt/usb如果U盘的文件系统格式是fat16,那么请将vfat换成msdos。
现在,U盘已经挂载好了,可以读写了。复制三个文件的命令就应该类似于:
sudo cp /mnt/usb/config /mnt/usb/paf* .移除U盘可以用如下命令:
sudo umount /mnt/usb
2. 在Windows中的虚拟机中安装的Linux
因为WSL会使用Windows的Hyper-V,而这个平台和虚拟机(例如VMware等)的某些版本有冲突,所以,建议不开启WSL,而使用虚拟机。
在虚拟机的Linux上安装、配置与在WSL中的非常相似,这里就不再赘述了。
同样地,如果复制文件不方便,那么有几种途径可以解决问题(以Ubuntu为例):
-
使用U盘 请自行查阅如何在虚拟机中挂载U盘。
-
使用共享文件夹 如果你的虚拟机支持共享文件夹(例如VMware),那么可以在Windows中将文件复制到共享文件夹中,然后在虚拟机的Linux系统中,将共享文件夹中的文件复制到
~/.ssh目录中。 -
使用scp命令 在Windows中,以管理员身份运行的
Powershell中发出scp命令,向虚拟机中的指定目录复制文件。
请自行查阅scp命令格式,以及如何在Powershell中使用它。
使用scp极有可能遇到权限不足的问题。这也请自行解决。
3. macOS
macOS的内核与UNIX有不解的渊源。因此,在其上的软件包安装、SSH配置与Linux非常相似。
请选择安装适用于macOS的软件包,包括VS Code、gcc/g++、git等。
macOS下的包管理器推荐使用homebrew。使用如下命令安装它:
/bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"
以后可以使用brew来安装gcc等软件包。例如:
brew install gcc
还有一种方法就是安装xcode的命令行工具。安装后以后也可以在命令行使用gcc了。
详情请自行查阅相关资料。