もくじ

(1)使用するソフトを揃えること(2010/9/10)

概要

Debianのインストールの後、授業で使うコンピュータとしてパッケージの追加と削除、デフォルトの設定、メニューの編集を行う。特にログインのユーザーリストの禁止、DHCP関係のソフトの交換は重要。GRUBの設定、Firefoxのデフォルト値、 gconftool-2 による設定、勝手にできるディレクトリを抑制、rc.localによる操作なども解説。

このページは「Squeezeを40台にコピーするまでの手順(2010/9/10)」(1)の詳細です。

メニューに出るパッケージ

gameを削除
やはり邪魔になります
OpenOffice.org(Debian版でなくオフィシャルパッケージを入れる)
Debian版の不満な点はCalcの小数点以下の桁数の変更のリセットボタンがないことですが、将来的にオフィシャル版もそのようになる可能性があります。
Debian版はバージョンアップが多少遅れがちです。オフィシャル版を使えばWindows版とバージョンが揃います。これが気にならなければDebian版でも充分です。
Blender(3Dモデリング・レンダリングツール)
授業では使ったことはありませんが入れておきます
Audacity(デジタルオーディオエディタ)
これも授業では使ったことはありませんが音声ファイルをウェブに出すために、これで編集したことがあります。Windows版もありますので紹介の意味で入れておきます。
VLC(メディアプレーヤ)
マルチメディア系に弱いとされるLinuxですが最近変化が見られます。これもWindows版があります。
Geany(editor/軽量IDE)
Gnome標準のGeditよりプログラマ向けの色の濃いエディタですが、編集中のhtml文書を1ボタンで表示したりプログラムを実行したりもできますから、簡易なIDEとしても使えます。
ghex(GUI Hex editor)
ファイルを16進表記でダンプし、編集・保存もできます。文字コードの学習に使えます。
KSeg, Maxima(数学)
授業では使ったことはありませんが入れておきます
Stellarium(天文)
プラネタリウムです。今回のバージョンからとてもよくなりました。コンピュータにそれなりの性能を要求します。2.8Gデュアルコア、メモリ2GBで使用にたえています。
Tkgate(電気回路)
授業では使ったことはありませんが入れておきます
IBus(uim,scimに代わる input method)
デフォルトでインストールされる日本語システムは UIM(インプットメソッド) と Anthy(漢字変換システム) の組み合わせです。UIMだとF10キーでの英数変換がうまくいかないのでSCIMにしていましたが、今回SCIMにちょっとおかしな動きが見えたので最近自分のシステムで使っていたIBusにしました。インストールするとIBusがデフォルトになります。メニューは[システム]-[設定]-[IBusの設定]で名前が出ます。
下にインプットメソッドの選択の解説あり
ibus-anthy(日本語入力システム)
ibusでanthyを使うにはこのパッケージが必要です。Anthyの設定はトレイの中のIBusの表示から入ります。「メニューに表示される」とは言えないかも知れません。SCIMやuimならば、メニューの[システム]-[設定]-[SCIMの設定]や[uimの設定]からAnthyの設定(ローマ字入力やかな入力の切り替え)ができますが、Anthyが表示されているのではありませんね。

メニューに出ないパッケージ

