因为本人爱折腾的属性,WSL有时候会被整坏。为了避免反复折腾重装WSL时花大量时间找资源和教程,特用此博客记录整合一些WSL管理和配置相关的内容。
存储空间管理
- 清理apt缓存
sudo apt autoclean sudo apt autoremove sudo apt clean
- 清理pip缓存
cd ~/.cache/pip sudo rm -rf *
- 使用
ncdu
工具分析空间占用情况,找出占空间的文件并按需移除。
要使用该工具,在根目录下运行该命令ncdu --exclude /mnt # wsl下排除/mnt
- 别忘了在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这款美化组件。
安装
- 安装
zsh
本体sudo apt install zsh # 然后重启shell # 要检查安装是否成功,请执行以下命令 echo $SHELL # 如果返回结果是类似于/usr/bin/zsh,则安装成功
- 安装
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,可以通过在cmd
或power 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 )
系统语言配置
有时候英语环境用着可能不是很舒服,可以选择切换为中文环境
- 查看系统当前语言环境
echo $LANG
- 查看是否已安装中文语言
locale
- 安装中文语言包
sudo apt install language-pack-zh-hans
- 运行
dpkg-reconfigure locales
并选择en_US.UTF-8
和zh_CN.UTF-8
进行配置, 最后选择zh_CN.UTF-8
为默认语言 - 重启WSL,即可看到修改生效
GPG配置
GPG是目前最流行、最好用的加密工具之一。【相关内容已迁移至隔壁 GPG折腾指北-3.2.1.导入密钥】
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配置中,你可以遵照以下步骤操作
- 将SSH密钥(通常包括
id_rsa
&id_rsa.pub
两个文件)放到~/.ssh
目录中(什么?没有这个目录?创建一个啊) - 执行命令
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安装与配置
安装
- 执行
sudo apt install mysql-server
输入密码,等待完成即可 - 执行
sudo service mysql start
启动mysql服务。注:如果出现报错
su: 警告:无法更改到 /nonexistent 目录: 没有那个文件或目录
,则请执行以下命令sudo service mysql stop sudo usermod -d /var/lib/mysql/ mysql sudo service mysql start
即可恢复正常
配置
- 创建普通用户账号
CREATE USER '[user_name]'@'[host_ip]' identified by '[passowrd]';
[user_name]
为用户名;[host_ip]
为允许该用户登录的IP,可以用%
通配符使得该用户可以从任何IP登录,但也需要配置MySQL监听本机外网的3306端口;[passowrd]
为登录密码。 - 赋予数据库权限
GRANT ALL ON '[db_name]'.'[table_name]' FOR '[user_name]'@'[host_ip]';
[db_name]
为数据库名,[table_name]
为数据表名。同样的,它们可以使用通配符*
来分别指代任何数据库或库内的任何数据表。
奇怪问题 && 疑难杂症
解决screen的 permission denied
报错
请按照以下步骤进行
- 执行命令
mkdir ~/.screen && chmod 700 ~/.screen
- 在
~/.zshrc
中添加如下配置(如果使用bash,则在~/.bashrc
中添加,其他终端同理)export SCREENDIR=$HOME/.screen
- 执行命令
source ~/.zshrc