Debianのインストールの後、授業で使うコンピュータとしてパッケージの追加と削除、デフォルトの設定、メニューの編集を行う。特にログインのユーザーリストの禁止、DHCP関係のソフトの交換は重要。GRUBの設定、Firefoxのデフォルト値、 gconftool-2 による設定、勝手にできるディレクトリを抑制、rc.localによる操作なども解説。
このページは「Squeezeを40台にコピーするまでの手順(2010/9/10)」(1)の詳細です。
NTPDATE_USE_NTP_CONF=no NTPSERVERS="jonah.st.seiai.ed.jp" NTPOPTIONS=""
インプットメソッドが複数ある場合、どのインプットメソッドを使うかを切り替える必要があります。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 でも同じものが起動されるようになりました。
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の方が簡単にできそうなものだと思うのですが。
gij44 | sun-java |
切り替えには 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 ならば、/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 ならば、 /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 がそれぞれ Iceweasel, Icedove としてパッケージされています。Windows版もあるので、メニュー表記に iconと文字で Firefox, Thunderbird と同じものであることをアピールしたい。
/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
/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に似た仕組みになりました。
何人まで出るかは確認していませんが、学校での利用には邪魔なので排除します。(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
次のログインから元に戻ります。
ホスト名が出るようになりました。前の版のLennyでは「ようこそ」となっていました。
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から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 には 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 を削除すると、手動でつなぐまでネットワークにアクセスできません。allow-hotplug の代わりに auto eth0 を加えます。これでも事態は改善しません。
次に、network-manager を削除しました。これでもだめです。
そういえば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や端末を起動できなくなります。
/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 で選択する必要はないのですが、将来のためにこうしておきます。
/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);
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 に次のようなスクリプトを加えます。
#!/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 というファイルを使うようになってからディレクトリをみただけで作業をする設定なのか、いまは動かしていないかがすぐにわかって便利になりました。
今回のバージョンはこれについては自動で適切な設定がされるようになりました。うまくいくのでどの様な仕組みになったかは追いかけていませんが、Lenny では悩みのタネであったことがすっきり解決したことは書きたくてしかたありません。
以下はSqueezeでは不要の話です。
Lenny ではUSBメモリが使用できないことがありました。もちろんスタンドアロンでインストールされたものは問題はありません。しかし、サーバーで認証されるようにした場合にはハード的には認識するけど使用できないという状態になっていました。
同様の問題が音声、ビデオ、CD-ROM などにもあって、/etc/security/group.conf で許可を与える必要がありました。コンピュータのもろもろのデバイスを使用する権限を与えるかどうかを誤るとセキュリティ上の問題が生じます。たとえば遠隔地からログインするユーザーにマイクの使用を認めたら、盗聴のようなことを許してしまうかもしれないわけです。
このなかで、plugdev への許可を与えてもUSBメモリだけは(ローカルで認証されたユーザーでないと)使えないという現象があり、しかたなく /etc/dbus-1/system.d/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>