bsdmainutils(hd:hexdumpのため)
hdコマンドはファイルを16進表記でダンプします。文字コードの学習に使えます。端末でテキスト出力で使用します。編集の必要があるなら ghex を使います。
hexer(CUI Hex editor)
ファイルを16進表記でダンプします。文字コードの学習に使えます。端末内でウインドウ表記をします。編集の必要があるなら ghex を使います。
nautilus-open-terminal(端末の中に開く)
ファイルマネージャから表示中のディレクトリをカレントディレクトリとして端末を開きます。
flashplugin-nonfree(flashプラグイン)
flashのために必要ですが、タイミングによってはadobeのサイトからのインストールが必要なこともありました。
libstdc++5, libnspr4(firefoxのプラグイン HTML Validator に必要)
Firefoxのプラグインに、「HTML Validator」がありますhtmlの文法チェックをインターネットに接続することなくローカルでやってくれます。Debianだとすんなりインストールできないことも多いのですが、今回も古いバージョンのライブラリが必要でした。Windowsではいつも問題なく使えています。
ntpdate(時刻同期)
クライアントコンピュータは起動時にサーバーと時刻合わせをする程度で問題ないでしょうから、ntpdateが適しています。
/etc/default/ntpdate にサーバーを書いておけば自動でやってくれます。ファイル中に説明がありますが項目は次の3つだけ。
NTPDATE_USE_NTP_CONF=no
NTPSERVERS="jonah.st.seiai.ed.jp"
NTPOPTIONS=""
firmware-linux-nonfree(ドライバいろいろ)
名前のとおり、nonfreeのパッケージも入れるように指定すると現れます。いつもはインストール時に自動で設定されるままに任せるのですが、今回はネットワークハードウェアの検出で、Squeezeをインストールにあるようにファームウェアファイルが不足と表示されたのであとからこれを入れました。結果としてあってもなくてもdmesgにはまだ不足しているというメッセージが残っています。
Java (openjdk-6 がおすすめらしいが…sun-java6-jdkで)
Debianのjavaパッケージには (1)GNU Java (gcj) と(2)openjdk-6 と(3)sun-java6の3つがあります。(1)と(2)main, (3)はnonfreeです。さらにプログラムを作るためのjdkといわれるものと、実行環境だけのjreの2つに分けられます。デフォルトでインストールされるのは(1)のjreだけです。
jreだけが初めから入っているのは、Openoffice.orgなどjreを使うアプリケーションが多いからです。しかし、jdkは手動でインストールしなければなりません。
(2)はsun-javaがオープンソースとなる過程でオープンにできない部分を除いて作られたものと聞いていますが、GUIを含むプログラムで不具合がでることがあったので、今回も(3)をインストールします。
jdkをインストールすると対応するjreもインストールされます。
下にJavaの選択の解説あり。
Java, ruby, gcc などはメニューに、エディタと端末を開くだけのスクリプトを作ります。
ruby (ruby1.8)
Squeezeにはruby1.8とruby1.9の2つのパッケージがあります。rubyというパッケージを選択すると、ruby1.8がインストールされます。1.9はまだテスト版なので1.8にします。
gcc-4.4 (GNU C Compiler)
Squeezeにはgcc4.3とgcc4.4の2つのパッケージがあります。gccというパッケージを選択すると、gcc4.4がインストールされます。素直にデフォルトにしたがいます。
昔はLinuxをインストールしてCコンパイラがインストールされないことはなかったと思いますが、最近はデフォルトで入らないようです。
g++-4.4 (GNU C++)
c++のGNU版。C++はプリプロセッサでC++の記述をCに書き直してCでコンパイルするという手法をとります。g++もcppというパッケージと一緒にインストールされます。

インプットメソッドの選択

インプットメソッドが複数ある場合、どのインプットメソッドを使うかを切り替える必要があります。IBusは優先度(Priority)が高いのでインストールしただけでデフォルトになります。

root(Linuxの管理者)で im-switch を使うとこのコンピュータのデフォルトを指定できます。

~# im-switch -c
System wide default for ja_JP locale is marked with [+].
There are 8 choices for the alternative xinput-ja_JP (providing /etc/X11/xinit/xinput.d/ja_JP).

  Selection    Path                                    Priority   Status
------------------------------------------------------------
* 0            /etc/X11/xinit/xinput.d/ibus             60        auto mode
  1            /etc/X11/xinit/xinput.d/ibus             60        manual mode
  2            /etc/X11/xinit/xinput.d/scim             0         manual mode
  3            /etc/X11/xinit/xinput.d/scim-bridge      60        manual mode
  4            /etc/X11/xinit/xinput.d/scim-immodule    50        manual mode
  5            /etc/X11/xinit/xinput.d/uim              30        manual mode
  6            /etc/X11/xinit/xinput.d/uim-systray      40        manual mode
  7            /etc/X11/xinit/xinput.d/uim-toolbar      30        manual mode
  8            /etc/X11/xinit/xinput.d/uim-toolbar-qt   30        manual mode

Press enter to keep the current choice[*], or type selection number: 

-c オプションをつけて実行すると選択になります。IBus に * がついてこれがデフォルトになっていると分かります。メッセージにあるように番号で選択します。Enterだけ入力すると変更しません。

rootでなく、一般ユーザーで im-switch を行うとそのユーザーの使用するインプットメソッドを変更できます。Squeezeでは[メニュー]-[設定]-[入力メソッド切替器]というGUIによる設定が新設され、im-switch でも同じものが起動されるようになりました。

Javaの選択

update-alternatives で調べるとjavaでは2つの候補になっています

~# update-alternatives --list java
/usr/bin/gij-4.4
/usr/lib/jvm/java-6-sun/jre/bin/java

gijは gnu iterpreter java からきた名前らしい。一方javacは、

~# update-alternatives --list javac
/usr/lib/jvm/java-6-sun/bin/javac

コンパイラはひとつだけです。

このままだとコンパイルはsunのものだが実行はgijになります。

gnuのインタープリタもかなりよくなってきていますが、今回もGUIで不具合がみつかりました。Jtextfieldで日本語が入力できません。imとの連携はsunよりもgnuの方が簡単にできそうなものだと思うのですが。

