没有理想的人不伤心

WSL-Ubuntu 整活记录

2023/11/11
1
0

image.png

文档:设置 WSL 开发环境 | Microsoft Learn

WSL下载Linux安装

  1. 在windows功能中启用“虚拟机平台”和“适用于Linux的Windows子系统”

1722081694230-673a4840-b195-45bf-b2b5-3c5c7f120f97.png

  1. 重启后打开终端输入wsl.exe --update安装WSL相关组件
  2. 在Microsoft Store中下载Linux,可以是Ubuntu、Debian等等
    我这里下载的是Debian
  3. 在Microsoft Store中打开,设置用户名和密码

apt换源

文件位置(24.04)/etc/apt/sources.list.d/ubuntu.sources

注意不是/etc/apt/sources.list,这是22.04

参考ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

22.04

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

24.04

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
# Types: deb-src
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble noble-updates noble-backports
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# Types: deb-src
# URIs: http://security.ubuntu.com/ubuntu/
# Suites: noble-security
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# 预发布软件源,不建议启用

# Types: deb
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

# # Types: deb-src
# # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# # Suites: noble-proposed
# # Components: main restricted universe multiverse
# # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

更新源

sudo apt-get update

sudo apt-get upgrade

配置深度学习环境

nVidia驱动注意事项

对不同的显卡可以到官网下载最新驱动,必须选择GeForce game ready版本的,而不是studio!否则不支持wsl

只需要在windows安装驱动即可,不要在wsl的linux中安装任何驱动!

如果在wsl已经配置好环境后,在Windows更新驱动,会出现nvidia-smicommand not found的情况,只需要将/usr/lib/wsl/lib/nvidia-smi加入到环境变量PATH中。

安装anaconda

wget从清华源下载sh安装脚本wget --user-agent=“Mozilla” https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.06-1-Linux-x86_64.sh

不加--user-agent=“Mozilla”会报错403forbidden

参考链接Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

根据提示安装即可:bash Anaconda3-2024.06-1-Linux-x86_64.sh

1723798523368-8f22b3d3-fe53-4b8a-937e-32b5091f2846.png

初始化anaconda选择yes

使用conda报错not found:设置环境变量

vim ~/.bashrc

在其中加入export PATH=$PATH:/home/aii/software/anaconda3/bin

更新环境变量:source .bashrc

验证:conda -V

换源:在用户目录下创建touch ~/.condarc加入以下内容

anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/

安装cuda-toolkit

使用nvidia-smi查看当前显卡驱动可以安装的最高cuda版本,比如这里最高可以安装的cuda-toolkit的版本是12.4

1723798711631-6d7afd76-4df7-4fe5-99aa-7c501d0a393a.png

参考CUDA Toolkit Archive | NVIDIA Developer

选择对应版本,使用提供的命令安装即可,安装runfile(local)版本,其他两个会自动更新到最新版本的cuda,即使你的显卡驱动并不适配,我也不知道为啥

这里我安装的是11.8(环境需要)

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

1723798892122-7b4981b5-070f-4f1a-90a3-ba100da52492.png

设置环境变量

export PATH=/usr/local/cuda-11.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-11.4

vim ~/.bashrc

检查安装成功:nvcc -V

安装cuDNN

cuDNN Archive | NVIDIA Developer

下载对应的tar.xz文件,

解压tar -xf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz

将cudnn中的文件放入cuda中:

sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/include/* /usr/local/cuda-11.8/include
sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64

分配权限

sudo chmod a+r /usr/local/cuda-11.8/include/cudnn.h
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*

检查是否成功:cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

1723708191877-7c0d8530-f47b-4a23-b4ba-3e36a2c91a9c.png

安装pytorch

先在conda中创建环境:conda create -n [name] python=[version]

激活环境:conda acticate [name]

Start Locally | PyTorch

选择对应版本,使用他提供的命令就行,但是最好是能科学上网,否则大概率失败

如:conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

安装低版本的GCC

在Ubuntu24.04安装低版本的GCC时,需要先添加旧版本的源

sudo cat <<EOF | sudo tee /etc/apt/sources.list.d/gcc-8.list
deb http://old-releases.ubuntu.com/ubuntu/ impish main restricted universe multiverse
EOF

sudo apt update
apt-cache policy g++-8
apt-cache show g++-8
sudo apt install g++-8 gcc-8

查看系统中存在的gcc版本:ls /usr/bin/gcc*

查看g++存在的版本:ls /usr/bin/g++*

GCC\G++版本切换

使用 update-alternatives 工具创建多个 GCC 和 G++ 编译器替代方案的列表

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13

更换GCC:sudo update-alternatives --config gcc

1723623852240-157aaba6-dc3d-4a09-ad45-419b4f6e50a8.png

更换g++:sudo update-alternatives --config g++

1723623916848-b6771ec0-b774-47d4-b182-73588450d0e3.png

安装旧版clang

/etc/apt/sources.list添加以下内容:

# 10
deb http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main
deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-10 main

添加key

wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -

更新源:sudo apt-get update

下载:sudo apt-get install clang-10

Clang\clang++版本切换同理

# for clang-10.0
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-10 1 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-10
# for clang-14.0
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-14 2 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-14
# for clang-18.0
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 3 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-18

切换:sudo update-alternatives --config clang

1724327227450-40bfc19a-0722-426d-a88c-54f922bca70b.png

科学上网管理

~/.bashrc中添加

host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export http_proxy="http://$host_ip:[端口]"
export https_proxy="http://$host_ip:[端口]"

代理管理:

创建一个脚本proxy_on_off.sh,参数:on、off

#!/bin/bash

# 获取当前的代理状态
proxy_status=$(grep -c "export http_proxy" ~/.bashrc)

# 检查是否有传递的参数
if [[ "$1" == "on" ]]; then
    if [[ $proxy_status -eq 0 ]]; then
        host_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d " ")
        echo "export http_proxy=\"http://$host_ip:7890\"" >> ~/.bashrc
        echo "export https_proxy=\"http://$host_ip:7890\"" >> ~/.bashrc
        export http_proxy="http://$host_ip:7890"
        export https_proxy="http://$host_ip:7890"
        echo "代理已启用"
    else
        echo "代理已经启用"
    fi
elif [[ "$1" == "off" ]]; then
    if [[ $proxy_status -eq 1 ]]; then
        sed -i '/export http_proxy/d' ~/.bashrc
        sed -i '/export https_proxy/d' ~/.bashrc
        unset http_proxy
        unset https_proxy
        echo "代理已禁用"
    else
        echo "代理已经禁用"
    fi
    # 彻底删除所有代理配置
    unset ALL_PROXY HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY
    unset all_proxy http_proxy https_proxy ftp_proxy no_proxy
else
    echo "用法: $0 {on|off}"
fi

# 强制刷新当前终端
exec bash

WSL 2.2.1 版本以后默认启用了 DNS 隧道, 会导致该方法失效。在 C:\Users\<UserName>\.wslconfig 文件中 (如果不存在就手动创建一个) 加入以下内容以关闭 DNS 隧道:

[wsl2]
dnsTunneling=false

设置root用户也能使用代理:

sudo visudo

在其中把对应内容的注释取消

1723810640128-ef49f91a-0938-4fac-9e46-02656cc99920.png

export http_proxy=“http://192.168.182.2:7890

export https_proxy=“http://192.168.182.2:7890

git配置代理

wsl中配置git代理:

git config --global http.proxy http://windowsip:7890

git config --global https.proxy http://windowsip:7890

验证代理配置:

git config --global --get http.proxy

git config --global --get https.proxy

取消代理:

git config --global --unset http.proxy

git config --global --unset https.proxy


配置文件中启动 systemd 后,code .命令不能正常使用

.wslcong中开启 systemd 后,code .命令能打开 vscode,但是不能正常打开任何文件。

本以为是开启 systemd 后的 wsl 架构发生变化,没曾想,在我安装 ssh-server 服务后,又重新恢复正常了

问题解决步骤:

  1. code .发现不正常
  2. vscode 通过 ssh 连接的 wsl,那么既然 vscode 不能正常连上 wsl,尝试在 windows 连接 wsl,仍然失败,显示拒绝服务
  3. 网上搜索"wsl 打开 systemd 后 ssh 失效",并没有直接解决方法
  4. 机缘巧合之下,想着既然连不上,那就安装一个 ssh 服务试试
    sudo apt install openssh-server
  5. 安装好后,windows 正常连接了 wsl
  6. 回到 wsl,执行code .命令竟然恢复了正常

喜出望外、意外之喜啊。

原因分析:应该是原先的 sshd 守护进程服务并不在 systemd 下,是打开 systemd 后,系统架构发生变化导致 ssh 服务失效。重新下载 ssh-server 服务后,该服务由 systemd 接管。

Linux迁移到其他盘(F盘)

打包输出到F盘wsl --export Debian F:\Debian.tar

在WSL中取消挂载Debian wsl --unregister Debian

重新挂载Debian wsl --import Debian F:\wsl2\Debian F:\Debian.tar