分类 linux 下的文章

宿主机环境:
windows service 2025 数据中心版

虚拟机:ubuntu 22.04

注:
1、测试过ubuntu 24.04,但是微软官方的WSL2-Linux-Kernel暂未支持到24.04,折腾失败,用22.04可正常使用

2、暂时略过怎么安装Hyper-V的过程,网上资料很多

踩坑点:

1、Hyper-V安装Linux虚拟机,需要关闭设置=>安全=>启用安全启动
2、windows service配置直通后,可能会出现虚拟机无法启动的情况
3、出现错误:/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link,需要重新生成软连接,正文会详细讲解

步骤

1. 在 Windows 上添加 GPU 分区到虚拟机

使用管理员权限打开 PowerShell,执行下面命令。将 <vmname> 替换为 Hyper-V 虚拟机的名字。

Set-VM -VMName <vmname> -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1GB -HighMemoryMappedIoSpace 32GB
Add-VMGpuPartitionAdapter -VMName <vmname>

执行完上面的命令后,可以在你的虚拟机执行下面的命令查看设备,如果能正确看到有设备列出,说明 GPU 分区已经添加成功了。

sudo lspci -v

2. 安装 dxgkrnl 驱动

参考 Ubuntu 21.04 VM with GPU acceleration under Hyper-V…?

创建一个脚本文件,例如 driver.sh,内容如下:

#!/bin/bash -e
BRANCH=linux-msft-wsl-5.10.y

if [ "$EUID" -ne 0 ]; then
    echo "Swithing to root..."
    exec sudo $0 "$@"
fi

apt-get install -y git dkms

git clone -b $BRANCH --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel
cd WSL2-Linux-Kernel
VERSION=$(git rev-parse --short HEAD)

cp -r drivers/hv/dxgkrnl /usr/src/dxgkrnl-$VERSION
mkdir -p /usr/src/dxgkrnl-$VERSION/inc/{uapi/misc,linux}
cp include/uapi/misc/d3dkmthk.h /usr/src/dxgkrnl-$VERSION/inc/uapi/misc/d3dkmthk.h
cp include/linux/hyperv.h /usr/src/dxgkrnl-$VERSION/inc/linux/hyperv_dxgkrnl.h
sed -i 's/\$(CONFIG_DXGKRNL)/m/' /usr/src/dxgkrnl-$VERSION/Makefile
sed -i 's#linux/hyperv.h#linux/hyperv_dxgkrnl.h#' /usr/src/dxgkrnl-$VERSION/dxgmodule.c
echo "EXTRA_CFLAGS=-I\$(PWD)/inc" >> /usr/src/dxgkrnl-$VERSION/Makefile

cat > /usr/src/dxgkrnl-$VERSION/dkms.conf <<EOF
PACKAGE_NAME="dxgkrnl"
PACKAGE_VERSION="$VERSION"
BUILT_MODULE_NAME="dxgkrnl"
DEST_MODULE_LOCATION="/kernel/drivers/hv/dxgkrnl/"
AUTOINSTALL="yes"
EOF

dkms add dxgkrnl/$VERSION
dkms build dxgkrnl/$VERSION
dkms install dxgkrnl/$VERSION

注意:BRANCH 的值根据你的系统进行替换,可以执行 uname -a 查看具体需要替换的版本。

然后执行下面的命令安装驱动:

bash driver.sh

3. 从宿主机中拷贝 GPU 驱动到虚拟机

