Gentooの起動スクリプトでLCDの明るさを変更する

前置き

カーネル・コンフィグでacpiをoffしておけば、GentooはLCDバックライトの明るさを管理しないようです(前回シャットダウン時の明るさを保持)。しかしacpiをonしたカーネルの場合、起動時に明るさが最大レベルへ変更されます(明るすぎ)。そこで、起動時の明るさを任意のレベルに変更する手順をメモっておきます。

本文

LCDの明るさ制御

acpiをonにすると、電力管理に関する情報が/proc/acpiディレクトリの下に置かれます(ここを覗いてみると色々と興味深いのですが道草はやめておきます)。その中の1つが、LCDの明るさを制御するためのファイル /proc/acpi/video/VGA/LCD/brightness です。

 # cat /proc/acpi/video/VGA/LCD/brightness
 levels:  20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 100
 current: 20

明るさを変更するには、上記の選択肢の1つを選んで、brightnessファイルに書き込んでやればOKです。

 # echo 35 >/proc/acpi/video/VGA/LCD/brightness

35だけを書き込むというのが妙な感じですが、/proc配下のファイルは、ファイルのようで実はファイルではないので、これでOKです。カーネル・コンフィグの内容次第では、brightnessファイルが存在しない可能性もあるので、シェルスクリプトで書くなら、下記のようにすれば良さそうです。

 if [ -e /proc/acpi/video/VGA/LCD/brightness ]; then
   echo 35 >/proc/acpi/video/VGA/LCD/brightness
 fi

システム起動時の処理

今は亡きMS-DOSの時代、OS起動時に行いたい処理はautoexec.batに書いてました。Gentooの場合は、以下のような仕組みになっています。

  • /etc/init.d/の下に起動スクリプトを置く
  • rc-updateコマンドで、ランレベルごとに、起動サービス名を登録する
  • 起動スクリプトのインタープリタは/sbin/runscript

例えばapache2やiptablesのようなサーバー系のアプリをemergeすると、/etc/init.d/の下に起動スクリプトがインストールされるので、あとはrc-updateで登録してあげる訳ですね。起動スクリプトにはstart()とかstop()とかrestart()のような、/sbin/runscriptが規定した関数が実装されています。

Gentooをインストールすると、localという起動スクリプトが/etc/init.d/に置かれます。これが、ユーザ用の起動スクリプト(DOSで言うautoexec.bat)です。ただしユーザはlocalスクリプトを直接編集するのではなく、localのstart()の中で呼ばれる/etc/conf.d/local.startを編集するのが作法です。

  • /etc/init.d/localの抜粋
 start() {
   ebegin "Starting local"
   if [[ -e /etc/conf.d/local.start ]] ; then
     source /etc/conf.d/local.start
   fi
   eend $? "Failed to start local"
 }

local.startの中身は、デフォルトでは空っぽです。

  • /etc/conf.d/local.start(初期状態)
 # This is a good place to load any misc programs
 # on startup (use &>/dev/null to hide output)

というわけで、ここに前述のシェルスクリプト断片を追記すればOKです。

  • /etc/conf.d/local.start(編集後)
 if [ -e /proc/acpi/video/VGA/LCD/brightness ]; then
   echo 35 >/proc/acpi/video/VGA/LCD/brightness
 fi

ブラケット[]は、1重でも2重でも良さそうです。1重だとエラーが出たような気がしたのですが、改めて試してみると問題なしでした。ちなみに、[ はコマンドの一種で、/usr/bin/にあります。このとき、] は、[ の引数となります。一方、[[]] はbashの構文です。

ところで、上記の結論に至る前に、独自の起動スクリプトを書いてrc-update addしてみました。

  • /etc/init.d/lcdbrightness.sh
 #!/sbin/runscript

 #depend() {
 #}

 start() {
   ebegin "Setting LCD brightness"
   if [ -e /proc/acpi/video/VGA/LCD/brightness ]; then
     echo 35 >/proc/acpi/video/VGA/LCD/brightness
   fi
   eend $?
 }

 stop() {
   ebegin "Nothing to do for stopping"
   eend $?
 }

 restart() {
   stop
   start
 }

これはこれで動きます。余談ですが、拡張子付きのファイルをrc-update addで登録しても、rc-update showのリストには現れません。rc-updateのバグかなぁ。

Last modified:2010/05/07 22:09:40
Keyword(s):
References:[サーバ管理・Linux関連]
This page is frozen.