WSL无法启动

  1. 确认WSL是否开启

    打开 控制面板,选择 程序和功能,选择 启用和关闭Windows功能,确认图中红框内的两项都被勾选:

    如果缺某项,勾选它,按“确定”,Windows会自动安装相应的组件并要求重新启动。此后看看WSL能否正确启动。

  2. 尝试更新WSL

    Powershell中发出:

     wsl --update
    

    然后重启Windows。此后看看WSL能否正确启动。

  3. 重置网络

    管理员身份启动cmd或者Powershell,然后输入如下命令:

     wsl -l
    

    如果长时间没有信息出现,那么按CTRL+C强制结束命令,然后试试这条命令:

     netsh winsock reset
    

    重启电脑,看看能不能解决问题。

  4. 其它方法

    实际上,导致错误的原因较多。因此,请记下系统提示的以0x开头的错误码,然后上网查询解决方案。

Code无法连接WSL

  1. 首先,在Powershell中发出如下命令:
     wsl -l -v
    

    这会列出WSL的版本,类似于:

     NAME              STATE           VERSION
     * UbuntuXXX       Running         2
    

    如果版本还是1,那么可能会导致VS Code连不上WSL。此时,请在Powershell中发出如下命令:

     wsl --set-version UbuntuXXX 2
    

    稍等一段时间,等转换完成后,VS Code应该就能连上了。

  2. 如果不是上述情况,可以试试这样做:

    打开Ubuntu终端,发出如下命令:

     cd ~
     sudo mv .vscode-server .vscode-server.bak
    

    重启VS Code应该就可以了。不过,你安装在WSL中的插件也丢失了。但别担心,VS Code有历史记录,点击它们以重新安装。

命令不存在或找不到

无论是Powershell还是Linuxbash终端,在其中发出的命令都是这样的格式:

命令名 <选项> 参数

其中每一项之间都需要一个或多个空格;选项都有前导的-或者--。命令也可以不需要选项。 常见的错误是:

  1. 输错命令名、选项名(包括大小写错误)。
  2. 命令项之间少了空格。以下是错误示例
     cd/mnt/d
     ssh-T gitee
    

    正确的命令应该是:

     cd /mnt/d
     ssh -T gitee
    

测试SSH时遇到问题

  1. 秘钥文件访问权限过于开放

    在测试ssh时,可能会提示秘钥文件访问权限过于开放。 解决方案是:在终端中发出如下命令(假设私有文件是paf):

     cd ~/.ssh
     chmod 600 paf
    
  2. 未知的主机名或服务

    在测试ssh时,出现类似于这样的错误:

     ssh: Could not resolve hostname \342\200\223t: Name or service not known
    

    错误原因

    你可能把命令中的-号输错了,它应该是英文半角字符,而不是其他类似的符号。

    非常感谢 王潇霈 同学指出了博客中的错误:我把那个-T选项中的-号弄成了unicode的,结果有同学复制这条命令运行就出现了上述错误。

  3. 与远端主机的连接被拒绝

    系统提示找不到仓库,或者权限不够被拒绝。此时,请发出如下命令:

     cd ~/.ssh
     cat config
    

    显示的结果类似于:

     Host xxx
         Hostname ...
         ...
    

    其中,xxx就是一个服务器名。请看看你连接的服务器名(列在Host项目后面)有没有出现,或者是否输入正确。

    例如,我给大家的C++仓库的服务器名是cpp以及配套的密钥文件,但如果用这条命令:

     ssh -T paf
    

    那肯定是联不通啦! 正确的做法是将paf替换成cpp

使用git克隆时遇到的问题

  1. 与远端主机的连接被拒绝

    导致这个问题的多数原因是SSH配置不成功。请参阅前面的内容。

  2. xxx.git不存在

    请向老师询问xxx的具体名字。这个名字可能和告知你的服务器名不一样哦!

  3. 目录没有写权限

    系统可能会提示类似于如下的错误(以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为例)。

  1. 通过方便的渠道将configpafpaf.pub三个复制到U盘上。

    如果你以前曾经挂载过U盘,那么请跳过第2~3步,直接到第4步。

  2. 为挂载U盘做准备。
    • 检查你的U盘文件系统的类型。一般情况下是fat32
    • 发出如下命令:
     cd /mnt
     sudo mkdir usb
    

    你的U盘将会挂载到这个目录下。

  3. 先不插入U盘。在Linux系统中,发出如下命令:

     fdisk -l
    

    查看列出的存储设备情况。

  4. 插入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了。

详情请自行查阅相关资料。