【本文将持续更新】

因为本人爱折腾的属性,WSL有时候会被整坏。为了避免反复折腾重装WSL时花大量时间找资源和教程,特用此博客记录整合一些WSL管理和配置相关的内容。

存储空间管理

  1. 清理apt缓存
    sudo apt autoclean
    sudo apt autoremove
    sudo apt clean
    
  2. 清理pip缓存
    cd ~/.cache/pip
    sudo rm -rf *
    
  3. 使用 ncdu 工具分析空间占用情况,找出占空间的文件并按需移除。
    要使用该工具,在根目录下运行该命令
    ncdu --exclude /mnt # wsl下排除/mnt
    
  4. 别忘了在Win下用 diskpart 压缩WSL虚拟磁盘的空间占用。因为WSL虚拟磁盘文件的空间占用只会自动扩大,而不会主动缩小。
    diskpart  # 在cmd中执行此条指令后会弹出一个diskpart的新窗口
    # 然后在新窗口中执行以下命令
    select vdisk file="C:\Users\[USER_NAME]\AppData\Local\Packages\CanonicalGroupLimited.[UbuntuonWindows]_[SerialNumber]\LocalState\ext4.vhdx" # 此处为虚拟磁盘文件所在的位置,根据实际情况可能有所不同
    attach vdisk readonly
    compact vdisk
    detach vdisk
    