gij44sun-java
gijのJtextfield sun-javaのJtextfield

切り替えには update-alternatives --config を使います。javacには選択肢は1つしかありません。

~# update-alternatives --config javac
There is only one alternative in link group javac: /usr/lib/jvm/java-6-sun/bin/javac
Nothing to configure.

javaでは次の様に選択できます。

root@star00:/home/adachi# update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                  Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gij-4.4                       1044      auto mode
  1            /usr/bin/gij-4.4                       1044      manual mode
  2            /usr/lib/jvm/java-6-sun/jre/bin/java   63        manual mode

Press enter to keep the current choice[*], or type selection number: 

管理者が決めると一般ユーザーは変更できないもようです。

メニューに、エディタと端末を開くだけのスクリプト

KnoppixEduの真似をしてプログラミングのメニューに、エディタと端末を開くだけのスクリプトを入れました。Linuxで Java, C, Perl, Ruby などたくさんのプログラミング言語を使えるということをアピールすることも目的です。

/usr/local/bin/start-* というスクリプトを作成。ファイル名は何でもいいのですが、自分が作ったということが分かる方が後のメンテナンスで楽でしょう。パーミッションは755。

合計 16
-rwxr-xr-x 1 root staff 59 2010-08-24 21:06 start-c
-rwxr-xr-x 1 root staff 65 2010-08-24 21:06 start-java
-rwxr-xr-x 1 root staff 65 2010-08-24 21:06 start-perl
-rwxr-xr-x 1 root staff 65 2010-08-24 21:06 start-ruby

Java

java ならば、/usr/local/bin/start-java という名前にします。

#!/bin/bash
test -d ~/java && cd ~/java
gnome-terminal &
gedit &

ユーザーホームにjavaというフォルダがあれば、カレントディレクトリにして端末とエディタを起動するというスクリプトです。

