Skip to content

wsl使用

2230字约7分钟

2025-04-07

wsl2/linux使用踩坑

记录一些学到的linux命令

#linux 更新

sudo apt update&& apt upgrade

#ps(process status) 查看进程状态的命令
ps -ef | grep apt
ps -ef| grep dpkg
#查看
#lsof(list open files) 查看进程打开的文件,打开文件的进程端口
sudo lsof /var/lib/dpkg/lock  
sudo lsof /var/lib/dpkg/lock-frontend
#有些时候dpkg被其他进程占用导致上锁,查看占用进程 根据报错查看文件占用

#添加非官方源的包存储库
sudo add-apt-repository ppa:xtradeb/apps -y

#安装apt-fast多线程下载工具
sudo apt install axel
sudo add-apt-repository ppa:apt-fast/stable
sudo apt -y install apt-fast 
#中间配置后
sudo nano /etc/apt-fast.conf
MIRRORS=('')
#镜像地址

echo 'export PATH="/home/yuzhiy/tool/llvm20/bin:$PATH"' >> ~/.bashrc

echo 'export LD_LIBRARY_PATH=~/tools/x86_64-linux-gnu/runtimes/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
//下载glibc,glibc版本不够时下载编译升级,还没搞完
wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.38.tar.

#解压 参数
x 解压
z 对应gzip
v 显示过程
f 压缩文件的名字 
tar -zxvf  

tar -xvf file.tar //解压 tar包

tar -xzvf file.tar.gz //解压tar.gz

tar -xjvf file.tar.bz2   //解压 tar.bz2

tar -xZvf file.tar.Z   //解压tar.Z

unrar e file.rar //解压rar

unzip file.zip //解压zip

#ls 查找
ls -1 --format=single-column //单列输出
ls -a  --all  //列出所有文件包括以. 开头的文件
ls -1 /usr/bin | grep '^c' //列出所有c开头的文件
ls /usr/bin/c* 列出该路径下c为首字母的文件,但是非首字母的文件也会输出,只是c开头的会强调

#grep Global Regular Expression Print 其实就是文本查找
grep [options] pattern [files]
^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行
grep ^c file //其中文件可以时多文件,如果不指定则为默认输入stdin
grep ^c file1 file2 file3 ...
^    # 锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$    # 锚定行的结束 如:'grep$' 匹配所有以grep结尾的行。
.    # 匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*    # 匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   # 一起用代表任意字符。   
[]   # 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  # 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
(..)  # 标记匹配字符,如'(love)',love被标记为1。    
<      # 锚定单词的开始,如:'<grep'匹配包含以grep开头的单词的行。    
>      # 锚定单词的结束,如'grep>'匹配包含以grep结尾的单词的行。    
x{m}  # 重复字符x,m次,如:'0{5}'匹配包含5个o的行。    
x{m,}   # 重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。    
x{m,n}  # 重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5--10个o的行。   
\w    # 匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    # \w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    # 单词锁定符,如: '\bgrep\b'只匹配grep。 

#查找多模式时需要用到\做转义字符
例如 
grep '^\(c\|b\|d\)' file1 
需要添加转义字符 | 表示或逻辑 此处输出 有所有以c或b或d开头的查找内容
也可以使用-E 扩展
grep -E '^(c|b|d)'  file1  此处表达和上述相同的逻辑

echo this is a test line. | grep -o -E "[a-z]+."
this
is
a
test
line.

 history | grep ls

以下文件为file1

#include <cstddef>
#include <mdspan>
#include <print>
#include <vector>
 
int main()
{
    std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
 
    // 将数据视作表示 2 行每行 6 个 int 的连续内存
    auto ms2 = std::mdspan(v.data(), 2, 6);
    // 将相同数据视作 2 x 3 x 2 的三维数组
    auto ms3 = std::mdspan(v.data(), 2, 3, 2);
 
    // 使用二维视图写入数据
    for (std::size_t i = 0; i != ms2.extent(0); i++)
        for (std::size_t j = 0; j != ms2.extent(1); j++)
            ms2[i, j] = i * 1000 + j;
 
    // 使用三维视图读回数据
    for (std::size_t i = 0; i != ms3.extent(0); i++)
    {
        std::println("slice @ i = {}", i);
        for (std::size_t j = 0; j != ms3.extent(1); j++)
        {
            for (std::size_t k = 0; k != ms3.extent(2); k++)
                std::print("{} ", ms3[i, j, k]);
            std::println("");
        }
    }
}

配环境

安装llvm工具链

https://apt.llvm.org/的脚本,注意安装的时候装全部

#测试的时候指定版本就算你只下了一个版本
clang++-20 --version
#写一个main测试一下
clang++-20 main.cpp -o main -std=c++23 -stdlib=libc++ -fuse-ld=lld -lc++ 
#下面这些参数都是可选项-v,是--verbose 报错的时候详细查看执行了哪些命令
-rtlib=compiler-rt -unwindlib=libunwind  -lc++abi -lunwind -v
# 安装的时候要是没 指定all,可能导致少一些组件
sudo ./llvm.sh <version number> all #少这个all
这时候可以手动装

安装git 对Ubuntu系统来说,添加包源在apt能装上最新的。ubuntu直接apt install有的包太老了

 add-apt-repository ppa:git-core/ppa
 apt update; apt install git
 #测试一下
git --version

安装cmake

在wsl装cmake 用wget有时候443 .直接在本机下在通过文件管理器复制到对应文件下。 然后执行

wget https://github.com/Kitware/CMake/releases/download/v4.0.1/cmake-4.0.1-linux-x86_64.sh
#或者这是为了解决443问题,不过我试了没什么用
 wget --user-agent="Mozilla/5.0" https://github.com/Kitware/CMake/releases/download/v4.0.1/cmake-4.0.1-linux-x86_64.sh
# 路径指定/usr/local 或者/usr都行都是系统路径都能找到
  sh cmake-4.0.1-linux-x86_64.sh --prefix=/usr/local --exclude-subdir
#测试一下
  cmake --version

安装ninja

注意ninja包叫ninja-build就行,光输ninja找不到包。不过包有些老1.10.1,最新都1.12了凑合用。不过ninja不管在linux或win上都是一个可执行文件可以直接解压完扔/usr/bin 或者/usr/local/bin 里,也不用包管理了

apt install ninja-build

以上除了cmake都是用apt包管理安装的,卸载的时候直接sudo apt remove <包名> 就行。cmake怎么删我还没不知道

配ssh

为了在Windows上远程链接wsl或者虚拟机得配ssh链接。

在虚拟机/wsl下

虚拟机一般都装了网络工具,如果ifconfig -a不起作用就装一个

sudo apt install  net-tools 

ifconfig -a
#显示以下内容
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.31.94.122  netmask 255.255.240.0  broadcast 172.31.95.255
        inet6 fe80::215:5dff:fedf:adaa  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:df:ad:aa  txqueuelen 1000  (Ethernet)
        RX packets 46384  bytes 91260644 (91.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 25980  bytes 2221307 (2.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 128  bytes 12099 (12.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 128  bytes 12099 (12.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# 只需要inet后的ip地址 172.31.94.122 就好

安装openssh-server

sudo apt install openssh-server 
#安装ssh

sudo  service  sshd  start
#(启动 ssh)

sudo service ssh --full-restartd 
#修改配置文件后重启ssh

sudo systemctl enable ssh  
#设置自动启动

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup 
#备份设置

sudo nano /etc/ssh/sshd_config
#将下列内容复制其中
Port 22 
UsePrivilegeSeparation no 
PasswordAuthentication yes 
PermitRootLogin yes 
AllowUsers yuzhiy 
RSAAuthentication yes 
PubKeyAUthentication yes
#注意AllowUsers 后面是本地登录的用户名我是 yuzhiy

安装完成后用ssh生成密钥 注意用新算法ed25519,不要用rsa了.后跟GitHub的邮箱

ssh-keygen -t ed25519 -C "ImoutoCon1999@outlook.com"

连续三次回车即可,第一次问你私钥路径,不搞什么幺蛾子都放默认路径里

Enter file in which to save the key  (/home/yuzhiy/.ssh/id_ed25519):

第二次问你 这个私钥要不要加密码 一般是不加直接回车

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

然后显示你的公钥路径和公钥内容

Your public key has been saved in /home/yuzhiy/.ssh/id_ed25519.pub
The key fingerprint is:
xxxx一堆乱起八糟公钥

直接把公钥复制到 github主页>>setting(设置)>>SSH and GPG keysnew SSH key

测试一下

ssh -T git@github.com
#显示如下内容就没啥问题了
Hi Yuzhiy05! You've successfully authenticated, but GitHub does not provide shell access.

然后直接用git 拉代码

在本机vscode里

在vscode 里安装微软的SSH插件 Remote-SSH Remote-SSH:Editing Configuration Files Remote EXplorer

ctrl+shift+p 打开命令面板 找到remote-ssh插件 Open Configuration File 当然可以在C:User/<用户名>/.ssh/config 直接打开 复制以下内容,直接在文件资源管理器里打开可能需要管理员权限

Host Ubuntu-WSL 
    HostName 172.31.x.xxx #服务器ip 虚拟机ifconfig那个
    User yuzhiy # 服务器上的用户名
    Port 22 # ssh端口,一般默认22, 可以修改

在vscode的设置json中复制以下内容

"remote.SSH.remotePlatform":{
    "ubuntu_remote": "linux"  // 远程连接时,自动选择linux系统,注意和上面的"host"匹配
},
"remote.SSH.useLocalServer":true,  // 使用本地服务器

测试一下

ssh yuzhiy@<ip_address>
#输入密码 链接成功进入命令行界面