WSL虚拟机配置(.wslconfig

[wsl2]
memory=16GB   # 设置给WSL分配的最大内存
processors=6  # 设置给WSL分配的处理器数

此处只列出两项常用配置,详细信息请查看此处

IO速度优化

WSL2的IO速度本来就很慢了,Windows Defender会在WSL中更改数据时扫描WSL内的数据,更会拖慢IO速度。所以安装WSL后建议将对应的目录放进Windows Defender的白名单中。

zsh安装与配置

相比较传统的bash,zsh有更多的自定义选项,并支持扩展,尤其是Oh-my-zsh这款美化组件。

安装

  1. 安装 zsh 本体
    sudo apt install zsh
    # 然后重启shell
    # 要检查安装是否成功,请执行以下命令
    echo $SHELL
    # 如果返回结果是类似于/usr/bin/zsh,则安装成功
    
  2. 安装 Oh-my-zsh
    sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    # 如果无法正常下载执行该脚本,请先配置代理
    export ALL_PROXY=http://[host_ip]:7890
    # 或者先在Win下下载该脚本,再转移到WSL中执行安装
    

    注:此处 host_ip 为Windows主机的虚拟内网IP,可以通过在 cmdpower shell 中执行 ipconfig 命令,并查看WSL虚拟网卡下的ip获得,也可在WSL中执行 cat /etc/resolv.conf 命令,输出中 nameserver 后面的IP即是 host_ip

配置

Oh-my-zsh 的配置主要在 ~/.zshrc 中进行。如果没有该文件,请从此处获取配置模板

  • 配置主题
    我一般使用 agnoster 主题,要配置为该主题,请在 ~/.zshrc 中修改成如下配置
    ZSH_THEME="agnoster"
    
  • 配置全局代理
    使用Clash-for-windows,开启局域网访问后,要在WSL中启用全局代理,请在 ~/.zshrc 中添加如下行
    host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
    export ALL_PROXY="http://$host_ip:7890"
    
  • 配置插件
    我目前常用的两个插件,一个是zsh默认开启的 git ,还有一个就是 sudo。后者可以通过双击 esc 键快捷的在当前输入的命令前加上 sudo ,十分方便。
    要配置插件,请在 ~/.zshrc 中修改如下行
    plugins=( git sudo )
    

系统语言配置

有时候英语环境用着可能不是很舒服,可以选择切换为中文环境

  1. 查看系统当前语言环境 echo $LANG
  2. 查看是否已安装中文语言 locale
  3. 安装中文语言包 sudo apt install language-pack-zh-hans
  4. 运行 dpkg-reconfigure locales 并选择 en_US.UTF-8zh_CN.UTF-8 进行配置, 最后选择 zh_CN.UTF-8 为默认语言
  5. 重启WSL,即可看到修改生效

GPG配置

GPG是目前最流行、最好用的加密工具之一。

  1. 导入密钥
    要导入密钥,请在命令行中执行以下命令

    gpg --import [sub_key_file_path] # sub_key_file_path为要导入的子密钥的文件路径
    

    注:此处可能会要求你输入主密钥的保护密码

    导入完成后验证是否成功导入

    gpg --list-keys
    

    终端应该会返回以下内容:

    /home/[user_name]/.gnupg/pubring.kbx
    ----------------------------------
    pub   [main_key_type] [gen_date] [SC]
          [Key_Fingerprint]
    uid             [ 未知 ] [UserName] ([KeyName]) <[e-mail]>
    sub   [sub_key_type] [gen_date] [E] [有效至:[exp_date]]
    sub   [sub_key_type] [gen_date] [S] [有效至:[exp_date]]
    
  2. 更改密钥的信任级
    刚导入的GPG密钥还处于未知信任级,下面要提升其信任级别。在命令行中执行以下命令

    gpg --edit-key [Key_Fingerprint] # 此处Key_Fingerprint为之前导入密钥的密钥指纹
    

    终端应该会返回以下内容:

    gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    私密子密钥可用。
    
    pub  [main_key_type]/[main_key_fingerprint]
         创建于:[gen_date]  有效至:永不       可用于:SC
         信任度:未知        有效性:未知
    ssb  [sub_key_type]/[sub_key_fingerprint]
         创建于:[gen_date]  有效至:[exp_date]  可用于:E
    ssb  [sub_key_type]/[sub_key_fingerprint]
         创建于:[gen_date]  有效至:[exp_date]  可用于:S
    [ 未知 ] (1). [UserName] ([KeyName]) <[e-mail]>
    
    gpg>
    

    此时输入 trust 来更改信任级,终端会提示以下信息:

    请决定您对这名用户能否正确地验证其他用户密钥
    (通过查看护照,检查不同来源的的指纹等等)的相信程度
    
      1 = 我不知道或不作答
      2 = 我不相信
      3 = 我勉强相信
      4 = 我完全相信
      5 = 我绝对相信
      m = 回到主菜单
    
    您的决定是什么?
    

    如果你刚刚导入的是自己之前生成的子密钥,则可以选择 5 = 绝对相信。这时gpg会向你再次确认指令,确认后你的密 钥就是绝对信任级了,像这样:

    pub  [main_key_type]/[main_key_fingerprint]
         创建于:[gen_date]  有效至:永不       可用于:SC
         信任度:绝对        有效性:绝对
    ssb  [sub_key_type]/[sub_key_fingerprint]
         创建于:[gen_date]  有效至:[exp_date]  可用于:E
    ssb  [sub_key_type]/[sub_key_fingerprint]
         创建于:[gen_date]  有效至:[exp_date]  可用于:S
    [ 绝对 ] (1). [UserName] ([KeyName]) <[e-mail]>
    

SSH配置

SSH是连接远程服务器和文件传输的必备工具,大多数情况下,Linux发行版中会预装该工具。下面要做的是生成/导入SSH密钥。

生成SSH密钥(没有SSH密钥)

如果你没有SSH密钥,那么最好的方法就是生成一份,在命令行中执行 ssh-keygen,即可生成全新的SSH密钥。此时命令行中会输出以下信息:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/[user_name]/.ssh/id_rsa): # 此处留空为默认即可
Created directory '/home/[user_name]/.ssh'.
Enter passphrase (empty for no passphrase): # 此处留空为默认即可
Enter same passphrase again: # 此处留空为默认即可
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256: ***
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+

这样,一份SSH密钥就成功生成并设置好了。

导入SSH密钥(已有SSH密钥)