这里主要有两部分的驱动需要拷贝:

  1. 将宿主机中 xxx/Windows/System32/lxss/lib/* 的文件拷贝到虚拟机中的 /usr/lib/wsl/lib/
  2. 将宿主机中 xxx/Windows/System32/DriverStore/FileRepository/nvmdsi.inf_amd64_* 的目录拷贝到虚拟机中的 /usr/lib/wsl/drivers/

这是正常的copy的方式,当然,如果你本机已经安装了wsl,可以直接copy wsl的/usr/lib/wsl/直接到虚拟机中的/usr/lib/wsl/

copy完成后修改驱动的权限:

chmod -R 0555 /usr/lib/wsl

4. 配置动态链接库搜索路径并更新

直接copy过来的libcuda.so.1软链接是不能使用的,需要删除重新生成软连接

sudo rm /usr/lib/wsl/lib/libcuda.so.1
sudo ln -s libcuda.so /usr/lib/wsl/lib/libcuda.so.1

之后配置动态链接库搜索路径并更新

echo "/usr/lib/wsl/lib" > /etc/ld.so.conf.d/ld.wsl.conf
ldconfig

5. 重启虚拟机

【重启,到这没报错就重启虚拟机】
重启后执行下面的命令,查看能否正常输出:

ls -l /dev/dxg
/usr/lib/wsl/lib/nvidia-smi

如果输出正常的话,说明 GPU 直通成功了。(也可以将 nvidia-smi 直接软连接到 /usr/bin/ 目录下,这样就可以直接输入 nvidia-smi 执行)




参考资料:

https://blog.vogelcs.com/2024/05/21/Windows%E4%B8%8B%E7%9B%B4%E9%80%9AGPU%E8%AE%BE%E5%A4%87%E5%88%B0Hyper-V%E7%9A%84Ubuntu%E8%99%9A%E6%8B%9F%E6%9C%BA/

【hyper-v虚拟机安装ubuntu,免费开源linux桌面操作系统,详细安装教程】 https://www.bilibili.com/video/BV1QG411e7pn/?share_source=copy_web&vd_source=a8cb3aa675ec9bad747e8b96437b52da

【虚拟机打游戏,Hyper-V使用独立显卡教程】 https://www.bilibili.com/video/BV1o84y1y7i3/?share_source=copy_web&vd_source=a8cb3aa675ec9bad747e8b96437b52da

服务器资源

数量:3
CPU:2
内存:4

具体信息如下表:
| 系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
| :------: | :--------: | :-------: | :-----: | :---------: | :-----: |
| centos-7.5 | 192.168.31.92 | master | 2h | 4G | node-1 |
| centos-7.5 | 192.168.31.93 | master | 2h | 4G | node-2 |
| centos-7.5 | 192.168.31.94 | worker | 2h | 4G | node-3 |

- 阅读剩余部分 -

系统:Ubuntu 20.04.4 LTS

软件:dnsmasq

安装dnsmasq

apt install dnsmasq -y

操作dnsmasq的常用命令


service dnsmasq status # 查看状态
service dnsmasq stop # 停止
service dnsmasq restart # 重启
service dnsmasq start # 启动

关闭systemd-resolve

因为systemd-resolve服务会占用53端口,如果我们的DNS服务要绑定到0.0.0.0上,就会有冲突。

systemctl stop systemd-resolved # 关闭systemd-resolve

systemctl disable systemd-resolved  # 也可以用mask完全屏蔽

修改配置

安装好dnsmasq之后,默认的配置在/etc/dnsmasq.conf

创建一个目录,用来放自定义的dnsmasq配置文件

mkdir /data/dnsmasq

创建上级DNS配置文件

touch /data/dnsmasq/resolv.conf

内容如下

nameserver 119.29.29.29
nameserver 114.114.114.114
nameserver 8.8.8.8

创建dnsmasq.d目录,用来存放自定义的配置

mkdir /data/dnsmasq/dnsmasq.d

创建自定义hosts文件

touch /data/dnsmasq/dnsmasq.hosts

之后修改配置文件

# 端口,默认53
port=53


# 上级DNS配置
resolv-file=/data/dnsmasq/resolv.conf

# 开启严格顺序,这样查询上级DNS会从上到下依次查询
strict-order

# 修改监听配置,0.0.0.0允许任何IP访问
listen-address=0.0.0.0

# 自定义host
addn-hosts=/data/dnsmasq/dnsmasq.hosts

# 指向自定义配置目录
conf-dir=/data/dnsmasq/dnsmasq.d,*.conf

创建解析

解析说明:

# SRV 记录
#srv-host=<_service>.<_prot>.[<domain>],[<target>[,<port>[,<priority>[,<weight>]]]]
# A, AAAA 和 PTR 记录 
#host-record=<name>[,<name>....],[<IPv4-address>],[<IPv6-address>][,<TTL>]
# TXT 记录
#txt-record=<name>[[,<text>],<text>]
# PTR 记录 
#ptr-record=<name>[,<target>]
#naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
# CNAME 别名记录
#cname=<cname>,<target>[,<TTL>]

比如说我现在需要把test.ibfpig.com通过A记录解析到本地的127.0.0.1

创建一个conf文件,比如ibfpig_com.conf

内容如下:

host-record=test.ibfpig.com,127.0.0.1

比如说我现在需要把*.ibfpig.top这样的泛域名解析到192.168.1.1

就可以追加内容如下:


address=/.ibfpig.top/192.168.1.1


修改配置文件后需要重启服务

Elasticsearch从6.8开始,就已经允许免费用户使用X-Pack的安全功能,如此,裸奔的ES就有基础的安全认证了

我们基于docker-compose来搭建该环境

先找个目录来存放docker-compose.yaml以及es的数据和日志等文件

我这里存放在~/DockerFile/es

创建docker-compose文件以及数据文件

mkdir work # 数据和日志都会放这里
mkdir work/data # 存放数据
mkdir work/logs # 存放日志
touch work/elasticsearch.yml # es相关配置
touch work/kibana.yml  # kibana相关配置

- 阅读剩余部分 -

今天在deepin的系统里使用docker login的时候,提示了如下错误

Error saving credentials: error storing credentials - err: exit status 1, out: `Cannot autolaunch D-Bus without X11 $DISPLAY`

遇事不解先Google

找到了前人的解决办法,原文在这

sudo apt install gnupg2 pass # 安装gnupg2 pass
gpg2 --full-generate-key # 生成证书

一路确认就可以了,是在我自己的虚拟机上用,所以没有设置任何的密码,过期时间也设置的是0

gpg2 -k
pass init "whatever key id you have" # 前一步trustdb.gpg的路径

之后再执行docker login就没有任何问题了

出现这个问题的原因:

原文有这样提到:

再往下看 Issue,感谢 chriswue 给出的详细回答,他提到这是在 Ubuntu (Mint 同样是基于 Ubuntu 的发行版)下使用 docker 特有的 bug ,而修复办法不需要特意去卸载 docker-compose ,只要 “pass” 掉验证步骤。