Windows 10乗り換えセールに乗じて、新しいPCを購入しました。Core Ultra 258V (Lunar Lake) を搭載した dynabook XP です。一応最新、かつ、搭載機種が少ない Lunar Lake ということで、最新の Leap 16.0 でもすんなりは入りませんでした。

Tumbleweed や Slowroll であれば、大丈夫だったかもしれません。

Windows 側でのいろいろ

まずはリカバリーディスクを作ります。32GB のディスクが必要でした。手持ちのメモリーはすべて16GB以下で、なんとか発掘した32GBのmicroSDカードに書き込みました。

次に、「ディスクの管理」でWindowsのパーティションを縮小して、openSUSEをインストールする領域を確保します。細かい説明は省略します。

セキュアブートの設定変更で何度もBitLockerの回復キーを求められたので、準備はしておいたほうがよいでしょう。普通にセットアップすると回復キーはログインしたマイクロソフトアカウントに保存されるそうです。https://aka.ms/myrecoverykey で参照できます。

UEFI の設定

openSUSEのブートローダー、カーネルを署名している鍵を有効化します。まず、UEFIの設定画面で、スーパーバイザーパスワードを設定します。設定すると、追加のメニューが表示されるようになり、「3rd party CA」を Enabled に変更します。

インストール

いろいろ試した結果、なんらかの原因でオンラインリポジトリにアクセスできないようで、ネットワークインストール用のインストーラーが使えませんでした。そのため、オフライン用のISOをダウンロードして、USBメモリーに書き込んでインストールします。

さらに、通常のインストーラーは途中で固まってしまったので、fail safe モードでインストールします。原因は後で分かって、Lunar Lake の GPU (Arc Xe2) にカーネルが対応していないためです。nomodeset を起動オプションに追加すれば、通常のインストーラーも使えます。

Leap 16.0 で導入された Agama インストーラーは Web アプリケーションになっており、fail safe モードの場合は、ネットワーク越しにインストーラーにアクセスして操作を行えます。スクリーンショットはタブレットで操作している様子です。

インストールの詳細は省略しますが、Windowsを残すために、「現在のパーティションを維持する」設定にするのを忘れずに。

UEFI に openSUSEを登録する

本来であれば、インストールが完了すると、GRUB が起動するはずなのですが、Windows が起動する上に、UEFI の設定画面にも Windows しか出てきません。efibootmgr で設定を変更しても、起動順序がもとに戻されてしまうようです。おそろらく UEFI が変えてしまっているのでしょうか。

dynabook の UEFI は efi ファイルを直接指定して UEFI エントリーを追加することができます。この機能で shim.efi (セキュアブート用のプリブートローダー)を指定して起動順序を先頭にしたところ、無事に起動するようになりました。

fail safe から不要なオプションを取り除く

fail safe モードでインストールすると、起動パラメータに問題になりそうな機能を無効にするパラメータが追加されます。これを1つずつ外して、インストーラーが固まった原因を探します。

BOOT_IMAGE=/boot/vmlinuz-6.12.0-160000.5-default root=UUID=c24385d6-faf7-48c7-ade1-906659977d4d ide=nodma apm=off noresume edd=off nomodeset 3 mitigations=auto quiet security=selinux selinux=1

1つずつ外していった結果、nomodeset を外すと途中で固まってしまいました。nomodesetを残した状態でもデスクトップは起動しますが、解像度が 1920×1080 に固定されてしまい、本来は1980×1200なので、縦に間延びした状態になってしまいます。

新しいカーネルを入れる

Lunar Lake の GPU である Intel Arc Xe2 のドライバはどこかのタイミングでカーネルに取り込まれているようなので、最新のカーネルに更新します。最新のカーネルは、OBS の Kernel:stable:Backport から提供されています (記事執筆時は 6.17.3、Leap 標準は 6.12.0 + パッチ)。

以下のコマンドでリポジトリを登録し、カーネルをインストールします。

sudo zypper ar -c https://download.opensuse.org/repositories/Kernel:/stable:/Backport/16.0/Kernel:stable:Backport.repo
sudo zypper in -r Kernel_stable_Backport kernel-default

このリポジトリのカーネルは、OBS の Kernel プロジェクトの鍵で署名されています。セキュアブートが有効なPCで使うには、この鍵を Machine Owner Key (MOK) として UEFI に登録しておかないと、起動させてくれません。

OBS から公開鍵をダウンロードし:
https://build.opensuse.org/projects/Kernel:stable:Backport/signing_keys

