uvesafb使用時のgenkernelによるカーネルビルドの流れを自動化
uvesafbを使用する形でのカーネルビルドは、v86dの関係で、一度カーネルが出来上がってからv86dを再作成し、それをカーネル組み込みの初期RAMディスクイメージに含めるという流れになる。
関連記事:
genkernelは、カーネルのインストール作業を支援し、コマンドの実行数を減らしてくれる上に、外部の初期RAMディスクイメージ(initrd/initramfs)を作成し、グラフィカル起動のfbsplashを含めたりもしてくれるので、便利ではあるのだが、このuvesafbの関係で、genkernelを2回実行してその間にv86dの再インストールをすることになるため、コマンド一発では終わらない。
そこで、この流れをシェルスクリプトにまとめることにした。
[任意]ファイル名: update-kernel.sh
#! /bin/bash export CCACHE_DIR="/root/.ccache" GENSPLASH_THEME="livecd-2007.0" #REMERGE_PACKAGES="klibc v86d splashutils" REMERGE_PACKAGES="v86d" GENKERNEL_CONFIG_OPTS="--xconfig" GENKERNEL_EXTRA_OPTS="--splash=${GENSPLASH_THEME}" EXTRA_PACKAGES="nvidia-drivers vmware-modules virtualbox-modules" KERNEL_LINK="kernel" INITRAMFS_LINK="initrd.cpio.gz" TMP_CONFIG="/tmp/kernel-config" ARCH=$(uname -m) . /etc/init.d/functions.sh if [ "${UID}" -ne 0 ]; then eerror "This script must be run as root." exit 1 fi prepare() { if sh -c "zcat /proc/config.gz > ${TMP_CONFIG}"; then GENKERNEL_CONFIG_OPTS="${GENKERNEL_CONFIG_OPTS} --kernel-config=${TMP_CONFIG}" fi } build_kernel() { echo; einfo "Building kernel (1/2)"; echo genkernel --no-install ${GENKERNEL_CONFIG_OPTS} ${GENKERNEL_EXTRA_OPTS} kernel || return 1 echo; einfo "Running emerge -1 ${REMERGE_PACKAGES}"; echo emerge -1 ${REMERGE_PACKAGES} || return 1 echo; einfo "Building kernel (2/2)"; echo genkernel --no-mrproper --no-clean --no-menuconfig ${GENKERNEL_EXTRA_OPTS} all || return 1 return 0 } emerge_extra() { if [[ -n "${EXTRA_PACKAGES}" ]]; then echo; einfo "Running emerge -1 ${EXTRA_PACKAGES}"; echo if ! emerge -1 ${EXTRA_PACKAGES}; then return 1 fi fi return 0 } update_boot_symlink() { echo; einfo "Updating symlinks for kernel/initramfs"; echo local version=$(ls -l /usr/src/linux | sed -e 's:.*linux-\(.*\):\1:') [[ $? -ne 0 ]] && return 1 cd /boot && ln -fs kernel-genkernel-${ARCH}-${version} ${KERNEL_LINK} && ln -fs initramfs-genkernel-${ARCH}-${version} ${INITRAMFS_LINK} && return 0 || return 1 } cleanup() { rm ${TMP_CONFIG} -f } prepare if build_kernel && emerge_extra && update_boot_symlink; then einfo "Update succeeded" cleanup exit 0 else eerror "Update failed" cleanup exit 1 fi
以下、変数の説明。環境や好みで調整する。
- CCACHE_DIR: カーネルビルド時のccache用キャッシュディレクトリの指定
- GENSPLASH_THEME: initrdに含めるfbsplashテーマ
- REMERGE_PACKAGES: 一度目のカーネルビルド後にインストールし直すパッケージ(基本的にv86dのみ)
- GENKERNEL_CONFIG_OPTS: genkernelのカーネル設定用オプション
- GENKERNEL_EXTRA_OPTS: genkernelでカーネルをビルドするときに指定する追加オプション
- EXTRA_PACKAGES: カーネルモジュールを含むことによりカーネルインストール後に再インストールするパッケージ
- KERNEL_LINK: /boot/以下にインストールされたカーネルファイルに対して作成するシンボリックリンク名
- INITRAMFS_LINK: 同様に、新しく作成されたinitrdに対して作成するシンボリックリンク名
- TMP_CONFIG: ビルド時に動作しているカーネルの設定/proc/config.gzを一時的に置いておく場所(カーネル設定として最初に読み込ませる)
関連記事: