試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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を一時的に置いておく場所(カーネル設定として最初に読み込ませる)

関連記事: