コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2024年10月2日 >>> 2024年9月19日
link もっと後

2024年10月2日

VirtualBoxでxrdpのエラーを再現できるか挑戦

目次: Linux

昨日(2024年10月1日の日記参照)のUbuntu 22とxrdpの組み合わせで起きるエラーですが、VirtualBox 7.0.18で再現できるかやってみました。グラフィクスはVMSVGAを選択しています。VMSVGAは/dev/driの下にcard0とrenderD128が生成されるようです。ちなみにgdm3は終了させてxrdpのみ起動しています。

ちなみに結論から言っておくと再現しません。以下が通常時のログです。正常に画面が表示されます。

VirtualBox&Ubuntu 22.04 LTSのgnome-session-binaryのログ
gnome-session-binary[2774]: DEBUG(+): Enabling debugging
gnome-session-binary[2774]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’

ログにはデバッグ有効であることと、libEGLが何かしら見つけて反応しています。それ以外は特に何も出ません。

次にcard0とrenderD128をリネームしてアクセスできないようにして試しました。しかし正常に画面が表示されます。えぇー?ログは下記のようになりました。

card0とrenderD128をリネームした時のログ
gnome-session-binary[4319]: DEBUG(+): Enabling debugging
gnome-session-check-accelerated: GL Helper exited with code 512
libEGL warning: DRI2: failed to authenticate
gnome-session-check-accelerated: GLES Helper exited with code 512
gnome-session-binary[4319]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’

AMDのGPUでも見かけたfailed to authenticateが出ています。が、エラーは無視されるんでしょうか?謎の動きですね。

編集者:すずき(2024/10/05 15:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年10月1日

Ubuntu 22.04のxrdpに接続できない病

目次: Linux

WindowsからUbuntu 22.04 LTSのxrdpに接続すると真っ黒な画面しか出ず、すぐに接続が切断されてしまう問題に遭遇しました。どこでクラッシュしているか調べるため、xrdpがGNOMEを起動するところまでを追いかけると下記のようになっていました。

xrdpがXsessionを起動するまでの呼び出し経路
/etc/xrdp/startwm.sh
  exec /bin/sh /etc/X11/Xsession
    /etc/X11/Xsession.d/99x11-common_start
      /usr/bin/ssh-agent /usr/bin/im-launch x-session-manager
        /usr/bin/x-session-manager
          /usr/libexec/gnome-session-binary

スクリプトx-session-managerを書き換えてgnome-session-binaryの引数に--debugを足すと、GNOMEはより詳細なメッセージを出力します。メッセージはホームディレクトリの.xsession-errorsに記録されます。GNOMEのエラーメッセージは下記です。

GNOMEのエラーメッセージ
** (gnome-session-check-accelerated-gles-helper:3301100): WARNING **: 13:50:04.884: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[3300977]: DEBUG(+): hardware acceleration check failed: Child process exited with code 1
gnome-session-binary[3300977]: GLib-DEBUG(+): setenv()/putenv() are not thread-safe and should not be used after threads are created
gnome-session-binary[3300977]: GLib-DEBUG(+): posix_spawn avoided (fd close requested)
gnome-session-is-accelerated: No hardware 3D support.
gnome-session-check-accelerated: GL Helper exited with code 256    ★★ここでエラーが発生している
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)

** (gnome-session-check-accelerated-gles-helper:3301174): WARNING **: 13:50:09.927: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[3300977]: WARNING: software acceleration check failed: Child process exited with code 1
gnome-session-binary[3300977]: CRITICAL: We failed, but the fail whale is dead. Sorry....

エラーメッセージ曰くamdgpu_get_auth()が失敗しています。関数名から推測するにAMDのGPUが装着されているマシンでしか発生しないエラーなのかもしれません。この関数は何者なのかDRMのソースコード(Mesa/libdrmのソースコードリポジトリへのリンク)を見ると、

libdrmのソースコード

// drm/amdgpu/amdgpu_device.c

/**
* Get the authenticated form fd,
*
* \param   fd   - \c [in]  File descriptor for AMD GPU device
* \param   auth - \c [out] Pointer to output the fd is authenticated or not
*                          A render node fd, output auth = 0
*                          A legacy fd, get the authenticated for compatibility root
*
* \return   0 on success\n
*          >0 - AMD specific error code\n
*          <0 - Negative POSIX Error code
*/
static int amdgpu_get_auth(int fd, int *auth)
{
	int r = 0;
	drm_client_t client = {};

	if (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER)
		*auth = 0;
	else {
		client.idx = 0;
		r = drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client);    //★★エラーを返すのはこの関数だけ★★
		if (!r)
			*auth = client.auth;
	}
	return r;
}


// drm/xf86drm.c

/**
 * Call ioctl, restarting if it is interrupted
 */