これをメニューに登録するために、/usr/share/apprications/*.desktop を作成

Java ならば /usr/share/apprications/java.desktop という名前にします。

[Desktop Entry]
Encoding=UTF-8
Name=Java
Comment=Sun Java 6
Exec=/usr/local/bin/start-java
Icon=sun-java6
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true
NoDisplay=false

Categoriesを指定するとメニューにとりこまれます。

Iconはこの様にファイル名を拡張子なしで指定すると探してくれます。マニュアルには/usr/share/icons/hicolor/48x48/apps にアイコンファイルを入れておくように書いてありますが、/usr/share/pixmaps/ 内も探す様です。javaはここに入っていました。

C

c ならば、 /usr/share/apprications/c.desktop という名前にします。

[Desktop Entry]
Encoding=UTF-8
Name=C
Comment=C
Exec=start-c
Icon=ledblue
Terminal=false
MultipleArgs=false
Type=Application
Categories=Application;Development;
StartupNotify=true
NoDisplay=false

Exec はこのようにパスを当てにしてコマンドのみ書いても動きます。

c, perl, ruby のアイコンは knoppix の /usr/share/icons/ の eNuvola というテーマから /usr/share/icons/hicolor/48x48/apps/ledxxx.png としてコピーさせてもらっています。xxxは色の名前。

デスクトップテーマによりアイコンのデザインも変更するということを可能にするため複雑になっていますが、デフォルトは hicolor なのでここに入れておけばOKなのです。大きさは48x48を作っておけばあとは縮小・拡大してくれます。

変更を反映させるには、次の命令の実行が必様です。(アイコンのファイルの加除でなければ不要)

~# gtk-update-icon-cache /usr/share/icons/hicolor

Firefox, Thunderbird

Firefox, Thunderbird がそれぞれ Iceweasel, Icedove としてパッケージされています。Windows版もあるので、メニュー表記に iconと文字で Firefox, Thunderbird と同じものであることをアピールしたい。

Firefox

/usr/share/apprications/iceweasel.desktop への書き加え

Iceweasel.desktop は多くの言語でそれぞれの表記になるように多くの行からなりますが、日本語環境で使用されるのは [ja] とある部分です。強調部分を書き加えました。メニューの表記にはX-GNOME-FullNameを使っている様です。Iconは言語別ではなかったのですが [ja] をつけた行を加えるとそれが使われるようになりました。イスラム圏では赤十字が赤い三日月になっている様に、絵も必ずしも同じに理解されないのでうまくできていると思います。以下は一部だけ

Name[ja]=Iceweasel
Comment[ja]=ウェブを閲覧します
GenericName[ja]=ウェブ・ブラウザ
X-GNOME-FullName[ja]=Iceweasel(Firefox) ウェブ・ブラウザ
Icon=iceweasel
Icon[ja]=firefox

iceweaselのアイコンは png と xpm 両方あります。

/usr/share/app-install/icons/iceweasel.png
/usr/share/pixmaps/iceweasel.png
/usr/share/pixmaps/iceweasel.xpm

/usr/share/icons/hicolor/48x48/apps/firefox.png としてメニューに使うアイコンを用意します。

アイコンは別の機械にインストールされた Firefox からコピーします。.xpm形式の50x50をそのまま放り込んでもいいようですが、pngに変換しました。/usr/share/pixmaps/ に入れてもよかったのだと思います。

メニューに反映されなければ次のコマンドを実行します。

~# gtk-update-icon-cache /usr/share/icons/hicolor

Thunderbird

/usr/share/applications/icedove.desktop への書き加え

icedove.desktop はあっさりしています。英語中心に他言語はさらっと加えています。X-GNOME-FullNameも使っていません。以下は...の省略部分以外は全部。

[Desktop Entry]
Name=Icedove Mail/News
Name[ja]=Icedove(Thunderbird)  Mail/News
Comment=Read/Write Mail/News with Icedove
GenericName=Mail Client
Exec=icedove %u
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=icedove
Icon[ja]=thunderbird 
Categories=Network;Email;News;GTK;
MimeType=message/rfc822;
StartupWMClass=Icedove-bin
StartupNotify=true
Name[ca]=Client de correu Icedove
...
Comment[ca]=Llegiu i escriviu correu
...
Comment[ja]=メールの読み書き
...

icedoveのアイコンは xpm だけです。

~$ find /usr/share/ -name icedove.xpm
/usr/share/app-install/icons/icedove.xpm
/usr/share/pixmaps/icedove.xpm

これもアイコンは別の機械にインストールされた Thunderbird からコピーします。.xpm 形式を png に変換しました。/usr/share/icons/hicolor/48x48/apps/ に入れました。

排除設定

デフォルトのままでは困ることが若干あります。

ユーザーリストの禁止

ログインしたことのあるユーザーがリストになって表示され選択するインターフェースになっていました。ずっとパッケージマネージャでアップグレードを続けているSqueezeでは昔のままユーザー名とパスワードを必ず入力するようになっています。この8月にネットワークインストールしたSqueezeでは、Windowsに似た仕組みになりました。

user-list

何人まで出るかは確認していませんが、学校での利用には邪魔なので排除します。(3年ほど前にKDEをインストールしたときには、全アカウントの一覧を出す設計でした。本校はldapで認証していますから全生徒のユーザー名がリストされました。さすがに今回はそれはないようです)

この設定は、/etc/gdm3/greeter.gconf-defaults です。

# Use a specific background
/desktop/gnome/background/picture_filename	/usr/share/images/desktop-base/moreblue-orbit-gdm.svg
/desktop/gnome/background/picture_options	stretched

# Theming options
#/desktop/gnome/interface/gtk_theme		Clearlooks

# Greeter options
/apps/gdm/simple-greeter/logo_icon_name 	debian-swirl

# Some other possible options
#/apps/gdm/simple-greeter/banner_message_enable		true
#/apps/gdm/simple-greeter/banner_message_text		Welcome
#/apps/gdm/simple-greeter/disable_restart_buttons	false
#adachi
#/apps/gdm/simple-greeter/disable_user_list		false
/apps/gdm/simple-greeter/disable_user_list		true

# The lower panel doesn't work with the compositor
/apps/metacity/general/compositing_manager		false

次のログインから元に戻ります。

user-input

ホスト名が出るようになりました。前の版のLennyでは「ようこそ」となっていました。

DHCP関係のソフトを削除・交換

MACアドレスを使ってホストごとに毎回同じIPアドレスとホスト名を配布しています。

DHCPからホスト名を設定できるようにDHCP関係のソフトを削除・交換する必要がありました。

結論として次の作業で解決しましたが、最善かどうかはわかりません。

/etc/hostname ファイルを削除
network-manager 0.8.1-2+b1 削除
dhcp3-client 4.1.1-P1-9 削除
dhcp3-common 4.1.1-P1-9 削除
dhcpcd 1:3.2.3-5 インストール
dhcp-probe 1.3.0-5 インストール
/etc/network/interfaces の allow-hotplug eth0 を auto eth0 に書換え

解説

DHCP からホスト名を取得できていない

インストーラによるインストール後の状態では、DHCPからIPアドレスは取得できますがホスト名が取得できなくなりました。ホスト名はインストール時に入力した名前が /etc/hostname に格納されています。このままでは全部のホストが同一名称になります。/etc/hostname を削除すればDHCPからホスト名を取得するようになるはずでしたがこれがうまくいきません。ホスト名は (none) になります。

今回からホスト名が greeter に出るようになったのでこれはとても目立ちます(前項ユーザーリストの禁止の写真参照)。同じホスト名は問題が出るでしょうし、括弧が含まれるホスト名も問題があるかもしれません。

まず起動時のメッセージに注目

....
Cleaning up ifupdown....
Setting up networking....
....
Setting up console font and keymap...done
Setting sensors limits.
startpar: service(s) returned falure: hostnsme.sh ... failed! 
Running scripts in rcS.d/ took 5 seconds.
INIT: Entering runlevel: 2
...

起動時に failed! と表示される hostname.sh rcS.d/ で実行それ、本体は /etc/init.d/hostname.sh というスクリプトで root なら起動後も実行できる。引数を省略すれば start と同じ

beta@(none):~$ ls -l /etc/init.d/hostname.sh 
-rwxr-xr-x 1 root root 1423 2010-07-03 17:01 /etc/init.d/hostname.sh
beta@(none):~$ file /etc/init.d/hostname.sh
/etc/init.d/hostname.sh: POSIX shell script text executable
root@(none):~# /etc/init.d/hostname.sh start
hostname: the specified hostname is invalid
root@(none):~# /etc/init.d/hostname.sh
hostname: the specified hostname is invalid

hostname.sh スクリプトの中の一部はこんな感じ。

[ -f /etc/hostname ] && HOSTNAME="$(cat /etc/hostname)"

# Keep current name if /etc/hostname is missing.
[ -z "$HOSTNAME" ] && HOSTNAME="$(hostname)"

# And set it to 'localhost' if no setting was found
[ -z "$HOSTNAME" ] && HOSTNAME=localhost

(1)まず、/etc/hostname があればその内容を HOSTNAME にする。(2)それで HOSTNAME が設定されない(空文字列の)ときは hostname コマンドを実行し結果を HOSTNAME に格納する。(3)それでも HOSTNAME が設定されないときは localhost とする。という内容です。localhostというホスト名になっていないので (none) は(2)の hostname コマンドから返される値ということになります。

beta@(none):~$ ls -l /bin/hostname 
-rwxr-xr-x 1 root root 10780 2010-03-22 20:21 /bin/hostname
beta@(none):~$ file /bin/hostname
/bin/hostname: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

コンパイルされた実行ファイルなのでこれ以上はソースを見るということになってしまいます。

hostnameコマンドは dhcp からホスト名を受けとるでしょうか。

IPアドレスを受け取っているので、DHCPとの接続はできています。そして、/etc/dhcp/dhclient.conf には次の様に設定されています。

request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, domain-name-servers, domain-search, host-name,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers;

従って、/etc/hostname がないにもかかわらず DHCP からホスト名を受け取らない別の理由があるはずです。

/etc/network/interfaces の hotplug

/etc/network/interfaces には allow-hotplug eth0 との記述があります。

root@(none):~# cat /etc/network/interfaces 
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp

最近は複数のネットワークインターフェースを持っていて状況により切り替えたり、別のLANに移動してIPアドレスを取得しなおす必要が出たりします。そのデフォルトゲートウェイやDNSをそれに合わせて取得することも必要になってきます。そのための allow-hotplug なのでしょう。

起動時にホスト名が変わるのはよいとしても稼働中にホスト名も変わってしまうのは問題が生ずるかもしれません。

allow-hotplug, network-managerの削除

allow-hotplug を削除すると、手動でつなぐまでネットワークにアクセスできません。allow-hotplug の代わりに auto eth0 を加えます。これでも事態は改善しません。

次に、network-manager を削除しました。これでもだめです。

DHCPの交換

そういえばLennyの時にも交換した記憶がよみがえりました。

dhcp3-client と dhcp3-common を削除、代わりに dhcpcd をインストールしました。 dhcp-probe も必要でした。

/etc/default/dhcpcd が設定のファイルです。

# Config file for dhcpcd. Note that you have to edit the interface
# name below, or duplicate the configuration for different interfaces.
# If you are editing this file just to get DNS servers set by DHCP,
# then you should consider installing the resolvconf package instead.

case ${INTERFACE} in
eth0) 

# Uncomment this to allow dhcpcd to set the DNS servers in /etc/resolv.conf
# If you are using resolvconf then you can leave this commented out.
#SET_DNS='yes'
SET_DNS='yes'

# Uncomment this to allow dhcpcd to set hostname of the host to the
# hostname option supplied by DHCP server.
#SET_HOSTNAME='yes'
SET_HOSTNAME='yes'

# Uncomment this to allow dhcpcd to set the NTP servers in /etc/ntp.conf
#SET_NTP='yes'
SET_NTP='yes'

# Uncomment this to allow dhcpcd to set the YP servers in /etc/yp.conf
#SET_YP='yes'

# Add other options here, see man 8 dhcpcd-bin for details.
OPTIONS=()
;;

# Add other interfaces here
*)
;;

esac

これで起動時にホスト名を取得する様になります。

/var/log/messages によると次の様にリースの更新の度にホスト名の再設定をしています。

Oct  6 20:23:24 star39 kernel: [   61.686706] Slow work thread pool: Starting up
Oct  6 20:23:24 star39 kernel: [   61.686797] Slow work thread pool: Ready
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: renewing lease of 10.5.5.139
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: leased 10.5.5.139 for 600 seconds
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: removing route to 169.254.0.0/16 metric 0
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: adding IP address 10.5.5.139/8
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: adding default route via 10.5.5.1 metric 0
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: adding route to 169.254.0.0/16 metric 0
Oct  6 20:27:31 star39 dhcpcd[1113]: eth0: setting hostname to `star39'
Oct  6 20:27:31 star39 dhcpcd.sh: interface eth0 has been configured with old IP=10.5.5.139

これにより、たとえ hostname hogehoge とホスト名を手動で変更してもリースの更新時に star39 にリセットされます。ちなみにXwindowの端末から手動でホスト名を変更すると新たなFirefoxや端末を起動できなくなります。

より快適にするための設定

GRUB

/etc/default/grub を編集します。GRUB2になって変更になりました。以前は /boot/grub/menu.lst を編集したものですが、/boot/grub/grub.cfg を元に menu.lst が自動生成される様になりました。 ファイルのコメントにあるように /etc/default/grub を変更後 update-grub コマンドで /boot/grub/grub.cfg を更新するようになっています。

/etc/default/ 以下のファイルに設定を書き込むタイプのものが増えてきました。

/etc/default/grub 強調部分2箇所を変更しました。

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_LINUX_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

今回のシステムには Squeeze しか入っていないので GRUB で選択する必要はないのですが、将来のためにこうしておきます。

Firefoxのデフォルト値

/etc/iceweasel/profile/prefs.jsに書いたものは、最初にユーザーのプロファイルにコピーされ、デフォルト値になるはず。"Do not edit this file."はユーザーにコピーされた時に生きる注意書き(のはず)

すでにfirefoxを使っているユーザーはこれはコピーされないと思われる。

# Mozilla User Preferences

/* Do not edit this file.
 *
 * If you make changes to this file while the browser is running,
 * the changes will be overwritten when the browser exits.
 *
 * To make a manual change to preferences, you can visit the URL about:config
 * For more information, see http://www.mozilla.org/unix/customizing.html#prefs
 */
