Solaris10 x86_64のパッチ当てを普通に
# smpatch update
と行ったのだが、139556-08カーネルパッチで見事にハマリ。
症状は起動しなくなるというもの。(起動途中で止まる)
とりあえずSafe Modeで起動して、init 6で再起動させるとbootadm update-archiveが走ったようなメッセージが表示されてログオンプロンプトまでは表示されたものの、非大域ゾーンが一つも立ち上がらない。。。
とりあえず手が無いので、スナップショットからパッチ当て以前の状態にリストアしました。
最初どのパッチが原因かは掴めなかったので、色々検索していると
139556-08カーネルパッチで似たような症状を発見。
とりあえず、手で一つずつパッチを当てていき、問題のカーネルパッチは書かれている通りにSafe Modeで起動し直して、
# cd /a/var/sadm/spool
# patchadd -n -R /a 139556-08.jar
# bootadm update-archive -R /a
とやってみたところ、無事に起動した。
教訓1 パッチ当ての前には必ずスナップショットかバックアップを取っておく
# zfs snapshot [プール名]@before
教訓2 パッチを当てるときは事前にある程度情報収集を行う。
・・・大事ですねぇ。
Solaris10でGNU Screenがコンパイルできないで記載したとおり、何とかSolaris10でGNU Screenが使えるようになった訳ですけど。。。
ネタもないので、自分の.screenrc(GNU Screenの設定ファイル)を晒してみます。
escape ^Tt
startup_message off
hardstatus on
hardstatus alwayslastline "screen %{= wk} %`%-w%{=b bw}%n %t%{-}%+w %u %= %{= KG} %02m/%02d %{= KM}[%02c] "
autodetach on
defscrollback 20000
vbell on
bell ^G
idle 180 blanker
blankerprg fortune meigen
bind -c REGION 2 split
bind -c REGION 1 only
bind -c REGION 0 remove
bind -c REGION o focus
bind -c REGION ^ resize
bind x command -c REGION
bind w windowlist -b
bindkey "\033[5D" prev
bindkey "\033[5C" next
工夫というか、hardstatusで常に最下行にScreenのウインドウ一覧と日時が表示されるようになっています。キーバインドはCtrl+T。デフォルトのCtrl+Aは使いにくいし、Ctrl+XはEmacsと被るし、Ctrl+Zはシェルと被るので、、、不都合の少ないであろうキーを割り当てました。(昔はCtrl+Xだったんですが・・・)
あと、fortuneを入れておいて、3分放置すると名言集辞書が表示されるようになってます。
結構、ssh接続しっぱなしで放置する事が多いもんで。(^^;
BSDとかLinuxに標準で含まれているfortuneですが、Solarisには標準で含まれていないので。
fortune ・・・ ジョークツールなんですが、格言辞書を用意すると、コマンドを実行する度にランダムに格言を表示してくれるツールです。
Solaris10上でGNU Screenをコンパイルしようとするとエラーになる件。
$ ./configure --enable-pam --enable-locale --enable-colors256 --enable-rxvt_osc --enable-telnet --with-sys-screenrc=/etc
$ make
CPP="gcc -E " srcdir=. sh ./osdef.sh
AWK=nawk CC="gcc -g -O2" srcdir=. sh ./comm.sh
AWK=nawk srcdir=. sh ./term.sh
gcc -c -I. -I. -g -O2 screen.c
gcc -c -I. -I. -g -O2 ansi.c
gcc -c -I. -I. -g -O2 fileio.c
gcc -c -I. -I. -g -O2 mark.c
gcc -c -I. -I. -g -O2 misc.c
misc.c: In function `xsetenv':
misc.c:619: error: too few arguments to function `setenv'
*** Error code 1
make: Fatal error: Command failed for target `misc.o'
few arguments to functionと言っているのが何でかなぁと・・・
ともあれmisc.cの619行目の定義らしいので、その辺りを見てみる。
616 # if defined(linux) || defined(__convex__) || (BSD >= 199103)
617 setenv(var, value, 1);
618 # else
619 setenv(var, value);
620 # endif /* linux || convex || BSD >= 199103 */
617行目と619行目の違いに注目。
617行目はsetenv( var, value, 1 )と3つの引数が与えられているのに対し、619行目はsetenv( var, value )と2つの引数しか与えられていない。たぶん鍵は616行目にあって、プリプロセッサが、linuxと、BSDの場合はsetenv( var, value, 1 )が、それ以外の場合はsetenv( var, value )が使われるようだ。
で、Solarisの場合、
気になるもの。の
Solaris 10 の setenv(3C), unsetenv(3C)によると
そういえば、昔は setenv(3C), unsetenv(3C) は、Standard C Library Functions として用意されていなかった気がしたので、ちょっと確認。
Solaris 8, Solaris 9 には、提供されていない。
Solaris 10 からみたい。
Solaris 10 の new feature として、announce あったっけ・・・
適当な source を見つけられないなぁ(´・ω・`)
という事で、もともとSolaris9まではsetenv()自体が提供されていなかったようだ。
で、
setenv(3c)/unsetenv(3c) は UNIX2003 仕様準拠により、Solaris 10 から libc によりサポートされるようになりました。
という事らしい。
tjmiuraの日記にも
どっちかっつうと、misc.c
の619行目
setenv(var, value);
を編集しちゃうよりは、この部分をくくってる条件マクロの方を編集するべきではないかと。
diff -ur screen-4.0.3.org/misc.c screen-4.0.3/misc.c
--- screen-4.0.3.org/misc.c 2003-12-05 22:45:41.000000000 +0900
+++ screen-4.0.3/misc.c 2008-07-21 17:55:44.950202000 +0900
@@ -613,7 +613,7 @@
*/
# endif /* NEEDSETENV */
#else /* USESETENV */
-# if defined(linux) || defined(__convex__) || (BSD >= 199103)
+# if defined(linux) || defined(__convex__) || (BSD >= 199103) || defined(__sun__)
setenv(var, value, 1);
# else
setenv(var, value);
補足すると、Solarisにsetenv(3C)
が備わったのはSolaris10以降なので、SunOSバージョン識別は結局不要で、条件分岐としてはこれでよかった。
Solaris9以前ではputenv(3C)
が使われるのでこれまで問題にならなかったわけだ。
とある。
なので、、、件のmisc.cは
616 # if defined(linux) || defined(__convex__) || (BSD >= 199103) || defined(sun)
617 setenv(var, value, 1);
618 # else
619 setenv(var, value);
620 # endif /* linux || convex || BSD >= 199103 || sun */
こう書き換えるのが正しいようだ。
最終的にmisc.cを上記のように書き換えて、
$ LDFLAGS="-m64" CPPFLAGS="-m64 -O3" CFLAGS="-m64 -O3" ./configure --prefix=/usr/local --enable-pam --enable-locale --enable-colors256 --enable-rxvt_osc --enable-telnet --with-sys-screenrc=/etc
$ gmake
# sudo gmake install
でインストールができた。(※例によって64ビット・バイナリでインストールしている。32ビット・バイナリの場合はLDFLAGS、CPPFLAGS、CFLAGSの設定は不要)
Solaris10でSquidをソースからインストールする手順(まとめ)
※ 32ビット版