openSUSE Leap 16 更新備忘録

まもなくopenSUSE Leap 16.0がリリースされますが、サーバをLeap 15.6からLeap 16.0 RCに先にアップデートして色々はまったので、記録しておきます。

PPPoEの接続ができなくなった

パッケージがアップデートされて、ppp 2.5.2になったときに、rp-pppoe.soがなくなったみたいです。

そのため、/etc/sysconfig/network/ifcfg-ppp0で設定をしてpppoe.serviceをsystemdで使用すると、サービスが起動しなくなりました。
色々試してみたんですが、結局rp-pppoeが何なのかがよくわからなかったので、pppdを直接叩くようにしました。

まずは/etc/ppp/peers/ispみたいに/etc/ppp/peers/の下に以下のようなファイルを作ります。

plugin pppoe.so
eth0
name "hoge@example.com"
usepeerdns
persist
defaultroute
hide-password
noauth

二行目の”eth0″はPPPoEに使用するネットワークデバイス名です。
“name”はPPPoEのユーザ名です。パスワードは/etc/ppp/chap-secretsなり、/etc/ppp/pap-secretsに書いてください。
MTUなどは/etc/ppp/optionsで設定します。

この状態で、sudo pppd call ispという風にpppdを叩くとppp0が作成されているはずです。これで、PPPoEを介して通信ができます。
後はpppdが起動時に動くようにsystemdのサービスファイルを作成します。

[Unit]
Description=PPPoE
After=network.target

[Service]
Group=dialout
Type=simple
ExecStart=/usr/sbin/pppd call isp
Restart=always

[Install]
WantedBy=multi-user.target

上のファイルを/etc/systemd/system/pppoe-isp.serviceとでも保存し、sudo systemctl enable --now pppoe-ispとすれば完了です。
rp-pppoeはsudo zypper rm -u rp-pppoeで削除しました。

systemd-bootとSecure Boot

openSUSE Leap 16.0からはブートローダとしてsystemd-bootが使えるようになりました。(Tumbleweedでは前からできてました。)
基本的にはhttps://en.opensuse.org/Systemd-bootを見てやれば環境は整います。 まずはGRUB2を全てアンインストールして/boot/以下を全て吹き飛ばします(いいんか?)。
以下のコマンドでおそらく起動に必要なファイルは整うはずです。

sudo zypper in sdbootutil-kernel-install sdbootutil-enroll sdbootutil-rpm-scriptlets 
sudo bootctl --make-machine-id-directory=yes install --esp-path=/boot/efi
sudo sdbootutil install
sudo sdbootutil add-all-kernels

ところが、この状態ではセキュアブートができません。
shimをいれる必要があるのですが、Leapのリポジトリには無いので以下のようにしてTumblweed向けのrpmを突っ込みます。バージョンは上がってるかもしれません。

sudo wget https://download.opensuse.org/repositories/openSUSE:/Factory/standard/x86_64/shim-15.8-4.1.x86_64.rpm
sudo rpm -i shim-15.8-4.1.x86_64.rpm

次にshim.efiなどを/boot/efi/EFI/systemd/以下に持ってきます。また、shimはペイロードとしてgrub.efiしか認識しないようなので、systemd-bootx64.efiをコピーします。
この操作はsystemd-bootのパッケージがアップデートされる度に必要かもしれません。また、ブートマネージャにshim.efiを登録します。

sudo cp /usr/share/efi/x86_64/* /boot/efi/EFI/systemd/
sudo cp /boot/efi/EFI/systemd/systemd-bootx64.efi /boot/efi/EFI/systemd/grub.efi
sudo efibootmgr -c -L "Secure Boot" -l "\EFI\systemd\shim.efi"

これで起動すると良いんですが、残念ながら署名検証に失敗して固まります。ここですごく詰まりました。
TumblweedのMokManagerはTumblweedのKernelの署名は入っているんですが、LeapのKernelの署名は持っていません。
そのためインポートする必要があります。LeapのKernelはSUSEの鍵で署名されているのでこれを登録します。

https://www.suse.com/ja-jp/support/security/keysの”SUSE Secure Boot Signing Certificate Authority (2048 bit RSA)”以下のPEMをコピーして、kernel.pemなどとして保存します。また、このままではMokManagerが認識できないのでDER形式に変換します。
これをMokManagerに登録します。パスワードが聞かれますが再起動時にMokManagerで照合するためのものなので、何でも良いですが覚えておいてください。
念のためにEFIパーティションの中に証明書をコピーしておきます。

vim kernel.pem # Paste the key
openssl x509 -outform der -in kernel.pem -out kernel.crt
sudo mokutil --import kernel.crt
sudo cp kernel.crt /boot/efi/loader/keys/

これで再起動すると、MokManagerが起動し”Enroll MOK”という選択肢があるはずなので選択し、先程入力したパスワードを設定します。
これでセキュアブートで起動できるようになっているはずです。