ManjaroのgrubがデュアルブートしているWindowsを認識しなくなった

症状

症状としては,アップデート後にgrubのOS選択画面が表示されなくなる. grubGRUB_TIMEOUT によってタイムアウトが設定されているのだが,そもそもOSが一つしかない場合はgrub自体の画面が表示されない. 今回は,どうやらgrubデュアルブートしているWindowsを検出しなくなったため,OSの選択肢がひとつだけになりgrubの選択画面が消えたようだ.

ちなみに,grubの画面自体を表示するだけなら,

# GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=menu
GRUB_HIDDEN_TIMEOUT_QUIET=false

みたいなことをするだけで,表示されるようになる.Linuxしか選択できなかったが.

原因と対策

これ系を調べるとsudo update-grubすれば良いとかsudo grub-mkconfigすればいいとか,そんな適当な情報しかでてこないのだが,これらでは解決しなかった. 原因はgrub-mkconfigがos-proberを実行しないことにあった.

実際update-grubしてみると,

$ sudo update-grub
Generating grub configuration file ...
Found theme: /usr/share/grub/themes/manjaro/theme.txt
Found linux image: /boot/vmlinuz-5.10-x86_64
Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.10-x86_64.img
Found initrd fallback image: /boot/initramfs-5.10-x86_64-fallback.img
Found linux image: /boot/vmlinuz-5.9-x86_64
Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.9-x86_64.img
Found initrd fallback image: /boot/initramfs-5.9-x86_64-fallback.img
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
Found memtest86+ image: /boot/memtest86+/memtest.bin
done

というような表示になる.linuxは検出しているが,Windowsを検出した気配がない. で,重要なことが書いてある.

Warning: os-prober will not be executed to detect other bootable partitions.

そう,実行されてないのだ. os-proberはbootできそうなosを見つけてくれるプログラムなのだが,linuxは自分自信だからいいとして,今起動していないWindowsはこいつで自動的に見つけてgrubが設定を作ってくれるはずだった.

ちなみにこいつを単体で実行すると,

$ sudo os-prober
/dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi

ちゃんとWindowsを見つけてくれる. というわけでこれを実行できるようにしてやれば良い.

/usr/bin/grub-mkconfigを開いてみると,

# Disable os-prober by default due to security reasons.
GRUB_DISABLE_OS_PROBER="true"

となっている.やはりgrubからos-proberの呼び出しが無効化されている.

というわけでこれを有効化するのだが,別にgrub-mkconfigを編集してもよいのだが,生成済みの/etc/default/grub からも上書きできるので,こちらを編集する.

GRUB_DEFAULT=saved
GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=hidden
GRUB_DISTRIBUTOR="Manjaro"
GRUB_CMDLINE_LINUX_DEFAULT="text apparmor=1 security=apparmor udev.log_priority=3 nouveau.modeset=0 libata.force=noncq irqpoll"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=false

あとは,

$ sudo update-grub
Generating grub configuration file ...
Found theme: /usr/share/grub/themes/manjaro/theme.txt
Found linux image: /boot/vmlinuz-5.10-x86_64
Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.10-x86_64.img
Found initrd fallback image: /boot/initramfs-5.10-x86_64-fallback.img
Found linux image: /boot/vmlinuz-5.9-x86_64
Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.9-x86_64.img
Found initrd fallback image: /boot/initramfs-5.9-x86_64-fallback.img
Warning: os-prober will be executed to detect other bootable partitions.
It's output will be used to detect bootable binaries on them and create new boot entries.
Found Windows Boot Manager on /dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings ...
Found memtest86+ image: /boot/memtest86+/memtest.bin
done

と,無事にWindowsを検出してくれる.

そもそもos-proberなんで無効になってるの?

同じ疑問を抱いた人がいた. forum.manjaro.org

grub2のセキュリティアップデートにより無効化されている. 該当するアップデートは

wiki.ubuntu.com

で,UEFI Secure BootのCVEに対応するためと思われる.

修正はこれ.

git.savannah.gnu.org

別の方法

os-proberを使わなくても,/etc/grub.d/40_custom に自分でWindowsのエントリを書けば,それでgrubからOS選択はできる(設定が間違ってなければ). というわけでそういう方法もある.詳しくはArchWikiを見て.

wiki.archlinux.jp

参考

rionaoki.net

askubuntu.com

ITエンジニアに対するスカウトに思うところ

WantedlyやLinkedInにユーザとして登録していると,スカウトをもらうことがある.最近はこれに近いサービスが多くあり,LAPRASやOffersなんかもある.findyは,スカウトというほどはっきりしたものではないが,一応興味通知が来る. サービスを通さなくても,直接メールが来たり,TwitterのDMでスカウトが来たり,いろいろな方法でスカウトが届く.

スカウトと言っても,いきなり「あなたを1000万で雇うからすぐに来てくれ!」みたいなことはなくて,だいたいは「一度お話しましょう」というのが多い. この形のスカウトで一番多いのが「カジュアル面談」を誘うパターンだ.