以下のコマンドで変換し、再起動時に取り込むように指定します。

openssl x509 -in Kernel_stable_Backport_cert.pem -outform der -out cert.der
sudo mokutil --import cert.der

再起動後にMockManagerが起動し、enroll すれば完了です。

(追記)サウンドカード

残念ながら現時点では動作しません。

[    7.306875] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: hda codecs found, mask 4
[    7.306889] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: NHLT device BT(0) detected, ssp_mask 0x4
[    7.306894] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: BT link detected in NHLT tables: 0x4
[    7.306899] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: DMICs detected in NHLT tables: 2
[    7.311245] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: SOF firmware and/or topology file not found.
[    7.311966] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: Supported default profiles
[    7.311969] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: - ipc type 1 (Requested):
[    7.311971] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3:  Firmware file: intel/sof-ipc4/lnl/sof-lnl.ri
[    7.311976] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3:  Topology file: intel/sof-ipc4-tplg/sof-lnl-rt722-l0-2ch.tplg
[    7.311979] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: Check if you have 'sof-firmware' package installed.
[    7.311980] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: Optionally it can be manually downloaded from:
[    7.311982] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3:    https://github.com/thesofproject/sof-bin/
[    7.316190] [    T110] sof-audio-pci-intel-lnl 0000:00:1f.3: error: sof_probe_work failed err: -2

告知

openSUSE Leap 16.0 のリリースイベントを開催します。新機能や新しいインストーラーについても紹介予定です。

https://opensuseja.connpass.com/event/372009

openSUSE Leap 16.0 では、提供する 32bit パッケージ削減のため、steam パッケージの提供をしないことになりました。代替手段の1つは Flatpak です。

インストール自体は簡単です。

flatpak install com.valvesoftware.Steam

切り替えるときに困るのが、これまでダウンロードしたゲームのデータです。もちろん、再ダウンロードすることもできますが、rpm パッケージ版の Steam から引き継ぐこともできます。ただし、Flatpak のセキュリティで、アクセスできるディレクトリが制限されているため、従来の Steam のディレクトリにアクセスできるようにする必要があります。こちらもやり方は簡単。

flatpak override --user --filesystem=~/.local/share/Steam com.valvesoftware.Steam

あとは Steam の設定を開き、「ストレージ」で「ドライブを追加」し、上記のパスを設定するだけです。

補足: Leap 16 で 32 bit アプリケーションを実行するには

Leap 16 では、デフォルトで32 bitアプリケーションを実行する機能が、カーネルレベルでオフになっています。Steam と配信されているゲームには 32 bit アプリが多くあります。

有効にするには、grub2-compat-ia32 パッケージをインストールするか、起動オプションに ia32_emulation=on を指定する必要があります。

参考: https://lists.opensuse.org/archives/list/users-ja@lists.opensuse.org/thread/PRGTJQYWV6GOKMNIXZ7TFWBV3QB3F2ZY


openSUSE の Proxmox LXC コンテナで、一般ユーザで ping を使うと、

ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?

となって、動きません。しかしこれは、https://blog.ssrf.in/post/ping-does-not-require-cap-net-raw-capability/ に書いてあるように、カーネルパラメータを調整することで、通常通り使えるようになります。実際に、

# sysctl -w net.ipv4.ping_group_range="0 65534"

と入力してみたら正しく動くようになりました。
なお、/usr/bin/ping にケーパビリティの設定を
setcap cap_net_raw+p /bin/ping
ですることでも解決します。これは https://hanaokaiwa.hatenablog.jp/entry/2024/06/17/120533 に情報がありました。

Proxmox には openSUSE のLXCコンテナイメージが用意されています。そのイメージを使って openSUSE をインストールしたときには、 aaa_base-extras パッケージを入れてください。そうしないと、既定で用意されているはずの bash の alias などが使えません。
最初、openSUSE LXC コンテナにログインしたとき、ll とかの alias コマンドが使えないのに気がつきました。.bashrc が未設定なのかなと思ったのですが、.bash にも .profile にも alias コマンドの定義がありません。/etc 配下のファイルも同じでした。実際に使える、openSUSE の環境で見てみても同じです。
調べた結果、/etc/profile.d/ 配下にalias 等の定義があったのでした。が、それらは aaa_base-extras でインストールされているのですね。LXC コンテナイメージには aaa_base-extras が入っていなかったために、alias 等の定義が抜けてしまったのでした。
普段特に気にせず使っている alias 定義のコマンド、実は親切にも openSUSE があらかじめ用意していた物だったというのに気がついた次第です。

