目次
RHLEを使ってみるいろいろあって、cygwinに続き RedHat? Linuxを使うことにした。もろもろ使えるようにしていく過程で躓いたw遍歴を。
RHEL6の Extra Package便利な時代になったのかな? RHEL6向けに epel-release-6-x.noarch.rpmがあるので、適当な所から探して、
すれば yumの reposに入るので、その後は適当にyumすればいい。
Fedora17大分違う。違いすぎる。
expect-5.43の make checkexpect-5.43/testsuiteの Makefile.inが 2.63のautoconfにはなくなっているoptionを呼んでて、make checkができん。下記はどうでもいいdiff103c103 < (cd $${srcdir}; autoconf --localdir=$${srcdir}/..) --- > (cd $${srcdir}; autoconf)
rdesktophttp://www.rdesktop.org?。特に書くこともない模様w
linux-ntfsLinuxでNTFSをmountしたいと言うことで、linux-NTFS projectのdrvを拾ってやることにした。二つの方法が提供されている。
@ITの解説にある手順でてきとーにやってみる。
と思ってやってみたら、爽やかに今の環境(RHEL-AS4u3)では爽やかにkernel再構築は不可避らしい。 $ yum install fuse fuse-libs Setting up Install Process Setting up repositories Reading repository metadata in from local files Parsing package install arguments Resolving Dependencies --> Populating transaction set with selected packages. Please wait. ---> Package fuse-libs.x86_64 0:2.7.4-8_10.el4 set to be updated ---> Package fuse.x86_64 0:2.7.4-8_10.el4 set to be updated --> Running transaction check --> Processing Dependency: fuse-kmdl-2.7.4-8_10.el4 for package: fuse --> Restarting Dependency Resolution with new changes. --> Populating transaction set with selected packages. Please wait. ---> Package fuse-kmdl-2.6.9-67.EL.x86_64 0:2.7.4-8_10.el4 set to be updated --> Running transaction check --> Processing Dependency: /boot/vmlinuz-2.6.9-67.EL for package: fuse-kmdl-2.6.9-67.EL Importing Additional filelist information for dependency resolution --> Finished Dependency Resolution Error: Missing Dependency: /boot/vmlinuz-2.6.9-67.EL is needed by package fuse-kmdl-2.6.9-67.EL 今日はできそうもないから、この調子だと来月だな orz
Windowを他所から飛ばすにはgdmsetupでセキュリティタブを見ると、デフォルトでは「常にTCP接続を禁止する(全てのリモート接続を無効にする)(X)にチェックが入ってる。これを外して再起動(=リログ)すれば、xhost +後に他所からwindowを飛ばせる前から使っていたが、そんな設定だったかーと改めてメモメモ。
libumem(3LIB)Solarisにある libumem(3LIB)を他OS向けにPortingしているProjectがあったので、つかってみた
WeirdX(Pure Java X Window System)WindowsでX Serverを使いたいのは順当な要求であり、普段はcygwin/Xを使っていたが、別のを使いたいと言うことで、WeirdXを使ってみた。特に設定しないで起動するだけで使えるのでいい感じ。注意点は以下の通り。
サンプルとして、sshモジュールを追加した起動用batファイルを載せとく。execの箇所は長すぎたので改行を入れてるため、読み手の変換必須ですw @echo off set ADDRESS="-Dweirdx.xdmcp.address=%TARGTIP%" set MBDOPT="-Dweirdx.display.charset=JISX" set KB="-Dweirdx.display.keymap=jp106" set SSHEXEC="-Dweirdx.sshrexec=yes" if "%JAVA_HOME%" == "" goto nohome_java if "%CLASSPATH%" == "" set CLASSPATH=%JAVA_HOME%\lib\classes.zip if "%WEIRDX_HOME%" == "" set WEIRDX_HOME=. "%JAVA_HOME%\bin\java" %MBDOPT% -classpath ".;%WEIRDX_HOME%\weirdx.jar;%SWING_HOME%; %SWING_HOME%\swingall.jar;.\jsch.jar;%CLASSPATH%" %KB% %SSHEXEC% com.jcraft.weirdx.WeirdX
使った様子のss
netstat -tcpと-tの謎Linuxのnetstatは-tと-tcpで動作が違い、-tの場合1回、-tcpの場合は1秒毎にぐるぐるになる。いつも忘れるのでメモ。。。shellの引数処理引数処理を書いたので、テンプレ用として転載。csh版配列idxに*を使わない版#!/bin/csh echo "argc = $#argv" set i = 1 set idx = () while ( $i <= $#argv ) set idx = ($idx $i) set i = `expr $i + 1 ` end foreach i ( $idx ) echo "argv[$i] = $argv[$i]" end配列idxに*を使う版 #!/bin/csh set i = 0 foreach j ( $argv[*] ) echo "argv[$i] = $j" set i = `expr $i + 1 ` endコマンドライン引数は argvと指定してもいいし、$1とかでもok sh版shiftにした版#!/bin/sh echo "argc = $#" i=1 while [ "$1" != "" ]; do echo "argv[$i] = $1" shift 1 i=`expr $i + 1` doneforにした版 #!/bin/sh echo "argc = $#" i=1 for v in $@ echo "argv[$i] = $v" i=`expr $i + 1` doneまぁ、どっちも大差ない予感。引数処理にはgetoptコマンドでもいいと思ってちょっと加筆修正したかった。なんとなくサンプルは以下の通り。もっと上手な書き方はいくらもあるだろう。 #!/bin/bash GETOPT=/usr/local/bin/getopt GETOPT_ARGS=-q OPTIONS="fhd:" BASENAME=`basename $0` SHOW_USAGE=0 FORCE_MODE=0 FILE_OPTION=0 FILE_PATH= function usage() { cat <<EOF Usage : $BASENAME [-f] [-h] [-d <file>] EOF } # parse args for OPT in `$GETOPT $GETOPT_ARGS $OPTIONS $@` do case $OPT in "-f") FORCE_MODE=1 ;; "-h") SHOW_USAGE=1 ;; "-d") FILE_OPTION=1 ;; "--") break ;; *) if [ $FILE_OPTION -eq 1 ]; then FILE_PATH=`echo $OPT | awk -F\' '{print $2}'` FILE_OPTION=0 fi ;; esac done # do /w options if [ $FORCE_MODE -eq 1 ]; then echo "-f" fi if [ -n $FILE_PATH ]; then echo "-d $FILE_PATH" fi if [ $SHOW_USAGE -ne 0 ]; then usage fi
Linux用FireFox?でjava-pluginを使えるようにする手順どっかに日本語ガイドがあった気がするが、どこだか忘れました。基本、mozillaの場合と 一緒でここのガイドの翻訳みたいなもんです。
上記ガイドにあるprefernces設定は無くても(って言うか、設定可能項目がGUI上は無い) firefox 2.0.0.7ではjava-pluginが有効になります。
いつも忘れる tcshrcの設定最近家でもLinux(Fedora7/Ubuntu)を使っているので、とりあえず初回に入れる設定をメモっておく。 まぁ、cdのaliasがsingle quoteなことをいつも忘れてはまるからこの項を書いたと言うのが真相wset autoexpand set autolist set color unset autologout set noautologout set prompt="`hostname`@`whoami`[\!] " set savehist=100 set history=100 setenv TERM dtterm setenv PAGER /usr/local/bin/lv setenv EDITOR /usr/local/bin/vim alias ls ls -F alias l ls alias ll ls -l alias cls clear alias src "source $HOME/.tcshrc" alias h history set pwd = `pwd` alias cd 'cd \!*; set pwd = `pwd`; echo $pwd'
isoイメージからinstall/pkgの追加RHEL-AS4だと1枚目のCDさえ焼いておけば(=bootさえすれば)、残りのCDは焼いてある必要は無い。 elilo boot: の所で linux askmethod と入力して anacondaを起動すると、installの途中で isoの在処を聞いて来るので、NFSの先を指定すれば自動的にisoイメージのファイルから必要な分を読み取る。 ファイル名決め打ちで見てるっぽいので、downloadしてからrenameはしない方向で。また /usr/bin/system-config-packagesも同様にisoを使うことが可能。 これはrootにsuして動くので /usr/bin/consolehelper を経由する。実体は /etc/security/console.apps/system-config-packagesに書いてある通り、/usr/sbin/system-config-packagesスクリプト。 pythonから /usr/share/system-config-packages/MainWindow?.pyが起動される。 で、--helpオプションをつけると Usage: system-config-packages [--help] [--tree=PATH] [--isodir=PATH]とでる。この --isodir=にrhelのisoイメージが置いてあるディレクトリを指定すると、(多分ファイル名決め打ちで)必要なisoイメージを自動で読み取る。なんかisoがNFSサーバにあるとうまく動かないかもw
SCSI汎用ドライバを使ってみる仕事でSCSI機器のコマンドに対する応答を調べる必要性ができたので、RHEL-AS4u3とAdaptecのSCSIカード、HP StorageWorks? Ultrium960 LTO-3/SCSIを道具にして 触りを書いてみた。Linuxと言わず、ほぼ全てのOSにuser landからSCSI機器と直接やり取りするためのドライバが 存在していて、これは一般的には pass throughドライバと呼ばれる。Linuxの場合は SCSI Genericドライバ、即ち sgドライバがこの用途のドライバである。 実装から結果まで諸々書くので別ページに。 service登録apacheとか使っていると当然のことながらbootに併せて起動して欲しいもんだが、 /etc/rc?.d/にいい加減なのを置くだけじゃだめぽで、chkconfigコマンドで登録する必要がある。雛形はこんな感じで、これを /etc/init.d/ 配下に apacheというファイル名で置いておく。 #!/bin/sh # # chkconfig: 345 77 7 # description: Apache2.2 in /usr/local/apache2 # BASEDIR=/usr/local/apache2 APACHECTRL=${BASEDIR}/bin/apachectl PIDFILE=${BASEDIR}/logs/httpd.pid export LANG=C function start() { echo "starting apache..." ${APACHECTRL} start } function stop() { echo "stopping apache..." ${APACHECTRL} stop } function restart() { echo "restarting apache..." stop checkpid start exit 0 } function status() { if [ -e ${PIDFILE} ]; then echo "apache PID is "`cat ${PIDFILE}` else echo "apache is stopped" fi } FLAG=0 function checkpid() { while [ ${FLAG} -eq 0 ]; do if [ -e ${PIDFILE} ]; then sleep 1 else FLAG=1 fi done } function usage() { echo "Usage: $0 {start|stop|restart}" exit 1 } if [ $# -eq 0 ]; then usage fi case "$1" in start|stop|status|restart) $1 ;; *) usage ;; esac上記スクリプトの最初数行のコメント部分は chkconfigが parseして、その記載を元に設定が --addの際に行われる。これは --level等他のoptionを指定しない場合のdefault値である。 これで、run level 3,4,5のときは稼動、その他は停止としてchkconfigコマンドで登録できる。 次の2個(77と7)は起動、停止時の優先順位となる。なお、/etc/init.dに置いておけばchkconfigコマンドの実行はどこでやってもいい。 # chkconfig --add apache linuxでnfsNFSサーバにするときは
[共有するディレクトリ] [公開先](書き込みの可否) 【凡例】/home/mage 192.168.0.0/255.255.255.0(ro)公開先はipやfqdn(*.oops.jpとか)が書ける。複数の公開先を書く場合のデリミタはspace(0x20)
# service nfs restart あとは # mount -F nfs -o ro,vers=2 <IP>:<path> <mount先>って感じで。
xim入力はデフォのiiimf+cannaだったのだが、で、3.3で見てみたら、コードアシストのkey bindはalt+/だったですYO。。。 IIIMFのdefault keybind(ctrl+space)の設定変更のために費やした1日をどうしろと。orz しかも www.i18n.orgにあった conversionOnKey設定はRHEL-AS4u4のbundule品では機能しなかったし ;;
日本語termmlterm でFA。。。とおもいましたが、LANG設定をするとIIIMFとの動作が怪しいので、 結局、gnome-terminalをつかうことに。これはよくできてました。w
im通常、Google Talk、Skype、Yahoo! Messangerを使っているので、Linuxでもと思ったが、 全部あきらめました。
KDEデフォ色々?あって、KDEが良かったので、ログイン時のシステムデフォルトをKDEにした。 公式にもある通り、/etc/sysconfig/desktop ファイルでGNOMEとなっているのを KDEに変えればok
w3m-0.5.1のコンパイルlibgc(garbage collectorのライブラリ)のビルドはver6.8でさくっと通ったが、 本体はconfigureがlong longのチェックで死んでた。理由は調べてないが、 workaroundは以下の通り。setenv LDFLAGS -Xlinker -R/usr/local/lib
Canna key strokeいろんな種類が覚えられないから、ひとつに統一するwrapperが必要だと思うが。。。
PTHREAD_MUTEXATTR(3)の日本語マニュアルバグvmwareを普段使いのLinux(RHEL AS4u3/2.6.9-34.ELsmp)にいれようと思ったが、石がXeon 5050(2core HT) なので、ちゃんと動いていい感じに機能するのかなと思い、テストコードを書いてみた。(後述)で、動かしてみると、1thrの場合は普通にspinしてるが、2thr以降だとやたらsysを食って 予想と異なる動きになっていた。mpstatはこんな感じ。(下記の実行結果は、mpstatをinterval 5秒で 実行し、10秒目に出力された結果のみとなっている。)
*thr数1 TIMED_NPの場合 17時24分36秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s 17時24分41秒 all 25.53 0.00 0.10 0.00 0.05 0.00 74.32 1092.42 17時24分41秒 0 0.20 0.00 0.00 0.00 0.00 0.00 99.80 19.67 17時24分41秒 1 102.25 0.00 0.00 0.00 0.20 0.00 0.00 47.95 17時24分41秒 2 1.02 0.00 0.20 0.00 0.00 0.00 98.77 0.00 17時24分41秒 3 0.00 0.00 0.00 0.00 0.00 0.00 102.46 1024.80 *thr数2 TIMED_NPの場合 17時25分57秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s 17時26分02秒 all 19.73 0.00 30.55 0.00 0.05 0.00 49.67 1099.80 17時26分02秒 0 24.54 0.00 36.40 0.00 0.00 0.00 39.06 11.45 17時26分02秒 1 12.47 0.00 19.63 0.00 0.20 0.00 68.51 44.17 17時26分02秒 2 15.75 0.00 23.52 0.00 0.00 0.00 60.53 21.47 17時26分02秒 3 26.18 0.00 43.15 0.00 0.00 0.00 31.29 1022.90 *thr数2 ADAPTIVE/FAST_NPの場合 17時26分35秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s 17時26分40秒 all 50.30 0.00 0.45 0.00 0.00 0.00 49.25 1076.86 17時26分40秒 0 11.07 0.00 0.20 0.00 0.00 0.00 88.73 10.66 17時26分40秒 1 82.09 0.00 0.60 0.00 0.00 0.00 17.71 39.84 17時26分40秒 2 89.34 0.00 0.40 0.00 0.00 0.00 10.26 20.12 17時26分40秒 3 19.32 0.00 0.40 0.00 0.00 0.00 80.68 1006.24 *thr数4 ADAPTIVE/FAST_NPの場合 17時27分05秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s 17時27分10秒 all 75.29 0.00 22.61 0.00 0.00 0.00 2.10 1074.30 17時27分10秒 0 74.30 0.00 23.29 0.00 0.00 0.00 2.41 26.71 17時27分10秒 1 75.30 0.00 22.69 0.00 0.00 0.00 2.21 43.37 17時27分10秒 2 76.31 0.00 22.49 0.00 0.00 0.00 1.61 1004.02 17時27分10秒 3 76.10 0.00 22.09 0.00 0.00 0.00 2.01 0.00 試しにSolaris9/E250(2cpu)で下記のコードを実行してみると 予想通りsysはそんなに食わず usr 90%以上で 1thrなら1個分、2cpu以上だと両方と言う感じ。 *thr数1 の場合 CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 0 0 105 402 300 19 9 4 0 0 7 80 0 0 20 1 0 0 7 118 112 46 5 5 0 0 27 20 2 0 78 *thr数2 の場合 PU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl 0 0 0 121 401 300 1777 14 7 218 0 1902 97 2 0 1 1 0 0 2 135 113 2071 20 7 352 0 1908 90 7 0 3 なんでこうなるのか分らないが、
と言うことにしておいて、終了。w
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <pthread.h> //#define dEBUG(x) x #define dEBUG(x) #define STOP_SPIN 0 #define DO_SPIN 1 static int spin_state = DO_SPIN; #ifdef __USE_PTHREAD_MUTEX_INITIALIZER static pthread_mutex_t state_mutex = PTHREAD_MUTEX_INITIALIZER; #else static pthread_mutex_t state_mutex; #endif typedef struct { int id; pthread_t tid; } spin_t; #define REPORT_MODE 100000 void *spin(void *a) { unsigned int i = 0; spin_t *args; args = (spin_t *)a; printf("invoked #%d\n", args->id); while ( get_spin_state() != STOP_SPIN ) { i++; if ( i % REPORT_MODE == 0 ) { dEBUG(printf("loop %d times at #%d\n", REPORT_MODE, args->id);) } } printf("end of #%d\n", args->id); return 0; } int set_spin_state(int i) { pthread_mutex_lock(&state_mutex); spin_state = i; pthread_mutex_unlock(&state_mutex); return 0; } int get_spin_state() { int ret = -1; pthread_mutex_lock(&state_mutex); ret = spin_state; pthread_mutex_unlock(&state_mutex); return ret; } static int __sihret; void *siginthandler(void *arg) { __sihret = 0; sigset_t set; int num = 0; printf("entered siginthandler\n"); sigemptyset(&set); sigaddset(&set, SIGINT); #ifdef __SOLARIS_BUILD sigwait(&set); #else sigwait(&set, &num); #endif set_spin_state(STOP_SPIN); printf("Caught SIGINT\n"); return &__sihret; } int block_sigint() { sigset_t set; sigemptyset(&set); sigaddset(&set, SIGINT); sigprocmask(SIG_BLOCK, &set, NULL); printf("blocked SIGINT\n"); return 0; } int main(int argc, char *argv[]) { pthread_t sihpid; spin_t *thrs; int thrslen, i, mutextype; pthread_mutexattr_t attr; int mattrtype = 0; // init pthread_mutexattr_init(&attr); #ifdef __USE_PTHREAD_MUTEX_INITILIZER // static/dynamic mutex setting block // do nothing #else #ifdef __USE_GNU // setting mattrtype block mattrtype = PTHREAD_MUTEX_FAST_NP; #elif __SOLARIS_BUILD mattrtype = PTHREAD_MUTEX_NORMAL; #else // linux default mattrtype = PTHREAD_MUTEX_ADAPTIVE_NP; #endif // end of setting mattrtype block pthread_mutexattr_settype(&attr, mattrtype); #endif // end of static/dynamic mutex setting block /* Note:(on RHEL AS4u3) of mutex pthread_mutexattr(3)のmanページ(日本語訳済)にあるmutex kindの 値 PTHREAD_MUTEX_FAST_NP は爽やかに存在しない。 [参考] linuxのJM http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_mutexattr_init.3.html これはlocaleがCの場合、opengroup.orgのmanページになる。このmanページでは 爽やかにpthread_mutexattr_[set|get]typeは別ページになっている。 以降、後述。 pthraed_mutexattr_gettype(P)のmanページ(日本語訳無し)にある mutex kindは PTHREAD_MUTEX_NORMAL PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_DEFAULT の4種。 [参考] opengroup.orgのMAN http://www.opengroup.org/onlinepubs/007908799/xsh/pthread_mutexattr_settype.html <pthraed.h>にある定義だと 83 enum 84 { 85 PTHREAD_MUTEX_TIMED_NP, 86 PTHREAD_MUTEX_RECURSIVE_NP, 87 PTHREAD_MUTEX_ERRORCHECK_NP, 88 PTHREAD_MUTEX_ADAPTIVE_NP 89 #ifdef __USE_UNIX98 90 , 91 PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP, 92 PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, 93 PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, 94 PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL 95 #endif 96 #ifdef __USE_GNU 97 / For compatibility. / <- この行だけコメント文だったのを変えた 98 , PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP 99 #endif 100 }; となっている。__USE_UNIX98はデフォルトでdefineされているが、 __USE_GNUはdefineされていないので、PTHREAD_MUTEX_FAST_NPを 使いたい場合、-D optionなりなんなりで、__USE_GNUを定義する 必要がある。 ちなみに順当だが、PTHREAD_MUTEX_INITIALIZERで初期化したmutexのtypeは 0(=PTHREAD_MUTEX_TIMED_NP)になっている。 */ pthread_mutexattr_gettype(&attr,&mutextype); printf("mutextype is %d\n", mutextype); pthread_mutex_init(&state_mutex, &attr); block_sigint(); pthread_create(&sihpid, NULL, siginthandler, NULL); if ( argc > 1 ) { thrslen = atoi(argv[1]); } else { thrslen = 0; } thrs = (spin_t *)malloc(sizeof(spin_t)*thrslen); // main for ( i = 0; i < thrslen; i++ ) { (thrs+i)->id = i; pthread_create(&((thrs+i)->tid), NULL, spin, thrs+i); } // end pthread_join(sihpid, NULL); for ( i = 0; i < thrslen; i++ ) { pthread_join((thrs+i)->tid, NULL); } printf("end of test\n"); return (0); } 上記のコードをコンパイルする際の -D optionは以下の通り。
linkerに渡すのはgccなら -lpthreadだけでok(Linux/Solaris両方) で、本節の本題はコードのコメント中に書いてあったりしる。w
bashでtrapとあるツールをcronを使わないで、1時間おきに動かしたいと思って、 bashのwrapper scriptを書いてみた。以下の理由
でちゃんと動いてるか疑問だったので、ちと調べてみた。 以下がテスト用スクリプト #!/bin/bash LOG=/home/witchcraft/work/test.20061206/log.txt function usr1 { echo "caught SIGUSR1" 2>&1 >>${LOG} } trap "usr1" USR1 # ログファイルのclearはこんな感じで動く。 # bashのシグナルハンドラは、sleep中はシグナル tableに入ったままで # 処理はしない。2個以上の同一シグナルが入った場合、上書き。 # シグナルはtableのbit 0/1であり無しをチェック出来るという感じ。 function trunc { echo > ${LOG} } trap "trunc" USR2 # こんな感じのを動かして、logoutするとok rm -f ${LOG} while [ 1 ] ; do date 2>&1 >>${LOG} sleep 10 done と言うことで、こんな感じで書いておいて、&実行+logoutで無問題らしい。
参考リンク
|