user_pref("browser.cache.disk.capacity", 30000);
user_pref(user_pref("browser.startup.homepage", "http://www.st.seiai.ed.jp/");
user_pref("network.proxy.autoconfig_url", "http://www.st.seiai.ed.jp/proxy.pac");
user_pref("network.proxy.type", 2);

gconftool-2 による設定

gconfの管理者による設定

~# gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults/
 --type string --set /desktop/gnome/interface/menubar_accel F11
~# gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults/
 --type string --set /system/proxy/autoconfig_url http://www.st.seiai.ed.jp/proxy.pac
~# gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.defaults/
 --type bool --set /desktop/gnome/interface/menus_have_icons true

記録されるのはここ

root@star00:/home/adachi# cat /etc/gconf/gconf.xml.defaults/%gconf-tree.xml
<?xml version="1.0"?>
<gconf>
	<dir name="desktop">
		<dir name="gnome">
			<dir name="interface">
				<entry name="menubar_accel" mtime="1283090430" type="string">
					<stringvalue>F11</stringvalue>
				</entry>
				<entry name="menus_have_icons" mtime="1283088947" type="bool" value="true"/>
			</dir>
		</dir>
	</dir>
	<dir name="system">
		<dir name="proxy">
			<entry name="autoconfig_url" mtime="1283088855" type="string">
				<stringvalue>http://www.st.seiai.ed.jp/proxy.pac</stringvalue>
			</entry>
		</dir>
	</dir>
</gconf>

勝手にできるディレクトリを抑制

このような分類フォルダを自動でつくってくれます。余計なお世話です。なぜファイルの種類で分類すると決めてかかるのでしょうか。時間や仕事の種類で分類をしたい人もいると思うのですが。加えてコンソールから使うときは日本語は面倒です。一時「ダウンロード」だったのが「Downloads」になったのはこの理由だと思います。

どうも最近の Windows 7 に倣ったようです。MSが作った拡張子もファイルの種類の分類のためでした。

root@localhost:/home/beta# ls -l /etc/xdg/
合計 16
drwxr-xr-x 2 root root 4096 2010-08-19 19:35 autostart
drwxr-xr-x 2 root root 4096 2010-08-19 20:01 menus
-rw-r--r-- 1 root root  414 2010-03-25 01:56 user-dirs.conf
-rw-r--r-- 1 root root  418 2010-03-25 01:56 user-dirs.defaults

このうち、user-dirs.defaults がその元のようです。実際にはlocaleに合わせて翻訳した名称がどこからか入るはずです。

root@localhost:/home/beta# cat /etc/xdg/user-dirs.defaults 
# Default settings for user directories
#
# The values are relative pathnames from the home directory and
# will be translated on a per-path-element basis into the users locale
DESKTOP=Desktop
DOWNLOAD=Downloads
TEMPLATES=Templates
PUBLICSHARE=Public
DOCUMENTS=Documents
MUSIC=Music
PICTURES=Pictures
VIDEOS=Videos
# Another alternative is:
#MUSIC=Documents/Music
#PICTURES=Documents/Pictures
#VIDEOS=Documents/Videos

ドキュメントフォルダがユーザーホームの中にさらにあるべきかは、いろいろ思うところもあるのですが、ここの分類では音楽や画像がドキュメントから独立しています。音楽や画像は自分で作らないものでドキュメントは自分で作るという人にはこれがいいのかもしれません。教育現場の場合はそうではありません。

DESKTOP と DOWNLOAD のみ容認してみました。

DESKTOP=Desktop
DOWNLOAD=Downloads
#adachi
#TEMPLATES=Templates
#PUBLICSHARE=Public
#DOCUMENTS=Documents
#MUSIC=Music
#PICTURES=Pictures
#VIDEOS=Videos

rc.localによる操作

起動時に実行される rc.local にスクリプトを書き加える事ができる。ここからサーバーのスクリプトを呼び出すようにしておくと、サーバー側から設定の変更、ファイルのコピーなどの指示ができて便利です。

いままでにこれが活躍した場面は次のような場合でした。

/etc/hostname の削除
ついうっかり忘れ、全部が同じホスト名だった
xorg.conf 修正
ディスプレイを変更したら不具合が出たので修正した xorg.conf をコピー。現在のDebian(Squeeze)では必要のない作業
windows.ini の書き換え
メモリを増設したら Windows Me が起動できなくなった。patch を使って MaxFileCache=524288 の指定を書き加えた。
バイナリエディタ "hexer" をインストール
1ファイルのコマンドなので、/usr/bin/ にそのままコピー。 man も /usr/share/man/man1/ にコピー
javaplugin を使えるようにシンボリックリンクをつくる
当時 Firefox を別にインストールしていたので自動的に面倒を見てもらえなくて後から追加
firefox.desktop 修正
修正した firefox.desktop をコピー

次の様に動きます

  1. 起動時に rc.local が実行される
  2. rc.local はサーバーの所定の場所をマウントし、そこの rc.sh スクリプトを実行する
  3. rc.sh はあらかじめ必要に応じて指示された作業をおこなう

クライアント側の rc.local

rc.local に次のようなスクリプトを加えます。

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
## add by adachi for server execute script
test -d /mnt/sys || mkdir /mnt/sys
mount -t nfs jonah:/zhome/star-rc /mnt/sys
cd /mnt/sys
if [ -x ./rc.sh ] ; then
  ./rc.sh
  date >/tmp/rc-execute.txt
  echo 'true' >>/tmp/rc-execute.txt
  chmod 0666 /tmp/rc-execute.txt
else
  date >/tmp/rc-execute.txt
  echo 'false' >>/tmp/rc-execute.txt
  chmod 0666 /tmp/rc-execute.txt
fi
cd - >>/tmp/rc-execute.txt
umount /mnt/sys

exit 0

シェルに /bin/sh が指定されています。Lennyでは sh は bash のことだったのですが、今は dash になっています。起動時のスクリプトはコンパクトなシェルを使うという考え方のようです。bash で使える pushd, popd が使えなくなり原因究明に手間どったことがあります。

内容はまずマウントポイントがなければ作って、マウント。マウントが成功すればrc.shがあるはずなので確認後rc.shを実行します。

/tmp/rc-execute.txt にいろいろ書き込んでいるのはデバッグのためです。本来は必要ありません。ただカレントディレクトリは大事をとって元に戻しています。"cd -" がそれです。

サーバー側の設定

サーバー側でマウントする部分を用意します。star-rc というディレクトリを /etc/exports に加えます。root でマウントできるように no_root_squash が必要です。

# /etc/exports: the access control list for filesystems which may be exported
#		to NFS clients.  See exports(5).
/zhome/star-rc  10.0.0.0/255.0.0.0(rw,sync,no_root_squash)

rc.sh スクリプト

#!/bin/bash
sys=$PWD
hst=`hostname`
dte=`date +'%Y/%m/%d %H:%M:%S'`
if [ -e do ]; then
   # something to do
   echo $dte done something >>$sys/done/$hst
else
   echo $dte no command >> $sys/done/$hst
fi

# something to do の部分にやらせたいことを書きます。echoの行は記録で、ホストごとのファイルに書き足していきます。

root@jonah:/srv/star-rc# cat done/star40 
2010/10/03 15:15:08 no command
2010/10/03 15:17:55 no command
2010/10/03 15:53:35 no command

doneというディレクトリの一覧から全部のホストが起動されたかがわかります。

[ -e do ] はstar-rc というディレクトリに do というファイルがあれば実行するということで、用意ができたらこのファイルを作ります。中身はなくてもいいので、

root@jonah:/srv/star-rc# touch do

とでもします。全機に作業が行き渡ったらこのファイルを削除します。

root@jonah:/srv/star-rc# rm do

このようにしなければならないわけではありませんが、do というファイルを使うようになってからディレクトリをみただけで作業をする設定なのか、いまは動かしていないかがすぐにわかって便利になりました。

USBメモリ

今回のバージョンはこれについては自動で適切な設定がされるようになりました。うまくいくのでどの様な仕組みになったかは追いかけていませんが、Lenny では悩みのタネであったことがすっきり解決したことは書きたくてしかたありません。

以下はSqueezeでは不要の話です。

かつては

Lenny ではUSBメモリが使用できないことがありました。もちろんスタンドアロンでインストールされたものは問題はありません。しかし、サーバーで認証されるようにした場合にはハード的には認識するけど使用できないという状態になっていました。

同様の問題が音声、ビデオ、CD-ROM などにもあって、/etc/security/group.conf で許可を与える必要がありました。コンピュータのもろもろのデバイスを使用する権限を与えるかどうかを誤るとセキュリティ上の問題が生じます。たとえば遠隔地からログインするユーザーにマイクの使用を認めたら、盗聴のようなことを許してしまうかもしれないわけです。

このなかで、plugdev への許可を与えてもUSBメモリだけは(ローカルで認証されたユーザーでないと)使えないという現象があり、しかたなく /etc/dbus-1/system.d/hal.conf を書換えて無条件に許可するようにせざるを得ませんでした。

現在の hal.conf

次に示すのは現在の書き直す必要のない hal.conf です。以前はここでいったん deny したものをあとで allow を加えていくという書き方でした。今回のはその deny がみあたりません。

また、pam まわりもかなり整備されました。そちらの変更も影響しているのかもしれません。

/etc/dbus-1/system.d/hal.conf

<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <!-- This configuration file specifies the required security policies
       for the HAL to work. -->

  <!-- Only root or user haldaemon can own the HAL service -->
  <policy user="haldaemon">
    <allow own="org.freedesktop.Hal"/>
  </policy>
  <policy user="root">
    <allow own="org.freedesktop.Hal"/>
  </policy>

  <!-- Allow anyone to invoke methods on the Manager and Device interfaces -->
  <policy context="default">
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.DBus.Introspectable"/>
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.DBus.Properties" />

    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Device"/>
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Manager"/>
  </policy>

  <!-- Only allow users at the local console to manipulate devices,
       requires consolekit -->
  <policy at_console="true">
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Device.CPUFreq"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.DockStation"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KillSwitch"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KeyboardBacklight"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Leds"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LightSensor"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage.Removable"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.WakeOnLan"/>
  </policy>

  <!-- Debian group policies -->
  <policy group="powerdev">
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Device.CPUFreq"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.DockStation"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KillSwitch"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KeyboardBacklight"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Leds"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LightSensor"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.WakeOnLan"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
  </policy>
  <policy group="plugdev">
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage.Removable"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
  </policy>

  <!-- well,...and root too -->
  <policy user="root">
    <allow send_destination="org.freedesktop.Hal"
           send_interface="org.freedesktop.Hal.Device.CPUFreq"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.DockStation"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KillSwitch"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.KeyboardBacklight"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Leds"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.LightSensor"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Storage.Removable"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
    <allow send_destination="org.freedesktop.Hal"
    	   send_interface="org.freedesktop.Hal.Device.WakeOnLan"/>

  </policy>

</busconfig>

Linuxクライアント/サーバ運用
聖愛中学高等学校
安達 順一
http://www.seiai.ed.jp/
2010-10-12