こんにちは。Kanade改めK4eです。
Gentoo + KDE Plasma + CachyOS-kernel + btrfsでデスクトップ環境を作ってみました。その手順をまとめます。
今回の構成について
今回の構成について説明します。
Gentoo Linux について
Gentoo Linuxはソースコードからソフトウェアをビルドすることを前提に設計された非常に自由度の高いLinuxディストリビューションです。ユーザ地震でビルドオプションから設定し、じぶんの好きなようにLinux環境を作成することができます。
KDE Plasma について
KDE PlasmaはUbuntuに採用されているGNOMEと並んで有名なLinux向けのデスクトップ環境です。WindowsライクなUIなのでWindowsユーザには特におすすめです。
昔は動作が重い、と言われていましたが、現在は改善されて、比較的軽量なデスクトップ環境といえるくらいになっていると思います。
CachyOS-kernelについて
CachyOS-kernelとはArch Linux派生のデスクトップ志向LinuxであるCachyOS向けに開発されている、デスクトップ用途に設計されたLinuxカーネルです。
CachyOS、CachyOSカーネルに関する詳しい解説は以前書いた記事にまとまっているので、こちらを参考にしていただければと思います。CPUスケジューラとビルド時最適化を組み合わせることで、低レイテンシで使いやすいデスクトップ環境を実現しています。
CachyOSのカーネルは他のディストリビューションでも使うことができ、特にGentoo向けには有志によりオーバーレイが作成され、Portage管理下でビルドできるようになっています。
上記を合わせた環境は非常に挑戦的な構成で、前回のArch Linux構成以上に問題が起きやすいと考えられます。そのため、今回もbtrfsをファイルシステムに採用します。
btrfsについて
btrfsは比較的新しいファイルシステムでext4やxfsと比べて高度な機能を持っています。
今回注目するのはスナップショット機能です。容量を殆ど消費することなくファイルシステムのスナップショットをとることができます。これを用いることで万が一システムアップデート時にシステム障害が発生してもロールバックすることができます。
これらを組み合わせて
- 高速動作
- 耐障害性
- 高性能なビルド管理システム
を併せ持つ非常にチャレンジングなLinuxデスクトップ環境を作成します。
インストール
使用するインストーラについて
今回はダウンロードページからamd64向けのBoot media Minimal Installation CDをダウンロードし使用しました。
(オプション)ssh接続をする
インストール中、長いコメント、繰り返し似たようなコマンドを実行する場面が多いため、ssh接続してインストールガイドからコピペでコマンドが実行できるようにすると打ち間違えせず楽にインストールができます。
rc-service sshd start
rootパスワードを設定します。
passwd
ip addr show
で確認できるIPアドレスにアクセスをしてsshをしましょう。
パーティション分割~フォーマット
今回はUEFI向けにディスクを作成します。
swapは今回は省略します。
| デバイスパス | マウントポイント | ファイルシステム | | 容量 |
| ---- | ---- | ---- | ---- |
| /dev/sda1 | /efi | vfat | 1GB |
| /dev/sda2 | / | btrfs | 残り全体 |
cgdiskなどで上記パーティションレイアウトに分割します。
分割後、mkfsコマンドでフォーマットをします。
mkfs.vfat -F 32 /dev/sda1
mkfs.btrfs /dev/sda2
ルートパーティションのマウント
/mnt/gentoo下に今作成したパーティションをマウントします。
mkdir --parents /mnt/gentoo
mount /dev/sda2 /mnt/gentoo
mkdir --parents /mnt/gentoo/efi
mount /dev/sda1 /mnt/gentoo/efi
stage3ファイルのインストール
stage3ファイルをインストールします。
まず、/mnt/gentooに移動します。
cd /mnt/gentoo
CLI上で使えるlinksブラウザでstage3ファイルをダウンロードします。
links https://www.gentoo.org/downloads/mirrors/
Downloadページに移動してstage3をダウンロードしましょう。
この際は
stage3-amd64-desktop-openrc-*.tar.xz
という、デスクトップ+openrc環境用のstage3ファイルをダウンロードします。
USEフラグの初期値やprofileがデスクトップ向けに変更されているstage3のようです。
livecd /mnt/gentoo # ls
stage3-amd64-desktop-openrc-20251221T154556Z.tar.xz
このようになっていれば問題ありません。
stage3ファイルをインストールする
stageファイルのダウンロードができたらtarで展開します。
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo
コンパイルオプションの設定
Gentooではコンパイルオプションを/etc/portage/make.confに設定します。今展開したrootfs内のmake.confにオプションを書き込みます。
nano /mnt/gentoo/etc/portage/make.conf
CFLAGS、CXXFLAGS
CFLAGS、CXXFLAGSはGCCコンパイラとC++コンパイラの最適化フラグを定義する辺数です。
以下のように設定します。
-marchフラグを設定することになるかと思います。これを設定すると現在のシステムのアーキテクチャをターゲットとしてFLAGSを選択してくれます。
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
RUSTFLAGS
RUSTFLAGSはRustで書かれたソフトのビルドの際の最適化オプションを設定するフラグです。Rustで書かれたパッケージが多くなってきているのでこのフラグも設定しておいた方がよいです。
最適化レベルの設定はプロジェクトごとに任せ、ターゲットCPUのみ設定するのがおすすめされています。
RUSTFLAGS="${RUSTFLAGS} -C target-cpu=native"
並列コンパイル数を指定するMAKEOPTS変数はデフォルトではnprocが返すスレッド数と同じ数に指定されます。今回はデフォルト値を用います。問題が起きた場合は上限を指定します。
chrootする
DNS情報をコピーします。
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
必要なファイルシステムをマウントします。
多くのファイルシステムのマウントが必要です。これをコピペで済ませるためだけにssh接続をしているまであります。
mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
--make-slave、--make-rslaveはマウント先で行われたマウントをマウント元に反映されないようにするオプションです。例えば、/mediaを/mntに--make-slaveをつけてマウントを行うと、/mnt内でマウントしたファイルシステムを/mediaから確認することができません。rslaveはこの設定を再帰的に行うオプションです。
openrcでは必須ではないようですが、一応行います。
新しい環境に入ります。入った後はchroot環境であることを忘れないようにPS1変数を変更して明示しておきます。
chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot) ${PS1}"
ブートローダのために/dev/sda1をマウントしておきます。
mount /dev/sda1 /efi
Portageを設定する
Gentoo ebuildリポジトリのスナップショットをインストールする
以下コマンドを使うとインストール可能なパッケージの情報やプロファイルの一覧、ニュース等をリモートリポジトリと同期することができます。
emerge-webrsync
これからKDEなど大量のパッケージをダウンロードするため、ミラーサーバーを選択しておきます。
mirrorselectというツールを用いるとミラーサイトを明示的に選ぶことができます。
mirrorselect -i -o >> /etc/portage/make.conf
とすると、ミラーを選んだあと自動的にmake.confに設定ができます。今回はJAIST、IIJ、Rikenのミラーを選びました。
ミラー一覧
GENTOO_MIRRORS="rsync://ftp.iij.ad.jp/pub/linux/gentoo/ \
http://ftp.iij.ad.jp/pub/linux/gentoo/ \
https://ftp.iij.ad.jp/pub/linux/gentoo/ \
ftp://ftp.iij.ad.jp/pub/linux/gentoo/ \
https://ftp.jaist.ac.jp/pub/Linux/Gentoo/ \
http://ftp.jaist.ac.jp/pub/Linux/Gentoo/ \
ftp://ftp.jaist.ac.jp/pub/Linux/Gentoo/ \
rsync://ftp.jaist.ac.jp/pub/Linux/Gentoo/ \
http://repo.jing.rocks/gentoo \
https://ftp.riken.jp/Linux/gentoo/ \
http://ftp.riken.jp/Linux/gentoo/ \
rsync://ftp.riken.jp/gentoo/"
プロファイルを選ぶ
プロファイルを指定します。プロファイルはUSE、CFLAGSなどの初期値を指定するだけでなくパッケージバージョンの範囲の固定などの安定したシステムを構築する上で重要な設定を行っています。
eselect profile list
で表示された中からプロファイルを選びます。
今回は
[7] default/linux/amd64/23.0/desktop/plasma (stable)
を選びます。
eselect profile set 7
CPU_FLAGS_*変数
CPU_FLAGS_*変数はCPUが持っている命令設置やハードウェア機能をビルド条件としてportageに伝える変数です。対応しているCPU命令を明示的に指定します。これを指定しないとパッケージによっては最適化がされず、動作が低速になる可能性があります。
cpuid2cpuflagsというアプリを用いることで自動設定を行うことができます。/etc/portage/package.use/00cpu-flagsに変数を書き込みます。
emerge --ask --oneshot app-portage/cpuid2cpuflags
echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags
VIDEO_CARDS
VIDEO_CARDSは使用するGPUドライバをビルド対象に含めるかを明示的に伝える変数です。例えば仮想マシン上にインストールする場合は以下のような変数にします。
echo "*/* VIDEO_CARDS: virgl qxl" > /etc/portage/package.use/00video_cards
QEMUとVirtIO向けの設定です。
VIDEO_CARDS変数はこのページで確認できます。
タイムゾーンの更新
タイムゾーンを/Asia/Tokyoに設定します。
ln -sf ../usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ロケールの設定
nano /etc/locale.gen
で必要なロケールのコメントアウトを解除します。
en_US.UTF-8
ja_JP.UTF-8
を有効にします。/etc/locale.genの設定が終わったら
locale-gen
でロケールを生成します。
eselect locale listでロケールを選択しますが、日本語を選択すると文字化けが発生する可能性が高いのでとりあえず今はそのままで進めます。
環境をリロードします。
env-update && source /etc/profile && export PS1="(chroot) ${PS1}"
Linuxファームウェアのインストール
Linuxファームウェアをインストールします。この際にライセンス許諾の問題が発生します。
emerge --ask sys-kernel/linux-firmware
以下のようにpackage.license下でライセンス許諾を明示的に記載する必要があります。
echo "sys-kernel/linux-firmware linux-fw-redistributable" \
>> /etc/portage/package.license/linux-firmware
また、Intel CPUのマイクロコードは別にインストールする必要があります。これもライセンスの許諾が必要です。
mkdir -p /etc/portage/package.license
echo "sys-firmware/intel-microcode intel-ucode" \
>> /etc/portage/package.license/intel-microcode
emerge --ask sys-firmware/intel-microcode
sys-kernel/installkernel
カーネルインストール時のinitramfs生成やブートローダ設定などを自動化するパッケージです。ブートローダとしてGRUBを指定するのでgrub USE変数を設定しておきます。
echo "sys-kernel/installkernel grub dracut" \
>> /etc/portage/package.use/installkernel
emerge --ask sys-kernel/installkernel
fsckのインストール
btrfsを扱うためのfsckをインストールします。
emerge --ask sys-fs/btrfs-progs
CachyOSカーネルをインストール
CachyOSカーネルのビルドを行います。非公式リポジトリにCachyOSカーネルパッケージが用意されているため、非公式リポジトリを有効にします。
emerge --ask app-eselect/eselect-repository
eselect repository enable CachyOS-kernels
emaint sync -r CachyOS-kernels
ソースをインストールします。その際にUSE依存問題が発生するのでそれを解決します。
echo "dev-util/perf libpfm" >> /etc/portage/package.use/perf
emerge --ask sys-kernel/cachyos-sources
cachyos-sourcesにおけるCPUスケジューラの設定はUSEフラグにおいて設定ができます。デフォルトではboreフラグが有効になっており、BOREスケジューラが有効になります。今回はデスクトップ用途なのでBOREを使用します。
cachyOS Kernelが想定するLLVMでのコンパイルを行います。
まず、llvm、clang、lldをインストールします。
emerge --ask llvm-core/llvm llvm-core/clang llvm-core/lld
eselectでカーネル一覧表示をします。
現状だとcachyosカーネルだけが用意されていると思います。
eselect kernel list
cachyosを選択します。
eselect kernel set 1
カーネルソースがあるディレクトリに移動します。
cd /usr/src/linux
現在使っているモジュールを自動検出します。
マシンごとの設定をここで行います。
make localmodconfig
選択する設定はよくわからなければデフォルトで構いません。
デフォルトではbtrfsサポートがオフになっているため、コンフィグを変更します。 make nconfigでコンフィグオプションを変更します。
make nconfig
としてから
File systems-> <*>Btrfs filesystem support
を変更します。
またマウス設定やキーボード設定を行います。
Device Drivers ->Input device support -> [*]Mouse interface
Keyboard ->
[*] i8042 PC Keyboard controller
[*] PS/2 driver library
[*] PCI PS/2 keyboard and PS/2 mouse controller
ssh越しでの設定はlocalmodconfigでは自動作成されないのでオプションをより注意して作成する必要があります。
基本的にではなく、2回押して<*>の状態にしてください。
用途に応じて他のファイルシステムの対応もオンにしておきます。ext4がオフになっているので注意です。
カーネルをコンパイルします。``LLVM=1`でLLVMによるコンパイルを行います。
make -j"$(nproc)" LLVM=1
コンパイルが始まる前に複数回質問があります。
Link Time Optimization (LTO) >
1. None (LTO_NONE)
1. 2. Clang Full LTO (EXPERIMENTAL) (LTO_CLANG_FULL) (NEW)
1. 3. Clang ThinLTO (EXPERIMENTAL) (LTO_CLANG_THIN) (NEW)
LTOの設定についてです。ここでは3を選びました。Full LTOと大差ない性能を実現しながら、ビルド時間を短縮することができます。
Randomize layout of sensitive kernel structures >
1. Disable structure layout randomization (RANDSTRUCT_NONE)
1. 2. Fully randomize structure layout (RANDSTRUCT_FULL) (NEW)
構造体メンバ順序をランダムにして攻撃を難しくするセキュリティ強化だそうです。OFFにする理由もないので2を選んでオンにします。
それ以外の質問はすべてEnterでデフォルト設定でよいです。質問が終わったらコンパイルが始まります。
コンパイルが終わったらモジュールのインストールとカーネルのインストールを行い、設定を終了します。
make modules_install
make install
先ほどinstallkernelをインストールしているため、カーネルインストール時の作業をまとめてやってくれます。
/etc/fstab
/etc/fstabを用意します。
以下内容を/etc/fstabに追加します。
/dev/sda1 /efi vfat umask=0077,tz=UTC 0 2
/dev/sda2 / btrfs defaults,noatime 0 1
Arch Linuxと同様にgenfstabを用いた/etc/fstab設定も可能です。chrootを一回抜けてgenfstabを使うと上記のような設定が簡単にできます。-UをつけるとUUID表記で/etc/fstabを設定できます。
emerge --ask sys-fs/genfstab
genfstab -U /mnt/gentoo >> /mnt/gentoo/etc/fstab
KDE Plasmaのインストール
KDE Plasmaをインストールします。今回は面倒を省くため、アプリ全部乗せのkde-plasma/plasma-metaをインストールします。かなり時間がかかります。寝る前などに行っておくとちょうどよいと思います。
emerge --ask kde-plasma/plasma-meta
インストール後はsddmが起動時自動起動するように設定します。/etc/conf.d/display-managerに以下の行を設定します。
DISPLAYMANAGER="sddm"
elogindとdisplay-managerを起動時自動起動するように設定します。
rc-update add elogind boot
rc-update add display-manager default
その他システムアプリのインストール
好き好みですが、検証環境として使うことが多そうなシステムなのでシステムロガーをインストールします。
emerge -S app-admin/sysklogd
インストール後は自動起動設定をしておきます。
rc-update add sysklogd default
現状だとターミナルが入っていません。
KDE Applications内のyakuakeというトップダウン型の使いやすいターミナルエミュレータをインストールします。
emerge --ask kde-apps/yakuake
ユーザ作成 ~ sudo設定まで
ユーザを作成します。
useradd -m <username>
passwd <username>
sudoをインストールします。
emerge --ask app-admin/sudo
visudo
で%sudo ALL=(ALL:ALL) ALLの行のコメントを外します。
外した後にsudoグループを作成し、先ほど作成したユーザをsudoグループに所属させます。
groupadd sudo
usermod -aG sudo <username>
日本語入力環境のインストール
日本語フォントと日本語入力環境をインストールします。
日本語環境はnoto-cjkと等幅フォントをインストールします。
emerge --ask media-fonts/noto-cjk media-fonts/mplus-outline-fonts
入力ツールとしてはfcitx5をインストールします。
emerge --ask app-i18n/fcitx fcitx-configtool
mozcはfcitx5USEフラグをつけてインストールします。
明示的にibus機能も切ってしまいます。
echo "app-i18n/mozc -ibus fcitx5" >> /etc/portage/package.use/mozc
emerge --ask app-i18n/mozc
grubのインストール
grubをインストールし、設定します。
emerge --ask --verbose sys-boot/grub
この際に
GRUB_PLATFORMS="efi-64"が有効になっているか確認します。
若し入っていなかった場合はUSE変数を追加します。
echo 'GRUB_PLATFORMS="efi-64"' >> /etc/portage/make.conf
emerge --ask sys-boot/grub
インストール出来たらgrub-installします。
grub-install --efi-directory=/efi
最後にgrub-mkconfigで設定ファイルを生成します。
grub-mkconfig -o /boot/grub/grub.cfg
再起動
ここまで来たら再起動を行います。
chrootからexitし、rebootを行いましょう。
exit
cd
umount -l /mnt/gentoo/dev{/shm,/pts,}
umount -R /mnt/gentoo
reboot
ログインするとこのような環境が出力されます。
neofetchを出力してみました。
まとめ
今回はGentoo + KDE Plasma + CachyOS + btrfsで非常に挑戦的なデスクトップ環境を作成しました。カーネルオプションの設定につまずき、動作確認が難航しました。
デスクトップ環境を持つ高性能ビルド環境。さらにビルドをまわしながらも他の作業を快適に行うことができるという面白いデスクトップ環境です。Gentoo構築の参考にしていただければと思います。
