RPi2でubuntu14.04LTS(7)pam-scriptでbashログイン非依存なスクリプト実行
0
pam-scriptでLightDMに対応
LightDMでログインするとbashログインを経由せずにx-windowセッションが開始されるので、.bash_profileと.bash_logoutが実行されず、ホームディレクトリのファイルをtmpfsに逃がす仕掛けがうまく働きません。
これを解決するため、pam-scriptでセッション開始/終了時にスクリプトをフックさせることにします。
まずはインストール。
1 |
sudo apt-get -y install libpam-script |
pam-scriptはユーザー認証処理の特定のタイミングでスクリプトをフックする仕組みです。
/usr/share/libpam-scriptに既定のファイル名のスクリプトを置くことで、セッション開始/終了時に任意の処理を噛ませることができます。
また、bashでもLightDMでも同じように動作してくれます。
スクリプト作成
セッション開始時に実行されるスクリプト/usr/share/libpam-script/pam_script_ses_openを新規作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/bin/bash . /usr/share/libpam-script/temporize.list temporize() { if [ ! -L /home/$1 ]; then if [ ! -e /tmp/$1 ]; then if [ -e /home/$1 ]; then cp -ra /home/$1 /tmp/$1 else if [ -d /home/$1 ]; then mkdir -p /tmp/$1 else touch /tmp/$1 fi chown $PAM_USER:$PAM_USER /tmp/$1 fi fi rm -rf /home/$1 ln -s /tmp/$1 /home/$1 fi } [ ! -e /home/$PAM_USER ] && exit 0 [ `w -h | grep -c "^$PAM_USER[ \t]"` -ne "0" ] && exit 0 mkdir -p /tmp/$PAM_USER chown $PAM_USER:$PAM_USER /tmp/$PAM_USER for f in ${ITEMS[@]}; do temporize $PAM_USER/$f done |
セッション終了時に実行されるスクリプトは/usr/share/libpam-script/pam_script_ses_closeです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/bash . /usr/share/libpam-script/temporize.list permanent() { if [ -L /home/$1 ]; then rm /home/$1 fi if [ ! -e /home/$1 -a -e /tmp/$1 ]; then cp -ra /tmp/$1 /home/$1 fi rm -rf /tmp/$1 } [ ! -e /home/$PAM_USER ] && exit 0 [ `w -h | grep -c "^$PAM_USER[ \t]"` -ne "0" ] && exit 0 for f in ${ITEMS[@]}; do permanent $PAM_USER/$f done rm -rf /tmp/$PAM_USER |
pam-scriptはリブート、シャットダウン時の面倒は見てくれないので、まとめて/homeに書き戻すスクリプトwritebackhomeを新規作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash . /usr/share/libpam-script/temporize.list permanent() { if [ -L /home/$1 ]; then rm /home/$1 fi if [ ! -e /home/$1 -a -e /tmp/$1 ]; then cp -ra /tmp/$1 /home/$1 fi rm -rf /tmp/$1 } for u in `ls /tmp`; do [ `cat /etc/passwd | grep -c "^$u:"` -ne "1" ] && continue [ ! -e /home/$u ] && continue for f in ${ITEMS[@]}; do permanent $u/$f done rm -rf /tmp/$u done |
これらのスクリプトは、スクリプトtemporizeから若干変更しました。
ユーザー名を$USERではなく$PAM_USERで受け取っていること、ホームディレクトリが存在するか確認している、退避するファイル名を別ファイルに追い出している、ファイルだけでなくディレクトリにも対応、などの変更を加えています。
退避するファイル名は/usr/share/libpam-script/temporize.listに記述します。
1 |
ITEMS=(".bash_history" ".Xauthority" ".xsession-errors") |
古い処理の削除と修正
.bash_profileからスクリプトの呼び出しを削除します。
1 |
# /usr/local/bin/temporize login |
.bash_logoutからもスクリプトの呼び出しを削除します。
1 2 3 4 5 6 7 8 9 |
# ~/.bash_logout: executed by bash(1) when login shell exits. # when leaving the console clear the screen to increase privacy if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi # /usr/local/bin/temporize logout |
/etc/init.d/transientlogからtemporizeに代えてwritebackhomeを実行させます。
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred # /usr/local/bin/temporize shutdown /usr/local/bin/writebackhome [ -f $LOCKFILE ] || return 1 # Check if I am root [ `id -u` -eq 0 ] || return 2 # Merge back to permanent storage cp -rfup $VARLOG -T $VARLOGPERM # The following cannot fail... or can it? umount -l $VARLOG umount -l $VARLOGPERM rm -f $LOCKFILE return 0 } |
ここでは分かりやすくするためにコメントアウトしていますが、行削除で構いません。
使わなくなったスクリプトは削除しておきます。
1 |
sudo rm /usr/local/bin/temporize |
RPi2でubuntu14.04LTS(6)ディスプレイマネージャーでログイン
0LightDMインストール
ディスプレイマネージャーは、いわゆるグラフィカルログインのインターフェースです。
最初にSLiMを入れようと思ったところ、プロジェクトHPが繋がらず、ArchLinuxのWikiによればSLiMは活動を停止しているとのことでした。
そこでQingyを試してみると、KMSと干渉して動作しません。
というわけで、普通にLightDMを使うことにします。ツールキットはGTKを使います。
1 2 |
sudo apt-get -y install lightdm-gtk-greeter sudo apt-get -y install lightdm |
いきなりlightdmパッケージをインストールすると、大量の依存パッケージもインストールされてしまいます。
先にlightdm-gtk-greeterをインストールすることで、最低限のパッケージだけをインストールします。
設定
/etc/lightdm/lightdm-gtk-greeter-ubuntu.confを編集してテーマをCrunchBang!風にします。
18 19 20 21 22 23 24 25 26 27 |
[greeter] background=#2E3436 theme-name=waldorf icon-theme-name=CrunchBang font-name=Liberation Sans 10 xft-antialias=true xft-dpi=96 xft-hintstyle=slight xft-rgba=rgb indicators=~session;~power |
次に/etc/lightdm/lightdm.confを新規作成してログインダイアログを設定します。
1 2 3 |
[SeatDefaults] greeter-hide-users=true allow-guest=false |
この例では、ユーザー名ドロップダウンを非表示、ゲストログインを不可にしています。
RPi2でubuntu14.04LTS(5)CrunchBang!風にしてみる
0CrunchBang!とPiBang!
CrunchBang!はモノクロのスパルタンなデザインが人気のLinuxディストリビューションで、これにインスパイアされてRaspberryPi向けにPiBang!というディストリビューションが公開されていました。
CPUパワーが向上したRaspberryPi2ではPiBang!がより快適に動作すると期待されますが、PiBang!のRaspberryPi2版はいまのところアナウンスが無いようです。
ということで、自分で作ってみることにしました。
リソースはCrunchBang!のリポジトリから拝借します。
壁紙とテーマを追加
ubuntuリポジトリからgtk2-engines-murrine、CrunchBang!リポジトリからcrunchbang-wallpapersとwaldorf-ui-themeをダウンロードしてインストールします。
1 2 3 4 5 |
sudo apt-get install gtk2-engines-murrine wget http://packages.crunchbang.org/waldorf/pool/main/crunchbang-wallpapers_1.0-1_all.deb wget http://packages.crunchbang.org/waldorf/pool/main/waldorf-ui-theme_0.07_all.deb sudo dpkg -i crunchbang-wallpapers_1.0-1_all.deb sudo dpkg -i waldorf-ui-theme_0.07_all.deb |
テーマが使用するliberationフォントをインストールします。
1 |
sudo apt-get -y install ttf-liberation |
- テーマ設定
ObConf(右クリック→ObConf)でWaldorfテーマを選択 - 壁紙設定
Nitrogen(右クリック→Wallpaper)でPreferencesを開いてAdd(参照先ディレクトリ追加)。
/usr/share/backgroundsを追加。
default-tile.pngを選択。
dmenuインストール
dmenuはsuckless-toolsパッケージに入っています。
1 |
sudo apt-get install suckless-tools |
起動スクリプトを~/config/dmenu/dmenu-bind.shに新規作成します。
1 2 |
#!/bin/bash dmenu_run -b -nb '#151617' -nf '#d8d8d8' -sb '#d8d8d8' -sf '#151617' |
CrunchBang!の設定ファイルを取得
CrunchBang!リポジトリからcb-configsのtarボールをダウンロードして展開します。
1 2 |
wget http://packages.crunchbang.org/waldorf/pool/main/cb-configs_20130504-2.tar.gz tar xzf cb-configs_20130504-2.tar.gz |
OpenBoxの設定
~/.config/openbox/rc.xmlを~/.config/openbox/~rc.xmlにリネーム。
CrunchBang!のcb-configs-20130504/skel/.config/openbox/rc.xmlを~/.config/openboxにコピー。
1 2 |
mv ~/.config/openbox/rc.xml ~/.config/openbox/~rc.xml cp cb-configs-20130504/skel/.config/openbox/rc.xml ~/.config/openbox |
~/.config/openbox/rc.xmlの下のブロックを、~/.config/openbox/~rc.xmlの内容で置き換える。
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 |
<!-- Keybindings for running applications --> <keybind key="A-F2"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>Run Program</name> </startupnotify> <command>gmrun</command> </action> </keybind> <keybind key="A-F3"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>dmenu-bind</name> </startupnotify> <command>~/.config/dmenu/dmenu-bind.sh</command> </action> </keybind> <keybind key="W-f"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>spacefm</name> </startupnotify> <command>spacefm</command> </action> </keybind> <keybind key="W-t"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>Terminal</name> </startupnotify> <command>lxterminal</command> </action> </keybind> <keybind key="W-x"> <action name="Exit"> <prompt>yes</prompt> </action> </keybind> <keybind key="W-Tab"> <action name="ShowMenu"> <menu>client-list-combined-menu</menu> </action> </keybind> <keybind key="W-space"> <action name="ShowMenu"> <menu>root-menu</menu> </action> </keybind> |
tint2設定
CrunchBang!のcb-configs-20130504/skel/.config/tint2/tint2rcを~/.config/tint2にコピー。
1 |
cp cb-configs-20130504/skel/.config/tint2/tint2rc ~/.config/tint2 |
conky設定
CrunchBang!のcb-configs-20130504/skel/.conkyrcを~にコピー。
1 |
cp cb-configs-20130504/skel/.conkyrc ~ |
SYSTEM INFOからスワップ表示を削除してCPU周波数を追加、SHORTCUT KEYSからアサインされていない表示を削除します。
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
############################################## # Output ############################################## TEXT S Y S T E M I N F O ${hr} Host:$alignr$nodename Uptime:$alignr$uptime Frequency (in MHz):$alignr$freq CPU1 usage:$alignr${cpu cpu0}% CPU2 usage:$alignr${cpu cpu1}% CPU3 usage:$alignr${cpu cpu2}% CPU4 usage:$alignr${cpu cpu3}% RAM:$alignr$mem/$memmax Disk usage:$alignr${fs_used /}/${fs_size /} Networking Up:$alignr${upspeed eth0} Networking Down:$alignr${downspeed eth0} S H O R T C U T K E Y S ${hr} Alt+F2$alignr Run Dialog Alt+F3$alignr Alt Menu Super+Space$alignr Main Menu Super+Tab$alignr Client Menu Super+t$alignr Terminal Super+f$alignr File Manager Super+x$alignr Logout |
アイコンテーマ
ubuntuリポジトリからdmz-cursor-themeを、CrunchBang!からgnome-icon-theme、crunchbang-icon-themeをインストールします。
1 2 3 |
sudo apt-get install dmz-cursor-theme wget http://packages.crunchbang.org/waldorf/pool/main/gnome-icon-theme_3.4.0-2crunchbang2_all.deb wget http://packages.crunchbang.org/waldorf/pool/main/crunchbang-icon-theme_20130502-1_all.deb |
cb-configs-20130504/skel/.gtk2rc-2.0を~にコピー。
cb-configs-20130504/skel/.config/gtk-3.0/settings.iniを~/.config/gtk-3.0にコピー。
1 2 3 4 |
cp cb-configs-20130504/skel/.gtkrc-2.0 ~ cp cb-configs-20130504/skel/.gtkrc-2.0.mine ~ mkdir .config/gtk-3.0 cp cb-configs-20130504/skel/.config/gtk-3.0/settings.ini ~/.config/gtk-3.0 |
RPi2でubuntu14.04LTS(4)x-window
0インストール
まずx-windowをインストールします。
1 2 |
sudo apt-get -y install libraspberrypi-bin libraspberrypi-dev \ xserver-xorg-video-fbturbo xinit x11-xserver-utils |
インストールが完了したら/etc/X11/xorg.confを新規作成します。
1 2 3 4 5 6 |
Section "Device" Identifier "Raspberry Pi FBDEV" Driver "fbturbo" Option "fbdev" "/dev/fb0" Option "SwapbuffersWait" "true" EndSection |
ウインドウマネージャーはOpenBoxを使用します。
1 |
sudo apt-get -y install openbox openbox-xdgmenu obmenu |
デスクトップはCrunch Bang!(PiBang!)に倣って軽量のアプリケーションでまとめることにします。
- パネル tinit2
- 監視ツール conky
- ランチャ gmrun
- ターミナル lxterminal
- ファイルマネージャ spacefm
- 壁紙 hsetroot nitrogen/li>
1 |
sudo apt-get -y install tint2 conky gmrun lxterminal spacefm hsetroot nitrogen |
設定
OpenBox開始時の設定
OpenBox開始時にtintとconkyが起動するように設定を行います。
デフォルトの設定ファイルが/etc/xdg/openboxにあるので、これを~/.config/openboxにコピーします。
1 |
cp /etc/xdg/openbox/* ~/.config/openbox |
~/.config/openbox/autostartの末尾に設定を記述します。
15 16 17 18 19 20 21 22 23 |
# If you want to use XFCE config tools... # #xfce-mcs-manager & xset r rate 250 25 & spacefm --daemon-mode & nitrogen --restore & tint2 & conky -q & |
19行はキーリピートの設定、20行はspacefmをデーモンモードで起動しています。
startxすると画面下にtint2、左上にconkyが表示されます。
conkyのチラつき対策
conkyはデフォルト設定のままでは表示がチラつくので、これを解消するため、/etc/conky/conky.confに「double_buffer yes」を追加します。
54 55 56 57 58 59 |
show_graph_scale no show_graph_range no double_buffer yes TEXT ${scroll 16 $nodename - $sysname $kernel on $machine | } |
OpenBoxメニュー
インストールしたアプリケーションをOpenBoxのメニューに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
<?xml version="1.0" encoding="UTF-8"?> <openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd"> <menu id="root-menu" label="Openbox 3"> <item label="Run Program"> <action name="Execute"> <command> gmrun </command> </action> </item> <separator/> <item label="Terminal emulator"> <action name="Execute"><execute>x-terminal-emulator</execute></action> </item> <item label="Web browser"> <action name="Execute"><execute>x-www-browser</execute></action> </item> <item label="File Manager"> <action name="Execute"> <command> spacefm </command> </action> </item> <!-- This requires the presence of the 'menu' package to work --> <menu id="/Debian" /> <separator /> <menu id="client-list-menu" /> <separator /> <item label="ObConf"> <action name="Execute"><execute>obconf</execute></action> </item> <item label="ObMenu"> <action name="Execute"><execute>obmenu</execute></action> </item> <item label="Wallpaper"> <action name="Execute"> <command> nitrogen /usr/share/backgrounds </command> </action> </item> <item label="Reconfigure"> <action name="Reconfigure" /> </item> <item label="Restart"> <action name="Restart" /> </item> <separator /> <item label="Exit"> <action name="Exit" /> </item> </menu> </openbox_menu> |
ショートカットキー
OpenBoxのショートカットキーバインドを設定します。
~/.config/openbox/rc.xmlのから下を変更します。
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 |
<!-- Keybindings for running applications --> <!-- <keybind key="W-e"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>Konqueror</name> </startupnotify> <command>kfmclient openProfile filemanagement</command> </action> </keybind> --> <keybind key="A-F2"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>Run Program</name> </startupnotify> <command>gmrun</command> </action> </keybind> <keybind key="W-f"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>spacefm</name> </startupnotify> <command>spacefm</command> </action> </keybind> <keybind key="W-t"> <action name="Execute"> <startupnotify> <enabled>true</enabled> <name>Terminal</name> </startupnotify> <command>lxterminal</command> </action> </keybind> <keybind key="W-x"> <action name="Exit"> <prompt>yes</prompt> </action> </keybind> <keybind key="W-Tab"> <action name="ShowMenu"> <menu>client-list-combined-menu</menu> </action> </keybind> <keybind key="W-space"> <action name="ShowMenu"> <menu>root-menu</menu> </action> </keybind> |
上記の変更では以下のショートカットを追加しました。
- Alt+F2 ランチャ
- Super+f ファイルマネージャ
- Super+t ターミナル
- Super+x ログアウト
- Super+Tab メインメニュー
- Super+Space デスクトップとウィンドウの一覧
RPi2でubuntu14.04LTS(3)タイムゾーン、キーボード、ロケール設定
0タイムゾーンとキーボード
タイムゾーンの設定はdpkg-reconfigureから行います。
1 |
sudo dpkg-reconfigure tzdata |
日本語キーボードを使っている場合は、同様にdpkg-reconfigureから設定します。
1 |
sudo dpkg-reconfigure keyboard-configuration |
Keyboard modelはGeneric 105-key (Intl) PC、Country of origin for the keyboardはJapaneseを選択、そのほかはデフォルトのままで良いでしょう。
ロケール変更
ロケールを生成するlocale-genは、/var/lib/locales/supported.d下のファイルを参照します。
デフォルトでは英語ロケールのenファイルのみが存在します。このファイルを編集して、不要なロケールをコメントアウトしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#en_HK.UTF-8 UTF-8 #en_DK.UTF-8 UTF-8 #en_IN UTF-8 #en_ZM UTF-8 #en_ZW.UTF-8 UTF-8 #en_NZ.UTF-8 UTF-8 #en_PH.UTF-8 UTF-8 #en_NG UTF-8 #en_US.UTF-8 UTF-8 #en_GB.UTF-8 UTF-8 #en_AU.UTF-8 UTF-8 #en_SG.UTF-8 UTF-8 #en_BW.UTF-8 UTF-8 #en_AG UTF-8 #en_ZA.UTF-8 UTF-8 #en_CA.UTF-8 UTF-8 #en_IE.UTF-8 UTF-8 |
通常はen_US.UTF-8だけで良いでしょう。
日本語ロケールを追加してロケールを変更します。
この作業はローカルコンソールで行います。SSH接続はクライアントのロケール情報が送信されるため、うまく行きません。
1 2 |
sudo locale-gen --purge ja_JP.UTF-8 sudo update-locale LANG=ja_JP.UTF-8 LC_TIME=POSIX LC_MESSAGES=POSIX |
時刻表示とメッセージは(ローカルコンソールで日本語表示が文字化けするので)POSIXにしておきます。
一旦ログアウトしてログインし直すと、ロケールが日本語になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
ubuntu@ubuntu:~$ locale LANG=ja_JP.UTF-8 LANGUAGE= LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="POSIX" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="POSIX" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL= ubuntu@ubuntu:~$ |
RPi2でubuntu14.04LTS(2)SDを延命
0tmpfsを使う
SDへの書き込み回数を減らすため、テンポラリディレクトリをtmpfsにマウントするよう/etc/fstabを変更します。
対象とするのは/tmp、/var/tmpです。
1 2 3 4 5 |
proc /proc proc defaults 0 0 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 /dev/mmcblk0p1 /boot/firmware vfat defaults 0 2 tmpfs /tmp tmpfs defaults,size=32m,noatime,mode=1777 0 0 tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0 |
後ろの2行が追加した部分です。
logをtmpfsに置いてバックアップ
/var/logもtmpfsに持っていきたいところですが、logはあとで参照したい場合がありますね。
スクリプトを使ってシャットダウン時にSDにバックアップしておき、起動時にtmpfsに戻せないかと考えていたところ、denian向けにちょうど良いスクリプトがありましたので、これを利用することにします。
このページから-etc-init.d-transientlog.shをダウンロードしてファイル名transientlogで保存します。
transientlogを/etc/init.dに配置し、パーミッションを設定します。
1 2 3 |
sudo sh -c "tr -d '\r' < transientlog > /etc/init.d/transientlog" sudo chown root:root /etc/init.d/transientlog sudo chmod a+x /etc/init.d/transientlog |
ファイルの改行コードがCR+LFなので、trコマンドでCRを削除しながらコピーしています。
このあとにinsservコマンドでスクリプトを登録するのですが、「Required-Startが無い」「Required-Stopが無い」と言ってエラーになるので、Providesの後に記述しておきます。
1 2 3 4 5 6 7 |
#!/bin/sh ### BEGIN INIT INFO # Provides: transientlog # Required-Start: # Required-Stop: # X-Start-Before: $syslog # X-Stop-After: $syslog |
insservで登録します。
1 |
sudo /usr/lib/insserv/insserv transientlog |
ホームディレクトリのファイル
~/.bash_historyなどもtmpfsに持って行きましょう。
bashスクリプト/usr/local/bin/temporizeを新規作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/bin/bash FILES=(".bash_history" ".Xauthority" ".xsession-errors") temporize() { if [ ! -L $HOME/$1 ]; then if [ ! -e /tmp/$USER/$1 ]; then if [ -e $HOME/$1 ]; then cp -ra $HOME/$1 /tmp/$1 else touch /tmp/$USER/$1 fi fi rm -rf $HOME/$1 ln -s /tmp/$USER/$1 $HOME/$1 fi } permanent() { if [ -L $HOME/$1 ]; then rm $HOME/$1 fi if [ ! -e $HOME/$1 -a -e /tmp/$USER/$1 ]; then cp -ra /tmp/$USER/$1 $HOME/$1 fi rm -rf /tmp/$USER/$1 } do_start() { if [ `w -h |grep -c "^$USER[ \t]"` -eq "1" ]; then mkdir -p /tmp/$USER for f in ${FILES[@]}; do temporize $f file done fi } do_stop() { if [ `w -h |grep -c "^$USER[ \t]"` -eq "1" ]; then for f in ${FILES[@]}; do permanent $f done rm -rf /tmp/$USER fi } do_stopall() { for u in `ls /tmp`; do echo $u if [ `cat /etc/passwd | grep -c "$u:"` -eq "1" ]; then for f in ${FILES[@]}; do permanent $u/$f done rm -rf /tmp/$u fi done } case "$1" in login) do_start ;; logout) do_stop ;; shutdown) do_stopall ;; *) ;; esac |
temporize loginとして実行すると、~/.bash_history、~/.Xauthority、~/.xsession-errorsを/tmp/$USERにコピーし、ホームディレクトリからリンクを張ります。
temporize logoutではリンクを削除して/tmp/$USERからホームディレクトリに書き戻します。
シャットダウンやリブートするときは、temporize shutdownで/tmpからすべてのユーザーのファイルを書き戻します。
ログイン時にtemporize loginを実行するように~/.bash_profileを編集します。
1 |
/usr/local/bin/temporize login |
~/.bash_logoutにはtemporize logoutの処理を追記します。
1 2 3 4 5 6 7 8 9 |
# ~/.bash_logout: executed by bash(1) when login shell exits. # when leaving the console clear the screen to increase privacy if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi /usr/local/bin/temporize logout |
シャットダウンとリブート時にはtemporize shutdownを実行するように、/etc/init.d/transientlogを編集します。
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred /usr/local/bin/temporize shutdown [ -f $LOCKFILE ] || return 1 # Check if I am root [ `id -u` -eq 0 ] || return 2 # Merge back to permanent storage cp -rfup $VARLOG -T $VARLOGPERM # The following cannot fail... or can it? umount -l $VARLOG umount -l $VARLOGPERM rm -f $LOCKFILE return 0 } |
キャッシュ間隔を長くする
デフォルトではメモリキャッシュの書き込みは5秒間隔となっています。
これを30秒に設定します。/etc/sysctrl.confの末尾に以下の行を追加します。
1 |
vm.dirty_writeback_centisecs = 3000 |
mlocateを削除
cron.dailyでmlocate(ファイル検索)のデータベースが更新されています。
私はmlocateを使わないので、パッケージごと削除してしまいます。
1 |
sudo apt-get purge mlocate |
RPi2でubuntu14.04LTS(1)インストール
0RaspberryPi2にubuntuをインストールしてみます。
OSイメージはubuntuのwikiで公開されているコミュニティ版を使用します。
イメージ書き込み
ZIPファイルにはimgとbmapがアーカイブされています。ddまたはbmapでSDにイメージを書き込みます。
1 2 |
sudo dd bs=4M if=ubuntu-trusty.img of=/dev/sdX sudo sync |
または
1 |
sudo bmaptool copy --bmap ubuntu-trusty.bmap ubuntu-trusty.img /dev/sdX |
書き込みが完了したらSDをraspiに挿してブートします。ユーザー、PWはともに”ubuntu”です。
領域拡張
raspbianのraspi-configにあたる設定ツールが無いので、ディスク領域拡張は手作業で行います。
まず、fdiskを起動して、パーティション2を最大領域に作り直します。
1 |
sudo fdisk /dev/mmcblk0 |
第2パーティションを削除(d,2)して、新規で再度作成(n,p,enter,enter,enter)、セーブして終了(w)。
ここで一旦リブートします。
1 |
sudo reboot |
再度ログインしたらパーティション2をリサイズします。
1 |
sudo resize2fs /dev/mmcblk0p2 |
アップデート
アップデートをかけてOSを最新の状態にしておきましょう。
1 2 |
sudo apt-get update sudo apt-get upgrade |
これで最小構成のubuntuが使えるようになりました。
UbuntuのPHP+NginxでリモートなXdebug (4) リモートデバッグ
0サーバ上のPHPコードにアクセスできるようになったので、ローカルのEclipseでPHPプロジェクトを作ります。
「Install New Software」で「Luna – http://download.eclipse.org/releases/luna」を選択し、「General Purpose Tools」の「Dynamic Language Toolkit – Remote Development Support」をインストールします。
インストール後、Eclipseが再起動したらサーバのディレクトリにEclipseのPHPプロジェクトを作ります。
Remote System Explorerのパースペクティブを開き、Remote SystemsビューのSftp Filesからプロジェクトに設定するディレクトリを右クリック。Create Remote Projectを選択します。
ここでは/usr/share/nginx/htmlを選択しました。
PHPパースペクティブを開くと、新しいプロジェクトが出来ています。
最後にEclipseのXdebug設定です。
「Run→Debug Configurations」で設定ダイアログを開き、PHP Web Applicationを選択してNew launch configurationのアイコンをクリックします。
ServerパネルのConfigureボタンをクリックしてサーバ設定ダイアログを開き、DebuggerにXDebug、Base URLにサーバのURLを設定します。
ServerタブのFileに、実行するPHPファイルのワークスペース内のパス(この場合は/192.168.2.18_html/phpinfo.php)を設定、URLのAuto Generateのチェックを外してURLのファイルパスにサーバのドキュメントルートからの相対パスを設定します。
DebuggerタブのServer DebuggerでXDebugを選択、Debug Through SSH Tunnelにチェックを入れてUserとPasswordを設定します。
以上で設定は完了です。
Apply、Debugの順にクリックしてデバッグを開始します。
デフォルトではコードの最初の行で自動的にブレークします。
UbuntuのPHP+NginxでリモートなXdebug (3) Eclipse+RSEでサーバにアクセス
0前の記事まででサーバ側の準備ができました。
あとはサーバにXdebugで接続すればリモートデバッグできるのですが、サーバとローカルのコードを同期させなくてはならなかったりして微妙に面倒です。「ここまで出来るんなら、もう少し何とかしてくれていいのではないか?」という不満が残りますね。
そこで、EclipseとRSE(Remote System Explorer)プラグインを使って、サーバ上のPHPコードにローカルのEclipseからアクセスできるようにしましょう。
ここでは、Eclipse4.4(Lunar)PDTにRSE3.5プラグインを追加する例を示します。
Eclipseはとにかくインストール済みとします。
あらかじめサーバのドキュメントルートのパーミッションを適宜設定しておいてください(chown -Rでwww-data:www-dataにして、ユーザの初期グループをwww-dataにしておくとか)。
RSEはEclipseのTarget Managementリポジトリにあります。
「Help→Install New Software」を開き、「Add」で「Add Repository」ダイアログを開きます。
Locationに「http://download.eclipse.org/tm/updates/3.5」と入力します。Nameは適当で構いません。
OKしてしばらく待つと、パッケージのリストが表示されます。
「Remote SystemExplorer End-User Runtime」を選択してインストールを実行します。
インストール完了後、Eclipseを再起動すると、パースペクティブに「Remote System Explorer」が追加されています。
パースペクティブを開き、左側の「Remote Systems」ビューで右クリック。「New→Connection」で新しい接続を追加します。
ここではSSHで接続することにします。
続くダイアログでホスト名を入力してFinishすると、Remote Systemsビューにホスト名が追加されます。
これでローカルのEclipseからサーバ上のファイルを編集したり、SSHログインできるようになりました。
UbuntuのPHP+NginxでリモートなXdebug (2) Xdebugインストール
0まずはPECLを使うためにphp5-devをインストールします。
binutilやら何やらも必要になるので、-yオプションを付けて一気に済ませてしまいましょう。
$ sudo apt-get install -y php5-dev
次に、PECLでXdebugをインストール。
$ sudo pecl install xdebug
aptでphp5-xdebugを入れても良いのですが、私はより新しいバージョンを使うためにPECLからのインストールを選択しました。aptで入れればbinutilなどのリソースを省けるので、どちらを選ぶかはお好みで。
2016/01/08 追記 ubuntu14.04では、-Zオプションが必要です。
$ sudo pecl install -Z xdebug
Xdebugをインストールしたら/etc/php5/mods-available/xdebug.iniを作成します。
1 2 3 |
zend_debuger=xdebug.so xdebug.remote_enable=On xdebug.remote_connect_back=On |
xdebug.remote_connect_back=On
はすべてのホストからサーバのXdebugに接続できるようにします。
リモートデバッグするホストを特定の1台に限る場合は、代わりにxdebug.remote_host="nnn.nnn.nnn.nnn"
と記述しておくと安全です。
FPM経由でXdebugを有効にするため、/etc/php5/fpm/conf.d/20-xdebug.iniからリンクを張ります。
$ sudo ln -s /etc/php5/mods-available/xdebug.ini /etc/php5/fpm/conf.d/20-xdebug.ini
設定は以上です。FPMを再起動します。
$ sudo service php5-fpm restart
ブラウザでphpinfo.phpを開き、Xdebugが有効になっていれば設定は完了です。