drm_public int
drmIoctl(int fd, unsigned long request, void *arg)
{
    int ret;

    do {
        ret = ioctl(fd, request, arg);    //★★drmIoctl()はioctl()が返すエラーをそのまま返す★★
    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
    return ret;
}

ソースコードから推測するにグラフィクス系のデバイスファイルにioctl()しようとして失敗しているものと思われます。

XのグラフィックスはDRI(Direct Rendering Infrastructure)と呼ばれるインタフェースを経由してGPUを使用します。Xとカーネルの間にはlibDRMがおり、libDRMはLinuxカーネルのDRM(Direct Rendering Manager)を使用してGPUにアクセスします。DRMのデバイスファイルは/dev/driディレクトリの下にありますが、名前がDRIだったりDRMだったりして謎ですね。グラフィクス周りはあまり詳しくなくて理由はわかりません……。

DRMのデバイスファイルの例
# ls /dev/dri/* -la

crw-rw-rw-+ 1 root video  226,   0  4月 30 15:00 /dev/dri/card0
crw-rw-rw-+ 1 root render 226, 128  4月 30 15:00 /dev/dri/renderD128

上記のようにキャラクタデバイス/dev/dri/card0と/dev/dri/renderD128のパーミッションを0666にしたところエラーが出なくなりました。今回はこの2つのデバイスファイルで解決しましたが、他のデバイスファイルにもアクセスしていた場合はさらに調査が必要かもしれません。グラフィクス系のエラーは簡単に調べる方法がないのが辛いですね。

ちなみにこの症状はQEMUだと再現しません。card0のパーミッションを0000にするとlibEGLがエラーになるのですが、なぜかGNOMEはエラーを無視して起動してしまいます。AMDのときだけなんで止まるんでしょうか。いまいち釈然としません……。

編集者:すずき(2024/10/05 15:07)

コメント一覧

  • hdkさん(2024/10/03 08:30)
    おー、面白いですね。xrdpはすでに立ち上がっているVNCサーバーにつなぐ設定しかしたことがなくて、startwm.shなんてスクリプトがあったとは...
    この前WaylandのWestonを少し触ったんですが(ちなみにWestonにもRDPやVNCを提供する機能もあります)、その時にrendererにCPUを使うかGPUを使うかの選択肢がありました。Container上でXwaylandとXアプリケーションを走らせてホスト側Weston上に出すみたいなことをしたんですけど、GPUを使う設定だとXwaylandがDRMデバイスを探してしまってcontainerからアクセスできないのでエラーになるというのがありました。
    それで、QEMUだと再現しないというのは、まともなハードウェアアクセラレーションがないのでソフトウェアレンダリングになっているのかな、と思いました。
    /dev/driはkvmと同様にローカルのログインユーザーにはudevのuaccessでアクセス権が与えられていますね。
  • すずきさん(2024/10/03 10:12)
    私は逆にVNCサーバーに繋ぐ使い方をしたことがなくて、違いがわかってないです。あと今回調べて初めて構造を知ったので、正しいのか若干不安です。
    Westonは触ったことないですねえ。しかもコンテナ内でもないから普通に動作してほしいところです。

    GNOMEがハードウェアレンダリングかソフトウェアレンダリングかどちらを選択したのか確認しなかったですね。ログに出るかな?
    パーミッションに関してはおっしゃる通りで/dev/driは通常パーミッションの問題は発生しないですが、なぜか今回は変な現象が発生しました。AMDのGPUだと何かあるのかなあ……?
  • hdkさん(2024/10/03 19:05)
    GNOMEをお使いでしたら今はWaylandにも対応していますから、Westonと同じようにRDPのバックエンドを選べてもよさそうです。

    パーミッションは、AMDだからというよりは、たぶんローカルでログインした扱いになっていないんじゃないかと思います。uaccessの設定は端末の眼の前で直接ログインした時にはアクセス権が付与されるんですが、それ以外のSSHとかVNCとかでは付与されないものです。昔、大学の共用計算機システムみたいなところで、光学ドライブのパーミッションが0666になっていて、人が使っているところにリモートログインして勝手にejectを実行する、なんて遊びがありましたが、そういうのができないように、今はuaccessで管理されるみたいですね。
  • すずきさん(2024/10/06 03:41)
    xrdpで十分動作しているので、Waylandにはそこまでこだわってないんですが、時代はWaylandなのかなあ。

    uaccess知らなかったので少し調べてみたら、
    TAG+="uaccess"
    をルールに追加するとpam-systemdからsystemd-logindに依頼が行ってACLでパーミッションが設定される、なんて仕組みがあるんですね。なかなか複雑だなあ……。
open/close この記事にコメントする



2024年9月28日

TAS動画をニコニコ動画にアップロードできない

クラッキングでぶっ壊されてしまったニコニコ動画が復活し、シン・ニコニコ動画になって帰ってきました。いちユーザーとしては嬉しい気分でいっぱいです。

しかし前と比べて困ったことが起きていて、BizHawkで出力した動画をシン・ニコニコ動画にアップロードしようとすると「この動画の映像形式には対応していません」とエラーが出てしまって投稿できません。試行錯誤の末、解決方法を見つけたのでメモしておきます。

端的に言えば原因はピクセルフォーマットでした。BizHawkは特に何も言わないとYUV444で出力しますが、ニコニコ動画はYUV420でないと受け付けてくれないようです。どこにもそんな制約は書いていないため、仕様か?バグか?どちらともわかりません。

YUV420にする方法ですけども、BizHawkの出力設定を[Custom]にして、下記のようにピクセルフォーマットを明示的に指定すればYUV420で出力してくれました。

BizHawkの[Custom]動画出力設定の例
-c:a aac -c:v libx264 -preset ultrafast -pix_fmt yuv420p -f mp4

もしすでにYUV444で出力済みの動画ならば、ffmpegを使って再エンコードすれば良いです。

ピクセルフォーマットYUV420で再エンコード
$ ffmpeg -i input.mp4 \
    -vcodec libx264 -vb 2048000 -r 60 -s 1280x720 -pix_fmt yuv420p \
    -acodec aac -ar 44100 -ab 192000 output.mp4

動画ビットレート(-vb)、フレームレート(-r)、動画サイズ(-s)は元の動画に応じて調整してください。

編集者:すずき(2024/10/03 01:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2024年10月2日 >>> 2024年9月19日
link もっと後

管理用メニュー

link 記事を新規作成

<2024>
<<<10>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」

最近の記事20件

  • link 24年10月3日
    すずき (10/06 01:33)
    「[Ubuntu 20.04 LTSでxrdpのエラーを再現できるか挑戦] 目次: Linux先日(2024年10月1日の日記参...」
  • link 23年4月10日
    すずき (10/05 15:09)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年10月2日
    すずき (10/05 15:08)
    「[VirtualBoxでxrdpのエラーを再現できるか挑戦] 目次: Linux昨日(2024年10月1日の日記参照)のUbu...」
  • link 24年10月1日
    すずき (10/05 15:07)
    「[Ubuntu 22.04のxrdpに接続できない病] 目次: LinuxWindowsからUbuntu 22.04 LTSの...」
  • link 24年9月28日
    すずき (10/03 01:07)
    「[TAS動画をニコニコ動画にアップロードできない] クラッキングでぶっ壊されてしまったニコニコ動画が復活し、シン・ニコニコ動画...」
  • link 24年9月14日
    すずき (09/22 11:23)
    「[OpenSBIを調べる - scratch領域の詳細] 目次: Linux今回はOpenSBIのコード内に頻出するscrat...」
  • link 21年8月11日
    すずき (09/22 00:15)
    「[Kindle - まとめリンク] 目次: Kindle初代Kindle Fire HDの話。Kindle Fire HDのカ...」
  • link 24年8月11日
    すずき (09/22 00:14)
    「[Amazonマイリストへの問い合わせの返事がきた] 目次: Kindle先日(2024年8月4日の日記参照)Amazonへ問...」
  • link 24年5月19日
    すずき (09/21 23:23)
    「[Yocto - まとめリンク] 目次: YoctoHello YoctoYoctoのセットアップスクリプトとビルドディレクト...」
  • link 24年9月17日
    すずき (09/21 23:22)
    「[Yoctoの並列Fetchでエラーが起きるとき] 目次: YoctoYoctoは特に何も指定せずにビルドすると全スレッドを使...」
  • link 23年4月24日
    すずき (09/19 22:25)
    「[Arty A7のFPGAを書き換える方法] 目次: RISC-VいつもArty A7-100を書き換えるときSPI Flas...」
  • link 24年9月13日
    すずき (09/17 19:26)
    「[OpenSBIを調べる - OpenSBIとRISC-V ISA extensions] 目次: Linux今回はOpenS...」
  • link 24年8月31日
    すずき (09/01 15:01)
    「[Microsoftマウスが壊れた] 3年前くらいに購入した(2021年3月6日の日記参照)Microsoft Basic O...」
  • link 23年5月15日
    すずき (09/01 15:00)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ将来車を買い替えるとしたら?FTOのオイル交換とオイル漏...」
  • link 24年8月25日
    すずき (09/01 14:59)
    「[レガシィの7回目の車検完了] 目次: 車ディーラーまで車検の車を取りに行きました。外は非常に暑くて辛いです…&...」
  • link 21年3月6日
    すずき (09/01 14:14)
    「[気に入るマウスはどれ?] 手に合うワイヤレスマウスを探し続け、高級製品、小さい製品、お手ごろ製品と買いまくり、一時は家に5個...」
  • link 24年8月27日
    すずき (08/28 23:42)
    「[Milk-V Jupiterが届いた] 目次: RISC-VMilk-V Jupiterが届きました。お値段が非常に安かった...」
  • link 21年6月18日
    すずき (08/28 23:29)
    「[RISC-V - まとめリンク] 目次: RISC-V関係の深いまとめリンク。目次: LinuxSiFive社ボードの話、C...」
  • link 22年12月22日
    すずき (08/28 22:05)
    「[x86とARMとRISC-VでCoreMark対決] 目次: RISC-VCoreMarkを以前(2019年7月5日の日記参...」
  • link 22年5月26日
    すずき (08/27 12:39)
    「[glibcのスレッドとスタック] 目次: C言語とlibc誰も興味ないglibcの話シリーズ、スレッドのスタックはどうやって...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 10/06 03:41