たぶん期待通りの動作になりました。
要は、IPaddr2に渡すパラメータを調整すれば良いわけで、いろいろ見て、clone-max=1 と言うパラメータを、crm 設定ファイルに追加すれば良さそうと。で

group g-storage dlm lvmlockd
group vip-group vip
clone cl-storage g-storage \
meta interleave=true target-role=Started
clone vip-clone vip-group \
meta clone-max=1

のように書き換えたところ、たぶん期待通りの動作になりました。ノードを standby 状態にすると、IP アドレスが相手側に移動します。
なので、IPaddr2 の動作としては問題ないし、heartbeat としての動作も問題ないけれど、パラメータの設定がミソ、という感じです。この辺 SLES のドキュメントには無いので、もう少し追記してもらえればありがたかったかなと。

IP_CIP が yes になる条件が分かりました。
ソースを見ると、IPaddr2 の ip_init() 関数の中で、

    if [ "$IP_INC_GLOBAL" -gt 1 ] && ! ocf_is_true "$OCF_RESKEY_unique_clone_address"; then
            IP_CIP="yes"
            IP_CIP_HASH="${OCF_RESKEY_clusterip_hash}"

という行があるのですね。IP_CIP を yes にしているのはここだけです。で、IP_CIP を yes にする条件は、IP_INC_GLOBAL が2以上の時(1より大きいとき)、で、IP_INC_GLOBAL を設定しているのは、やはり ip_init() の始まりの方で、

    IP_INC_GLOBAL=${OCF_RESKEY_CRM_meta_clone_max:-1}
    IP_INC_NO=`expr ${OCF_RESKEY_CRM_meta_clone:-0} + 1`

という行の所。で、OCF_RESKEY_CRM_meta_clone_max を設定しているのは IPaddr2 内ではなくて、これを起動する heartbeat。情報は https://clusterlabs.org/projects/pacemaker/doc/2.1/Pacemaker_Administration/html/agents.html にあります。あとhttps://blog.drbd.jp/2017/12/advance_resource/ も参考になります。どうやら、OCF_RESKEY_CRM_meta_clone_max が2に設定されているみたいです。なので、iptables を動かすロジックに進んでしまったみたい。

openSUSE で動かないので、では、本家本元の Red Hat Enterprise Linux ではどうなのか、を調べてみました。RHEL では IPaddr2 からのメッセージは ocf_log という関数を使っているようで、add_interface() 関数内にある ocf_log に少し細工をして、実行コマンドと引数が表示されるようにしてみました。すると、

4月 04 21:38:17 rh9-a IPaddr2(ClusterIP)[467709]: INFO: Adding inet address 192.168.3.179/24 with broadcast address 192.168.3.255 to device ens18 ip -f inet addr add 192.168.3.179/24 brd 192.168.3.255 dev ens18
4月 04 21:38:17 rh9-a avahi-daemon[749]: Registering new address record for 192.168.3.179 on ens18.IPv4.
4月 04 21:38:17 rh9-a IPaddr2(ClusterIP)[467715]: INFO: Bringing device ens18 up ip link set ens18 up

と表示されていたんですね。つまり、RHEL では ip コマンドを使って IP アドレスを設定していると。
おそらく、どこかの引数で、ip コマンドを指定していると思うのですが、そこが分かれば RHEL と同じように openSUSE でも設定すれば、うまくいきそうです。

2025/4/5 追記
で、IPaddr2 にあっちこっち logger 入れて調べてみたら、

Apr 05 20:59:41 clvm-a root[7827]: ip_served cur_nic=,IP_CIP=yes,OCF_RESKEY_ip=192.168.3.169
Apr 05 20:59:41 clvm-a root[7828]: ip_saved return no
Apr 05 20:59:41 clvm-a root[7829]: ip_start: IP_CIP=yes,IP_STATUS=no
Apr 05 20:59:41 clvm-a root[7830]: IP_CIP=yes,ip_status=noq
Apr 05 20:59:41 clvm-a root[7833]: iptables-legacy -I INPUT -d 192.168.3.169 -i eth0 -j CLUSTERIP –new –

と言うトレース結果が。あれ、IP_CIP は IP アドレスじゃなくて yes が入っている! RHEL だとここには何も入らないか、IPアドレスのどちらか。なので、IP_CIP に yes が入ることがおかしい。でソースを読むと、IP_CIP が 空 じゃなくて、 ip_status が no だとすると、iptables を呼び出す模様。どうやら IP_CIP が yes なので誤動作した感じ。