如果你已经有了一份SSH密钥,并想将其导入到SSH配置中,你可以遵照以下步骤操作

  1. 将SSH密钥(通常包括 id_rsa & id_rsa.pub 两个文件)放到 ~/.ssh 目录中(什么?没有这个目录?创建一个啊)
  2. 执行命令 ssh-add
    • 如果执行该命令时遇到报错: Could not open a connection to your authentication agent,请先执行命令 ssh-agent $SHELL,再执行命令 ssh-add。这是由于ssh-agent没有运行,而ssh的密钥管理是托管给ssh-agent的,所以无法正常执行添加密钥的操作。
    • 如果执行该命令时遇到报错: Permissions 0*** for '/home/[user_name]/.ssh/**' are too open.(星号处可能为755 466等较高的访问权限),则请先执行命令 chmod 0700 ~/.ssh/*,再执行命令 ssh-add。这是由于.ssh文件夹或其下的SSH密钥具有的访问权限太开放,ssh认为这不是一个安全的ssh密钥,所以不予添加。

Git配置

Git是一款开源的分布式版本控制系统,它可以方便的帮助你管理项目的代码版本,也可以方便的从Github上Clone别人的库(拿来主义.jpg)。以下是一些常用的Git配置项

core.autocrlf=input # 该配置使git在push代码时总是将文件中的换行符转换为unix(\n)格式,而在clone时不做转换。
core.safecrlf=warn # 该配置使git在push代码时检查代码中是否有换行符混用的情况,并在检出时提出警告
user.email=[github_email] # 该配置应设定为你的GitHub用户名
user.name=[github_user_name] # 该配置应设定为你的GitHub E-mail
user.signingkey=[gpg_key_fingerprint] # 该配置应设定为你想使用的GPG密钥的密钥指纹

使用SSH访问Github

在命令行中运行以下命令来确认你的SSH密钥已经被Github认可

ssh -T git@github.com -p 22

若终端返回以下内容,则你的SSH密钥已被Github认可,可以正常使用SSH来push&clone了

Hi [github_user_name]! You've successfully authenticated, but GitHub does not provide shell access.

解决Git提交时出现GPG签名失败的问题

因为WSL无法弹出GPG签名时需要的密码输入GUI窗口,所以我们需要进行额外的设置。打开 ~/.zshrc ,在里面添加以下代码

# GPG登录
gpg-login() {
  export GPG_TTY=$TTY
  echo "test" | gpg --clearsign > /dev/null 2>&1
}

# GPG登出
gpg-logout() {
  echo RELOADAGENT | gpg-connect-agent
}

之后就可以在提交前先执行 gpg-login 在命令行中登录GPG密钥,避免无法弹出GUI窗口导致签名失败。在使用完后想要立即注销登录时执行 gpg-logout

MySQL安装与配置

安装

  1. 执行 sudo apt install mysql-server 输入密码,等待完成即可
  2. 执行 sudo service mysql start 启动mysql服务。

    注:如果出现报错 su: 警告:无法更改到 /nonexistent 目录: 没有那个文件或目录 ,则请执行以下命令

    sudo service mysql stop
    sudo usermod -d /var/lib/mysql/ mysql
    sudo service mysql start
    

    即可恢复正常

配置

  1. 创建普通用户账号
    CREATE USER '[user_name]'@'[host_ip]' identified by '[passowrd]';
    
    [user_name] 为用户名; [host_ip] 为允许该用户登录的IP,可以用 % 通配符使得该用户可以从任何IP登录,但也需要配置MySQL监听本机外网的3306端口; [passowrd] 为登录密码。
  2. 赋予数据库权限
    GRANT ALL ON '[db_name]'.'[table_name]' FOR '[user_name]'@'[host_ip]';
    
    [db_name] 为数据库名, [table_name] 为数据表名。同样的,它们可以使用通配符 * 来分别指代任何数据库或库内的任何数据表。

奇怪问题 && 疑难杂症

解决screen的 permission denied 报错

请按照以下步骤进行

  1. 执行命令 mkdir ~/.screen && chmod 700 ~/.screen
  2. ~/.zshrc 中添加如下配置(如果使用bash,则在~/.bashrc中添加,其他终端同理)
    export SCREENDIR=$HOME/.screen
    
  3. 执行命令 source ~/.zshrc