前職がLAPRASだったこともあり,私も自分でスカウトメールを書いて送ったことはあるし,カジュアル面談をセッティングしたことも何度もある. そういう経験もあり,カジュアル面談の誘いが来たら,全部ではないがそれなりに受けてみることにしていた.

が,最近立て続けに不届きなスカウトメールを受け取ることが増えたので一言言っておきたい.

「転職意思がなくても構わないので」と書くのであれば転職意思がなくてもちゃんとカジュアル面談しろよ

続きを読む

Kubernetes 1.20ではownerReferenceのnamespaceに気を使え

qiita.com

ここの話です.

github.com

Issueの内容を熟知している方には余計なお世話です.

いやーこんなの自分には関係ないだろうと思ってたら見事に当たりました.

問題になるケース

問題になるケースはおそらく以下の2パターン.

  1. OwnerとChildが別のnamespaceに所属するパターン
  2. namespaceに所属するOwnerがcluster scopeなChildからOwnerReferenceを張られているパターン

ちなみにこれは作成時にエラーになるわけではない.あくまでGCコントローラの挙動の変更なので,リソースが削除される挙動が変更になっている.

私の場合2に該当していた.

CRDを定義して,カスタムリソースをapplyするとAdmissionWebhookのConfigurationと,それに合わせたWebhookのPodとServiceを作るようなコントローラを作っていた. このとき,CRDのscopeをNamespacedにしていたんだけど,NamespacedなカスタムリソースがCluster scopeのValidating/MutatingWebhookConfigurationをChildに持つ場合,がっつり上記に該当してGCされなくなる. 結果として,カスタムリソースを削除してもWebhookConfigurationが削除されないという状態になった.

対応

私の場合の話なので,2に該当する場合なのだけれど,OwnerがNamespacedである必要がないのであれば,OwnerをCluster scopeにしてしまえば良い.Cluster scopeなOwnerがCluster scopeなChildを持つことは特に問題ない.また,Cluster scopeなOwnerがNamespace scopeのChildを持つことも,特に問題はない.GCコントローラはちゃんとOwnerが消えたときにChildも消してくれる.

今回で言うなら,Validating/MutatingWebhookConfigurationのOwnerなので,別にCluster scopeで良くて,Cluster scopeに変更することで対応できた.合わせて作るPodとServiceのnamespaceをどこにするかは悩みどころではあったが.Cluster scopeなカスタムリソースもそれらのPodやServiceのOwnerになれるので,特に問題はなかった.

1についても同様なのだけれど,OwnerがCluster scopeで良いのであれば,Cluster scopeにすることで正しいOwnerReferenceになる.

問題はOwnerがNamespace scopeである必要がある場合なのだが,それってどんなケースなのか想像できないのでちょっと対応策も思いつかない…….

気づいた経緯

そもそもこの話は知っていたんだけど,完全に無関係だろうと思っていた.ので完全に油断していたんだけど,先日書いたkind local registryによりE2Eがそれなりの頻度でCIで走るようになったおかげで気づいた.

h3poteto.hatenablog.com

Kubernetes 1.20に上げたところでテストが落ちて,AdmissionWebhookが消えなくなっていたので,そこで問題が発覚した.

E2Eテスト便利や.

ちなみに記事でも紹介されてたけど kubectl-check-ownerrefefrences を使えば一発でわかるんで,これも便利だったよ.

github.com

kind local registryでCI内でテストを回す

Kubernetes関連のツールを作ったときなどに,E2Eテストをしたいことがある.実際にKubernetesクラスタに入れてみて,動かしてみてどうか,というのは開発環境でやるにしても結構手間だ. そういうときにkindはすごく便利なんだけど,これのlocal registryは更に便利だった.

続きを読む

Fediverse用のclient libraryを探す旅

この記事はFediverse (2) Advent Calendar 2020 の9日目です.大遅刻です. ちょうどこの週に引っ越しをすることになってしまって,「書く時間くらいあるやろー」と思ってたら,全然時間がなかったです.片付けて引っ越しして荷解きして,仕事できる状態までPC周りを復元して……とやっていたら全然書く時間が取れずにここまで遅刻しました.

それはともかくとして…….

Fediverseというとサーバの話をすることがどうしても多くなってしまうけど,クライアントアプリケーション開発者として日々APIに触れていると,クライアントライブラリを調べることが多い.

というわけで,FediverseのAPIを叩くクライアントライブラリを調査したときのメモを残しておく.

ちなみに,Fediverseが対象なので,Mastodon以外のクライアントライブラリも調べた.調べたのだが,正直Mastodon,Misskey以外は非常に数が少ない.クライアントアプリケーションもそこまで多くはないので,仕方ないのだろうが.

なお,俺がクライアントアプリケーションを作るときはJavaScript(TypeScript)で書いているので,普段はJSのライブラリ調査しかしていない.というわけで若干JS成分が多めである.

続きを読む