You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4使用DRM运行Avalonia应用时出现drmModeGetResources失败错误

树莓派4 Raspberry OS Lite下Avalonia DRM模式运行失败排查

问题现象

按官方步骤通过DRM运行Avalonia应用时,触发以下错误:

Unhandled exception. System.ComponentModel.Win32Exception (95): drmModeGetResources failed
   at Avalonia.LinuxFramebuffer.Output.DrmResources..ctor(Int32 fd) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmBindings.cs:line 89
   at Avalonia.LinuxFramebuffer.Output.DrmOutput..ctor(String path) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs:line 30
   at LinuxFramebufferPlatformExtensions.StartLinuxDrm[T](T builder, String[] args, String card, Double scaling) in /_/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs:line 142

相关代码文件

MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:LeanovationHitachi="clr-namespace:LeanovationHitachi"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="480"
        x:Class="LeanovationHitachi.MainWindow"
        HasSystemDecorations="false"
        WindowStartupLocation="CenterScreen"
        Width="800"
        Height="480"
        WindowState="Maximized"
        Title="LeanovationHitachi">
    <LeanovationHitachi:MainView/>
</Window>

MainSingleView.axaml

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:LeanovationHitachi="clr-namespace:LeanovationHitachi"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="LeanovationHitachi.MainSingleView">
    <LeanovationHitachi:MainView/>
</UserControl>

MainView.axaml

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:fa="clr-namespace:Projektanker.Icons.Avalonia;assembly=Projektanker.Icons.Avalonia"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="LeanovationHitachi.MainView"
             Width="800"
             Height="480">
    <Border>
//All my code
</Border>
</UserControl>

Program.cs

using Avalonia;
using Projektanker.Icons.Avalonia;
using Projektanker.Icons.Avalonia.FontAwesome;
using System;
using System.Linq;
using System.Threading;
namespace LeanovationHitachi;

class Program
{
    [STAThread]
    public static int Main(string[] args)
    {
        var builder = BuildAvaloniaApp();
        if (args.Contains("--drm"))
        {
            SilenceConsole();
            return builder.StartLinuxDrm(args);
        }

        return builder.StartWithClassicDesktopLifetime(args);
    }

    private static void SilenceConsole()
    {
        new Thread(() =>
        {
            Console.CursorVisible = false;
            while (true)
                Console.ReadKey(true);
        })
        { IsBackground = true }.Start();
    }

    public static AppBuilder BuildAvaloniaApp()
    {
        return AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .LogToTrace()
            .WithIcons(container => container
                .Register<FontAwesomeIconProvider>());
    }
}

App.axaml.cs

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;

namespace LeanovationHitachi;

public partial class App : Application
{
    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
    }

    public override void OnFrameworkInitializationCompleted()
    {
        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
            desktop.MainWindow = new MainWindow();
        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView)
            singleView.MainView = new MainSingleView();

        base.OnFrameworkInitializationCompleted();
    }
}

排查及解决方法

1. 检查DRM设备权限

DRM设备文件位于/dev/dri/,当前用户需具备访问权限。执行以下命令将用户加入video组:

sudo usermod -aG video $USER

执行后需重新登录或重启系统生效。

2. 显式指定DRM设备路径

默认情况下Avalonia可能无法自动识别正确的DRM设备,启动应用时显式指定设备路径:

./LeanovationHitachi --drm --drm-card=/dev/dri/card0

先通过ls /dev/dri/确认设备列表,常见为card0或card1。也可在代码中固定指定,修改Program.cs中的启动逻辑:

return builder.StartLinuxDrm(args, card: "/dev/dri/card0");

3. 启用树莓派DRM驱动

编辑/boot/config.txt,确保启用KMS/DRM驱动:

  • 注释掉dtoverlay=vc4-fkms-v3d(如果存在)
  • 添加或确保dtoverlay=vc4-kms-v3d存在
    保存后重启树莓派。

4. 安装依赖库

确保系统已安装DRM相关依赖:

sudo apt update && sudo apt install libdrm-dev libgbm-dev

5. 验证Avalonia版本兼容性

确保使用的Avalonia版本与官方教程一致,建议使用最新稳定版,避免版本适配问题。

内容的提问来源于stack exchange,提问作者Larry FisherMac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:12:56