ノートPCでFreeBSD 15を使う
(sacredheartsc.com)- FreeBSD 15 は pkgbase、LinuxKPI ドライバの改善、ノートPC対応プロジェクトによって、サーバー向け OS を超えてデスクトップの常用環境として使えるほど改善された
- FreeBSD 14 を試した後、KDE Plasma 6、Wayland、Intel WiFi 対応が追加され、ThinkPad X1 Carbon では Bluetooth を除く機能が問題なく動作する
- インストールは FreeBSD 15.1 memstick イメージ、UEFI ブート、ZFS (GPT)、base system のインストール種別
Packagesの選択を前提に進められる - デスクトップ環境の構築には、ドライバ、省電力、devfs 権限、Linux 互換性、D-Bus、Ly、KDE、PipeWire、ハードウェア動画アクセラレーションまで段階的な設定が必要となる
- 一部のノートPC環境では、スリープ復帰後の WiFi 問題、Intel グラフィックスのフリーズ、KDE ログアウト後のプロセス残留といった 既知の問題 が残っており、それぞれ回避策が必要である
概要
- FreeBSD 15 は pkgbase、LinuxKPI ドライバの改善、Laptop Support and Usability Project の開始により、ノートPCのデスクトップ環境で大きな改善を見せている
- FreeBSD 14 でデスクトップを試していた時期と比べると、KDE Plasma 6 の移植、Wayland の動作、Intel WiFi の完全対応が大きく異なる
- ThinkPad X1 Carbon ではバッテリー駆動時間は約 6〜7時間 で、試していない Bluetooth を除けばデバイス機能は問題なく動作する
- 新しい Laptop Compatibility Matrix によって、各自のハードウェアで何が動作するかを確認できる
- このガイドは Intel グラフィックスと Intel 無線チップセットの使用を前提としており、その他のハードウェア構成は実体験の範囲外としている
インストール
- FreeBSD 15.1 memstick イメージをダウンロードし、USB スティックに
ddで書き込む- 使用例としては
curl -OJでイメージを取得し、sudo dd if=FreeBSD-15.1-RELEASE-amd64-memstick.img of=/dev/sdX bs=1M conv=syncを実行する
- 使用例としては
- インストールウィザードはシンプルで、システムは UEFI ブート に設定し、ディスクレイアウトは
ZFS (GPT)を選択する - base system のインストール種別を尋ねる段階では、新しい pkgbase を使うために
Packagesを選択する - インストール中に SSH を有効化すると、仮想コンソールに直接入力する代わりに SSH セッションでコピー&ペーストできる
- 再起動後、インストール中に設定したパスワードで root アカウントにログインする
最新パッケージの利用
- FreeBSD ports ツリーには
quarterlyとlatestの 2 つのブランチがある quarterlyは年に 4 回 ports ツリーをスナップショットとして固定し、その間サードパーティ製パッケージには重要なセキュリティパッチのみが適用されるlatestは主要パッケージの更新が利用可能になり次第受け取る ローリングリリース 方式である- デフォルト設定は
quarterlyリポジトリであり、latestに切り替えるには/usr/local/etc/pkg/reposに override ファイルを作成する - リポジトリ URL を
pkg+https://pkg.FreeBSD.org/${ABI}/latestとkmods_latest_${VERSION_MINOR}に設定したうえで、pkg updateとpkg upgradeを実行する
ハードウェアデバイス、ドライバー、チューニング
-
ブートローダーの調整
/boot/loader.confでブートローダーの待機時間、destructive dtrace の無効化、共有メモリとプロセス上限の拡大を設定できる- Intel Speed Shift をサポートするシステムでは
machdep.hwpstate_pkg_ctrl="0"により、各コアが独自に電源状態を設定できるようにできる - PCI の省電力、高速な
soreceive()、ネットワークキュー長の拡大、ZFS トランザクションタイムアウトの増加を設定し、デスクトップやノートPCでの利用に合わせられる
-
カーネルモジュール
cpuctlとcoretempをkld_listに追加して、CPU 情報と温度の取得を有効にする- H-TCP 輻輳制御アルゴリズムは、高速かつ長距離のインターネットのようなネットワークでより良い性能を目指すもので、
cc_htcpモジュールとして利用できる - ThinkPad ではボタン操作のために
acpi_ibmモジュールが必要
-
sysctl の調整
/etc/sysctl.confでは、キーマップ変更の制限、コアダンプの無効化、ASLR 関連設定、ICMP redirect の遮断、IP redirect の無効化といったセキュリティ設定を適用できる- 一部のセキュリティガイドは W^X、hardlink チェック、他ユーザーのプロセス閲覧制限を推奨しているが、それらの設定は問題の方が多いと判断してコメントアウトしている
- ネットワーク性能設定では、デフォルト値が LAN 遅延向けに最適化されていることを前提に、より大きな RTT の接続向けに TCP バッファとキューを拡大する
- デスクトップ向け最適化として、共有メモリのスワップ防止、スケジューラのプリエンプション閾値の増加、一般ユーザーによるマウントの許可を設定する
- ノートPCの省電力のため、
hw.snd.latency=7にしてオーディオ応答性を下げる
-
WiFi
- WiFi サポートは LinuxKPI と新しい
iwlwifiドライバーのおかげで、以前より大きく改善している - 無線カードがサポートされているかは
iwlwifiの対応チップセット一覧で確認し、必要なファームウェアはfwget -vでインストールする - 旧型カードで新しい
iwlwifiを使うには、既存のiwmドライバーの読み込みをdevmatch_blocklist="if_iwm"で止める必要がある場合がある - 802.11n と 802.11ac はデフォルトで無効になっているため、
compat.linuxkpi.iwlwifi_11n_disable="0"とcompat.linuxkpi.iwlwifi_disable_11ac="0"の設定が必要 rc.confでwlan0デバイスを作成し、WPA DHCP powersaveを設定すると、wpa_supplicant(8)が WiFi ネットワークを管理する- ネットワーク管理は
wpa_supplicant.conf(5)を直接編集するか、networkmgrのグラフィカルインターフェースを使える networkmgrにはスーパーユーザー権限が必要で、operatorグループがパスワードなしで実行できるよう sudoers ルールを置ける- FreeBSD 15.1-RELEASE の
iwlwifiドライバーには suspend/resume に関する既知の問題がある
- WiFi サポートは LinuxKPI と新しい
-
CPU とグラフィックス
- 最新の CPU マイクロコードは
cpu-microcodeパッケージをインストールした後、loader.confで起動時に読み込むよう設定する - CPU の省電力は
performance_cx_lowest=Cmaxとeconomy_cx_lowest=Cmaxにより低い C-state を有効化し、バッテリー消費と発熱を抑える - 最新の Intel プロセッサでは
powerd(8)の実行はもはや不要 - Intel グラフィックスドライバーは
drm-kmodをインストール後、i915kmsを起動時に読み込むよう設定する
- 最新の CPU マイクロコードは
-
デバイス権限と互換性
- デスクトップシステムでは、一般ユーザーが GPU、ビデオ、バックライト、USB デバイスを操作できるよう devfs ルールを追加する
/etc/devfs.rulesでdrm/*、video*、backlight/*、usb/*の権限とグループを指定し、devfs_system_ruleset=localrulesを設定する- Linux バイナリの実行には Linuxulator を
linux_enable=YESで有効化し、必要に応じて/compat/linux配下に devfs、tmpfs、fdescfs、linprocfs、linsysfs をマウントする - exFAT や NTFS などのファイルシステムをマウントするために
fusefsカーネルモジュールを読み込む - Web カメラは
webcamd、v4l-utils、v4l_compatのインストールとwebcamd_enable=YESの設定でサポートが期待できる - プリンターには CUPS と
cups-filtersが必要で、operatorグループがプリンターを設定できるようcups-files.confを修正する - CUPS の設定 GUI にはブラウザーで
localhost:631からアクセスする
-
ノートPCの電源管理と ThinkPad バックライト
- ノートPCでは、非アクティブな USB デバイスを省電力状態に移すため、
/etc/rc.localでusbconfigとpower_saveを実行する - ThinkPad のバックライトキーを動作させるには、
acpi_ibmモジュールの読み込み、dev.acpi_ibm.0.handlerevents="0x10 0x11"の設定、devdルールが必要 /usr/local/libexec/thinkpad-brightnessスクリプトは、現在の明るさに応じて 2、5、10 単位で明るさを上げ下げする- スクリプトに実行権限を付与し、
devdを再起動してから動作を反映する - ハードウェアとドライバーの設定を終えたら再起動し、変更がシステムを壊していないか確認する
- ノートPCでは、非アクティブな USB デバイスを省電力状態に移すため、
ファイアウォール
- すべてのシステムでファイアウォールを動かす構成で、基本の例では SSH を除くすべての受信接続を遮断する
/etc/pf.confでegressインターフェースを実際のネットワークインターフェース名に置き換え、SSH ポートだけを TCP のインバウンドで許可する- 音声・ビデオ通話のために UDP
1024:65535範囲を許可する pf_enable=YESを設定し、service pf startでファイアウォールを起動する
periodic スクリプトの無効化
- FreeBSD には、デフォルトでハードディスクを走査し、インターネットに接続し、メールを送信する periodic(8) スクリプトが多数含まれている
- 一覧全体は
periodic.conf(5)で確認できる - 一般的なデスクトップユーザーにとって有用なのは一部の作業だけで、多くは安全に無効化できる
- 設定例では、daily、weekly、monthly、security 関連のバックアップ・状態報告・メールキュー・セキュリティ点検出力の作業を大量に
NOに変更する
ユーザーアカウント
- ローカルユーザーアカウントを作成し、
operator、video、wheelグループに追加する operatorはデバイスやプリンターの設定に必要で、videoは GPU デバイスへのアクセスに必要wheelグループはsudoで root 権限のコマンドを実行するために使うsudoをインストールした後、sudoers ファイルで%wheel ALL=(ALL:ALL) ALLを設定する
ロケール、時刻、SSH、証明書
-
ロケール
- ログインシェルの環境変数は
login.conf(5)で設定し、charset=UTF-8とlang=en_US.UTF-8を追加する - 変更を反映するために
cap_mkdb /etc/login.confでログインデータベースを再構築する - 非ログインシェルには
/etc/profile.d/locale.shでLANGとCHARSETを設定する
- ログインシェルの環境変数は
-
NTPとタイムゾーン
- システムクロックを最新の状態に保つには ntpd(8) が必要
ntp.confには FreeBSD pool NTP サーバーとアクセス制限の設定を置く- インストール中にタイムゾーンを設定しなかった場合は、
/usr/share/zoneinfo/America/New_Yorkを/etc/localtimeにシンボリックリンクする
-
openssh-portable
- FreeBSD base system の
sshには多くのパッチが適用されており、ports の素のopenssh-portableを好む sshd設定ファイルは新しいバージョンでは/usr/local/etc/sshの下にある/etc/rc.confで base のsshdを無効にし、openssh_enable=YESで新しいサービスを実行するsshコマンドは$PATHを変更しない限り、base system の/usr/bin/sshを引き続き使用する- すべてのユーザーに ports 版を優先適用するには、
login.confのpathの順序を/usr/localが先になるよう修正し、データベースを再構築する
- FreeBSD base system の
-
ターミナル、証明書、D-Bus
- FreeBSD の
termcap(5)データベースは Linux で一般的なものより簡素で、XTerm 系ターミナルでは明るい色がレンダリングされないことがある terminfo-dbをインストールすることでこの問題を修正できる- FreeBSD は標準で一部の認証局しか信頼しないため、Mozilla の完全な CA バンドルである
ca_root_nssをインストールする - KDE と今日の多くのデスクトップ機能には D-Bus が必要で、
dbus_enable=YESとservice dbus startで有効化する
- FreeBSD の
Ly ディスプレイマネージャー
- 通常は SDDM のようなグラフィカルなディスプレイマネージャーでデスクトップセッションを開始するが、執筆時点では FreeBSD で Wayland セッションを安定して開始できない
- SDDM はほぼ動作するが、複数のキー組み合わせでセッションが終了してしまうバグがある
- 現在の方法は、コンソールベースの Ly display manager で Wayland セッションを開始すること
- Ly はデーモンとして実行されず、
/etc/ttysで仮想コンソールが/usr/local/bin/ly_wrapperを実行するよう設定する /etc/gettytabに Ly の項目を追加し、再起動するかkill -HUP 1で init を更新すると、Ly のログインプロンプトが表示されるconfig.iniでxinitrc=null,xsessions=null,shell=false,waylandsessions=/usr/local/share/wayland-sessionsと設定することで Wayland セッションの使用を強制できる
フォント、KDE、デスクトップアプリ
- Web サイトが正しくレンダリングされるように、Cantarell、Droid、Inconsolata、Noto、Noto Emoji、Roboto、Ubuntu、webfonts などの標準フォントをインストールする
- KDE とデスクトップ構成要素は
kde,kdegraphics,kdemultimedia,kdeutils,phonon-mpv,pipewire,pulseaudio,wireplumberなどをインストールする - デスクトップアプリの例としては Chromium、Firefox、LibreOffice、Thunderbird、Signal Desktop、Wine、Emacs Wayland、Git、mpv、tmux などが含まれる
- 一部のデスクトップ機能は PipeWire に依存しており、タスクバーのプレビューは PipeWire が実行されていないと動作しないようだ
/usr/local/etc/xdg/autostart/pipewire.desktopの autostart ファイルで PipeWire を自動起動できるkwalletに SSH キーのパスフレーズを保存するには、KDE 環境でSSH_ASKPASS_REQUIRE=preferとSSH_ASKPASS=/usr/local/bin/ksshaskpassをエクスポートする
ハードウェアビデオアクセラレーション
- 適切なパッケージをインストールすれば、ほとんどの Intel GPU で ハードウェアビデオアクセラレーション を利用できる
- ハードウェアビデオアクセラレーションは、より滑らかな動画再生と優れたバッテリー持続時間をもたらす
- 必要なパッケージは
libva-intel-media-driver,libva-utils,libvdpau-va-gl,vdpauinfoである - ユーザーは
drmデバイスを通じて GPU にアクセスする必要があるため、videoグループに所属していなければならない - 一部のアプリケーションでは、ハードウェアオフロードを活用するために追加設定が必要な場合がある
-
Chromium Browser
- FreeBSD での Chromium のハードウェアビデオデコードは、以前は多くのコマンドラインフラグが必要だった
- 執筆時点では Chromium のハードウェアビデオデコードは追加のフラグなしで動作する
-
MPV
mpv.confでhwdec=vaapi-copy,vo=gpu-next,vd-lavc-dr=yes,audio-channels=stereoを設定すると、低い CPU 使用率で HD 動画を再生できる
既知の問題と回避策
-
ふたを開くとノートPCがすぐに再びスリープする
- KDE が実行されている場合、デスクトップ環境が ACPI のふたイベントを検知し、suspend と resume を処理する必要がある
- ThinkPad では、ふたを開けた直後にノートPCが再びスリープするバグが発生する
- 回避策は、KDE の電源設定でふたスイッチの動作を無効化し、
devdでふたを閉じたときに native suspend を行うよう構成する方法である /usr/local/libexec/kde-suspendスクリプトは、KDE にログインしているユーザーの画面をロックした後、0.5 秒待機してacpiconf -s3で S3 スリープ状態に入る/etc/devd/kde-suspend.confルールは、ACPI Lid0x00イベントで該当スクリプトを実行する
-
ログアウト後もプロセスが残る
- FreeBSD では、KDE セッションからログアウトした後も一部のプロセスが無期限に動作し続けることがある
- Chromium は、ときどき CPU コア 1 つを 100% 消費する状態に陥る
- systemd ベースの Linux ディストリビューションでは
systemd-logindがユーザーセッション関連のプロセスを終了させるが、FreeBSD の KDE 環境では同じ前提が成り立たない - KDE のログアウト時クリーンアップスクリプト機能を使い、
baloo_file、chrome、dirmngr、pipewire、signal-desktop、wireplumberなどを終了させる /usr/local/etc/xdg/plasma-workspace/shutdown/cleanup.shを実行可能にして適用する
-
ユーザー切り替えが動作しない
- FreeBSD のデスクトップでのユーザー切り替えは、古い ConsoleKit2 バグ のため壊れている
- ユーザーが試せないように、
/usr/local/etc/xdg/kdeglobalsでaction/start_new_session=falseとaction/switch_user=falseを設定する
-
スリープ復帰後に WiFi が壊れる
- FreeBSD 15.1-RELEASE には、スリープ復帰後に WiFi が壊れる iwlwifi バグ がある
- 回避策は、suspend 前に
wlan0インターフェースを停止し、resume 後に再開する方法である /usr/local/etc/rc.d/iwlwifi_fixスクリプトは、service netif stop wlan0とservice netif start wlan0を suspend/resume コマンドに結び付ける- このスクリプトは実行権限を付与し、
iwlwifi_fix_enable="YES"で有効化する - 修正はすでに 15-STABLE にコミットされており、FreeBSD 15.2 が出ればこの回避策は不要になる可能性がある
-
ノートPCのオーディオが停止する
- 一部のノートPCには、hard lockup を引き起こす i915 バグ がある
- 問題には
dmesgにhdac0: Command timeout 2のようなエラーが伴う - 解決策は、
compat.linuxkpi.i915_disable_power_well=0loader tunable を設定することである
-
グラフィックスのフリーズと GPU hang
- FreeBSD 15.1 では、標準の DRM ドライバが 6.6 から 6.12 に更新された
- 新バージョンには、一部の Intel チップでグラフィックスのフリーズと
dmesgのGPU HANGメッセージを引き起こすバグがあるようだ - 安定した回避策は、旧バージョンの
drm-66-kmodを使い続けることである
-
コンソールのアイドル時間制限がない
- FreeBSD は数年前、従来の
syscons(4)コンソールドライバから UEFI ネイティブのvt(4)ドライバへ移行した vtコンソールにはblanktimeのサポートがないため、X11 または Wayland セッションがなければ画面を消す方法が実質的にない- Ly は TTY コンソール上で動作するため、誰もログインしていない状態でも画面が点灯し続ける
- 単一ユーザーのノートPCでは大きな問題ではないが、マルチユーザーのワークステーションではログインプロンプトが LCD パネルに焼き付く可能性がある
- FreeBSD は数年前、従来の
-
GTK4 アプリのアイコンが欠ける
- 使用している GTK4 アプリは Dino IM XMPP クライアントで、多くのアイコンが描画されず、KDE のフォント設定にも従わなかった
- portals を無効化すると問題はすぐに解決した
- 回避策は
export GDK_DEBUG=no-portalsを設定することである
-
オーディオ再生中の途切れ
- Pulseaudio は、オーディオファイル再生中にときどき crackling や skipping を引き起こす
daemon.confでdefault-fragments = 8とdefault-fragment-size-msec = 5にデフォルト値を引き上げると問題は解決する
1件のコメント
Lobste.rsの意見
この記事には感謝しているが、インストーラが代わりにやるべきことのために手動ステップが多すぎるように見える
最近はLinuxからWi-Fiやグラフィックスドライバを移植するために多くの努力が注がれており、ノートPCで使える人はかなり増えた
今は2000年代のLinuxに近い状態と言えるが、まだやることは多く、最前線で進んでいる作業だ
「インストール時に12個くらいの手順を自分で踏まないと、そのマシンが本当に自分のものとは言えないのでは?」/s でありつつ /s ではない感じ
このコメントは今、OpenBSDを大きな苦労なく動かしたくて中古で買ったThinkpad T14 Gen 1で書いている
FreeBSDはまだ試していないが、たぶんやってみるつもりだし、自作NASではZFSプールと一緒にFreeBSD 15を動かしている
FreeBSD FoundationのノートPC互換性への取り組みは本当にありがたい
今のところは2000年代のLinuxのような雰囲気だが、元記事の言う通り「やるべきことがあり、最前線で行われている作業」だ
2010年代後半から、かなり慎重に選んだノートPCでFreeBSDをデイリードライバーとして使ってきた
当時はFreeBSDのデスクトップ環境の設定で本当に手を入れる箇所が多かったので、それをスクリプト化してGitリポジトリに入れ、ずっと手直ししながら使ってきた
たとえば、いずれWayland上のSwayへ移行する必要が出ると見越して、StumpWMからi3に切り替えるといった具合だ
今ではデスクトップ用インストーラの開発が進んでいて、@technomancyのもっともな指摘に対応できそうだし、私の設定スクリプトのかなりの部分も不要になるかもしれない
https://wiki.freebsd.org/desktop-installer
「LinuxKPIと新しいiwlwifiドライバのおかげで、Wi-Fiサポートがひどかった時代はほぼ過ぎ去った。よくあるIntelカードなら、そのまま動く可能性が高い」というくだりはうれしい
デスクトップでFreeBSD 13/14も試してみたが、ドライバの制約のせいで速度が遅すぎて使い続けるのは難しかった
この制限がなくなるのは良いことで、次にデスクトップで何か新しいことを試したくなったら、またFreeBSDをやってみようと思う
面白いのは、RTL8812 Wi-FiドライバがFreeBSDにはかなり前から、記憶では10年以上前からあったのに、Linuxではカーネル6.13あたりでようやく入ったことだ
Linuxでなぜそんなに長くツリー外モジュールのままだったのかはよく分からない。ライセンスが理由だったのかもしれない