在Ubuntu 20.04.6 LTS上安装AMD核显驱动

本文基于AMD ROCm官方文档经过摸索形成,请参考官网文档:

https://rocm.docs.amd.com/projects/install-on-linux/en/docs-6.1.5/how-to/native-install/ubuntu.html

近日购入AMD 9900X提高生产力,但没买独立显卡,发现AMD核显驱动的一些问题。目前,AMD官网能找到的最新显卡驱动只支持Ubuntu22.04以上的版本,以为老版本的已经找不到了,于是从20.04升级到22.04,发现docker貌似是不支持AMD核显直通的…--gpus只对NVIDIA显卡生效,于是用rviz就很卡…所以装回Ubuntu20.04,研究如何安装AMD核显驱动。

经过研究发现,ROCm有历史版本的页面,如上文所述。经验证,6.1.5是最后一个具有Ubuntu20.04源的版本。

添加gpg key

这一部分是从官网扒下来的

# Make the directory if it doesn't exist yet.
# This location is recommended by the distribution maintainers.
sudo mkdir --parents --mode=0755 /etc/apt/keyrings

# Download the key, convert the signing-key to a full
# keyring required by apt and store in the keyring directory
wget https://repo.radeon.com/rocm/rocm.gpg.key -O - | \
    gpg --dearmor | sudo tee /etc/apt/keyrings/rocm.gpg > /dev/null

添加内核驱动源

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/rocm.gpg] https://repo.radeon.com/amdgpu/6.1.2/ubuntu focal main" \
    | sudo tee /etc/apt/sources.list.d/amdgpu.list
sudo apt update

安装amdgpu-install

这里官网是直接装了amdgpu-dkms,在添加内核模块时gnome报错了,且重启后startx提示无法识别amdgpu。所以转而利用amdgpu-install来安装。

sudo apt install amdgpu-install -y

使用amdgpu-install安装图形驱动

然后关键的一步,

amdgpu-install --usecase=graphics

而后会提示“配置文件和maintainer不符,是否更改为maintainer中的版本”

这里输入Y,和maintainer进行同步。

p.s. 这里本想添加--no-dkms不编译进内核,结果忘记了,开始写内核模块的时候以为又寄了,结果重启后没出问题,我不理解…

发现AMD核显驱动已经打上了。

验证

进入设置->关于,发现显卡已经不是llvm-pipe了,说明安装成功了,这下用rviz终于不卡了。

在这里插入图片描述

利用mesa-utils包中的glxinfo:

glxinfo -B | grep renderer

Extended renderer info (GLX_MESA_query_renderer):
OpenGL renderer string: AMD Radeon Graphics (radeonsi, raphael_mendocino, LLVM 17.0.6, DRM 3.57, 5.15.0-136-generic)
Java调用海康威视/ISAPI/Streaming/channels/1/picture的接口需要使用HTTP请求,并且在请求头中添加Digest认证信息。以下是一个示例代码: ```java import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class HKWSDigestAuth { public static void main(String[] args) throws Exception { String username = "admin"; // 用户名 String password = "12345"; // 密码 String url = "http://192.168.1.100/ISAPI/Streaming/channels/1/picture"; // 图片接口地址 HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); // 添加Digest认证信息 String digest = getDigest(username, password, "GET", "/ISAPI/Streaming/channels/1/picture"); connection.setRequestProperty("Authorization", "Digest " + digest); // 发送请求 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应数据 InputStream inputStream = connection.getInputStream(); // 处理响应数据 // ... } else { // 处理错误响应 // ... } } // 获取Digest认证信息 private static String getDigest(String username, String password, String method, String uri) throws IOException { String realm = "IP Camera"; // 固定值 String nonce = getNonce(); // 随机值 String opaque = ""; // 固定值 String qop = "auth"; // 固定值 String algorithm = "MD5"; // 固定值 String ha1 = md5(username + ":" + realm + ":" + password); String ha2 = md5(method + ":" + uri); String cnonce = getCNonce(); String response = md5(ha1 + ":" + nonce + ":" + nc() + ":" + cnonce + ":" + qop + ":" + ha2); return "username=\"" + username + "\", realm=\"" + realm + "\", nonce=\"" + nonce + "\", uri=\"" + uri + "\", algorithm=\"" + algorithm + "\", qop=\"" + qop + "\", nc=\"" + nc() + "\", cnonce=\"" + cnonce + "\", response=\"" + response + "\", opaque=\"" + opaque + "\""; } // 获取随机值 private static String getNonce() { return Long.toHexString(System.currentTimeMillis()); } // 获取随机值 private static String getCNonce() { return Long.toHexString(System.currentTimeMillis()); } // 获取请求计数器 private static String nc() { return "00000001"; } // 计算MD5值 private static String md5(String str) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] array = md.digest(str.getBytes()); return Base64.getEncoder().encodeToString(array); } catch (java.security.NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } } ``` 其中,getDigest()方法用于生成Digest认证信息,getNonce()和getCNonce()方法用于生成随机值,nc()方法用于生成请求计数器,md5()方法用于计算MD5值。在main()方法中,我们首先发送一个GET请求到图片接口,并且在请求头中添加Digest认证信息。如果响应码为HTTP_OK,则表示请求成功,我们可以从响应数据流中读取图片数据并进行处理。否则,表示请求失败,我们需要根据响应码进行相应的错误处理。 需要注意的是,Digest认证信息中的nc和cnonce参数需要根据实际情况进行计算,nc表示请求计数器,每次请求需要递增,cnonce表示随机值,每次请求需要生成不同的值。另外,在计算MD5值时,需要用到Base64编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyre丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值