============================================================================== 1. NetWork 2. SKK 3. Command 4. Luna 5. FreeBSD 6. vi 7. muleからのメール送信でFromにLocal-host名が入ってしまう時、(EX. met2.meteora.co.jp) 8. Linux setup (network, sound) 9. Linux kernel 10. Linux boot 11. FreeBSD pkg_add 12. FreeBSD portからの install 13. 1秒以下のsleep 14. FTP のバッチ化 15. DirA/ と DirB/ を比べて、DirA に無く DirB に在るファイルを消す 16. FreeBSD 4.x上でw3m(0.4.1)の動作が遅いとき 17. FreeBSD 実行モジュールに必要なshared libraryの表示 18. CVS 19. dump.c 20. 日付け 付きfile-name 21. ASCII数字 -> 整数変換 (8,10,16進数対応) 22. プログラム内でのファイル検索 23. MAC address の取得 24. Linux: kernel内のtimer処理(タイムアウト処理など) 25. プロセスが使用しているportの一覧表示 26. ログインしている人とその人がやっていることの表示 29. core-dumpの取り方 30. あるディレクトリ以下の全ての "*.o" 削除する 31. Linux rpm 32. FreeBSD system update 33. mule 日本語環境(LANG=ja_JP.EUC)でディレクトリブラウザが正しく動作しないとき 34. FreeBSD 5.x 日本語マニュアル関連コマンド 35. c:__Pマクロは、sys/cdefs.h定義されている。 36. linux:シングルユーザーモードでブートする 37. Linux:カーネルソースへのデバイスドライバの組み込み方法 38. OpenSSLのdebugモードでの接続 39. 可変引数の関数の例 (ログ関数) 40. FreeBSD:カーネルプロセスのトレース 41. assert(式検証マクロ) 42. Linux:valgrind-3.1.0 43. FTP:binary-fileをascii-modeで転送したときの復活プログラム 44. byte オーダー変換 45. Jump table 46. NetBSD:ELFフォーマットのリンク 47. 時間測定 48. ssh:remote HOSTに loginで出来ない。 49. nm コマンド 50. Fatal error 'Spinlock called when not threaded.' at line 83 in file /usr/src/ 51. FreeBSDでACPIを無効にしAPMを有効にする方法 52. xorg.conf.new の自動生成 53. FreeBSD スワップ領域を増す 54. bin2hex 55. hex2bin 56. バークレー DB の引越しについて 57. x.orgのビルドおよびインストール 58. Caps_Lock,Control KEYの交換 59. Zaurus LS-B500メンテナンスメニューを表示する。 60. Zaurus LS-B500 の時刻合わせ 61. Linux(組み込み系)仮想端末デバイス 62. login shellの変更 ============================================================================== 1. NetWork tcpdump -lxi XX -s 1024 host XXXXXX and port XXX ~~ ~~~~~~ ~~~ デバイス host名 port No. EX. tcpdump -lxi ed0 -s 1024 host abc and port 23 ----------------------- Netwoekの混雑check: netstat -i (Callisをcheck(10%以下ならOK.)) ----------------------- Mac Addressの表示: arp -a ----------------------- MosaicのProxy越: http://met2.met:8080/=@=:XXXX.XXXXX.XXX ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ Proxy sever:port 目的Host URL. ============================================================================== 2. SKK 日本語入力切替: ^X^J ---> 英数字入力切替:l ひらがなカタカナ入力切替:q ============================================================================== 3. Command シンボルテーブル表示: nm プロファイル: -pgオプションを付けてコンパイル 結果の参照:gprof ディレクトリ全体の差分をとる: diff -cr OLD_DIR NEW_DIR > OutFileName ファイルサーチ&文字列検索 find PATH -name "FileName" -exec grep XXXX {} \; EX. find / -name "abc*" -exec grep ABC {} \; ============================================================================== 4. Luna LunaIIのNetworkデバイス:am0 MacAddr:luna.met (192.168.160.109) at 0:0:a:3:40:a9 ============================================================================== 5. FreeBSD Kernel update: chfags noschg /kernel install -c -m 555 -o root -g wheel -fschg kernel ============================================================================== 6. vi 文字列置換: command modeで g/XXXXXXXXX/s//YYYYYYYYY/g ~~~~~~~~~ ~~~~~~~~~ 元文字列 新文字列 ============================================================================== 7. muleからのメール送信でFromにLocal-host名が入ってしまう時、(EX. met2.meteora.co.jp) senmail.cf Dj$w.$m ----> Dj$m ・ [管理番号 1729] (最終更新 2000/12/07 02:34:00) Q. 2000.10.22 ごろ取得した FreeBSD 4.1.1-STABLE を使っていますが、 CF-3.7Wpl2 を使って作成した sendmail.cf ファイルを使うと、local な 宛先の mail について次のようなエラーが発生します。FreeBSD 付属の sendmail.cf ではうまくいくのですが。 Oct 27 19:19:31 host1 sendmail[12196]: e9RAJVC12196: from=user1, size=30, class=0, nrcpts=1, msgid=<200010 Oct 27 19:20:02 host1 mail.local: lockmailbox /var/mail/user2 failed; error code 75 Oct 27 19:20:02 host1 sendmail[12198]: e9RAJVC12196: to=user2, ctladdr=user1 (1000/1000), delay=00:00:31, A. /usr/libexec/mail.local コマンドの suid bit が設定されなくなったた めです。CURRENT への変更は 2000.10.10, RELENG_4 への変更は 2000.10.19 にされています。 このため、これら日付以降の 5-current, 4-stable を使用する場合に CF を使って sendmail.cf ファイルを作成する場合は、 LOCAL_MAILER_FLAG_ADD='S' を .def ファイルに追加して下さい。 または、 senmail.cf Mlocal, P=/usr/libexec/mail.local, F=lsDFMmrn, S=10, R=20/21, A=mail -d $u | V Mlocal, P=/usr/libexec/mail.local, F=lsDFMmrnS, S=10, R=20/21, A=mail -d $u ============================================================================== 8. Linux setup (network, sound) Network serviceの起動 /etc/xinetd.d/内の起動スクリプトの項目"disable"をnoにする ---> "disable = no" Networkカードの設定 /etc/sysconfig/network-scripts/ifcfg-eth0 例1;固定address DEVICE='eth0' BOOTPROTO='none' ONBOOT='yes' IPADDR=192.168.160.151 GATEWAY=192.168.160.2 TYPE=Ethernet USERCTL=no NETMASK=255.255.255.0 NETWORK=192.168.160.0 BROADCAST=192.168.160.255 例2;dhcp DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes Soundカードの設定 "sndconfig"を使用 ============================================================================== 9. Linux kernel %cd /usr/src/linux %meke oldconfig %make dep %make bzImage ----> /usr/src/linux/arch/i386/boot/bzImage -->/bootへcopy %make modules liloを使用しているときは、再起動の前に"lilo"を実行する。 ============================================================================== 10. Linux boot "/etc/lilo.conf"を変更したときは、再起動の前に"lilo"を実行する。 ============================================================================== 11. FreeBSD pkg_add 環境変数 "PKG_TMPDIR"をセットする。 Ex. (tcsh) setenv PKG_TMPDIR /var/tmp ============================================================================== 12. FreeBSD portからの install check_sumでerroeがでるときは、 make NO_CHECKSUM=yes ============================================================================== 13. 1秒以下のsleep #include void usleep(u_int microseconds) を使う。 ないときは、selectを使う 以下、参照 void usleep(long usec) { struct timeval tv; tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; select(0, NULL, NULL, NULL, &tv); } ============================================================================== 14. FTP のバッチ化 FTP や Telnet といった対話型プログラムを自動化したい場合は、 expect を使うとよい。expect は、スクリプトに従って、他の対話 型プログラムに "話しかける" プログラムであり、プログラムから 何を期待され、正しい応答が何であるべきかをスクリプトで記述す ることができる。シェルスクリプトとは違って、プログラムとユー ザの対話が必要なプログラムを実行するのに便利である。 以下は、とある Anonymous サイトから、ある特定のファイルを受信する例。 #!/usr/bin/expect set anonymous-ftp.site.hoge set email mymail-address@mydomain.hoge spawn ftp $site expect "*ame*:" { send "anonymous\n" } expect "assword:" { send "$email\n" } expect "*> " { send "cd pub/RFC\n" } expect "*> " { send "ascii\n" } expect "*> " { send "hash\n" } expect "*> " { send "get rfc-index.txt\n" } expect "*> " { send "quit\n" } send_user "script end\n" close exit 0 ============================================================================== 15. DirA/ と DirB/ を比べて、DirA に無く DirB に在るファイルを消す rdist を使えば可能。 例えば、distfile に次のようなエントリを作り、 backup: /home/myhome -> localhost install -oremove,quiet /mo/myhome; % rdist -f distfile backup としたり、 rdist -oremove -c /home/myhome localhost:/mo/myhome とすれば良い。 ============================================================================== 16. FreeBSD 4.x上でw3m(0.4.1)の動作が遅いとき 現象: w3mで"http://www.google.com/intl/ja/"に接続する際、応答が遅い 原因: DNSでAAAAクエリに対して無応答になりtimeoutが発生した後にAクエリを 発行するため。 対策: w3mをビルドする際、IPV6をサポートしない様にする。 ---> config.h 内の"#define INET6"をコメントアウトする。 ============================================================================== 17. FreeBSD 実行モジュールに必要なshared libraryの表示 ldd ============================================================================== 18. CVS ポジトリ作成 mkdir /home/seki/work/CVS/Mult 最初 cvs -d /home/seki/work/CVS/Mult init cd mtest3 cvs -d /home/seki/work/CVS/Mult import -m "new" mtest3 seki start cd .. mv mtest3 mtest3.org cvs -d /home/seki/work/CVS/Mult checkout mtest3 diff -rc mtest3 mtest3.org 違っていなければOK 以後、mtest3/で作業を行う mtest3.orgはbackupを取って削除する cd mtest3 vi ... .. cvs -d /home/seki/work/CVS/Mult commit setenv CVSROOT /home/seki/work/CVS/Multa を設定すると-dオプションを省略できる。 setenv CVSEDITOR "/usr/local/bin/mule -nw" で使用するeditorを選択できる。 以下のコメントを入れると /* * $Log: $ */ 以下の様になる。 /* * $Log: memo.txt,v $ * Revision 1.2 2005/01/13 05:44:28 seki * * てすと * */ 他に以下が使える $Revision:$ ... リビジョン $Date:$ ... 最終コミットの日付 $Id:$ ... ファイル名、リビジョン、日付、作者 プロジェクトに対するファイルの追加 % cvs add newfile.c % cvs commit newfile.c 特定のファイルの特定のバージョンを呼び出す file1.c だけバージョン 1.3 を呼び出すには % mv file1.c file1.c.bak % cvs update -p -r 1.3 file1.c > file1.c 特定のファイルの最新登録バージョンを呼び出す file1.c の最新登録バージョンを再度呼び出すには % mv file1.c file1.c.bak % cvs update -p file1.c > file1.c バイナリファイルの追加は、-kb オプションをつけてadd % cvs add -kb binary_file プロジェクトに対するファイルの削除 % cvs remove -f a.c ファイルの移動・名称変更 % mv OLD NEW % cvs remove OLD % cvs add NEW % cvs commit OLD NEW 編集中のファイルが最新のものかどうか確認。 % cvs status Status: Up-to-date と表示されたファイルは最新 ============================================================================== 19. dump.c #include /* Data dump */ int dump_h(unsigned char *buf, int p, int len) { int i=p; for (; i < len; ++i) { printf("%02x ", buf[i]); if ((i+1)%8 == 0) printf(" "); if ((i+1)%16 == 0) break; } if ((i+1)%16) { printf(" "); for(;i%16 != 0; ++i) {printf(" ");} } return(i); } int dump_a(unsigned char *buf, int p, int len) { int i=p; for (; i < len; ++i) { if (buf[i] >= ' ' && buf[i] <= 'z') printf("%1c", buf[i]); else printf("."); if ((i+1)%16 == 0) break; } printf("\n"); return(i); } void dump(unsigned char *buf, int len) { int i; printf("\n%d Bytes \n", len); for (i = 0; i < len; ++i) { dump_h(buf, i, len); i = dump_a(buf, i, len); } printf("\n"); } 例: #include int main(int argc, char **argv) { int i; char buf[128]; for (i = 0; i <125; ++i) { buf[i] = i; } dump(buf, i); } ============================================================================== 20. 日付け 付きfile-name #include #define PATH_SIZE 256 #define PREFIX_FNAME "Data" #define EXPANSION_FNAME "dat" char Mon[12][4] = {"Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec"}; void m_set(int m, char *mon) { strcpy(mon, Mon[m]); } char Wday[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; void w_set(int w, char *wday) { strcpy(wday, Wday[w]); } void make_file_name(char *fname) { #if 1 char mon[4], wday[4]; char name[PATH_SIZE]; struct tm *date; time_t ntime; ntime = time(0); date = localtime(&ntime); m_set(date->tm_mon, mon); w_set(date->tm_wday, wday); sprintf(name,"_%04d%s%02d_%02d%02d_%s.%s", date->tm_year+1900, mon, date->tm_mday, date->tm_hour, date->tm_min, wday, EXPANSION_FNAME); strncpy(fname, PREFIX_FNAME, PATH_SIZE-1 ); strncat(fname, name, (PATH_SIZE-strlen(PREFIX_FNAME)-1) ); #else sprintf(fname,"%s_%d.%s",PREFIX_FNAME, time(0) , EXPANSION_FNAME); #endif } ============================================================================== /* * yyyymmddhhnn(ASCII) ---> time_t(binary) */ time_t gettime(char *date) { char tmp[5]; struct tm mtime; memset((char *) &mtime, 0 sizeof(mtime)); strncpy(tmp, date, 4); /* year */ tmp[4] = NULL; mtime.tm_year = atoi(tmp); strncpy(tmp, date+4, 2); /* mon */ tmp[2] = NULL; mtime.tm_mon = atoi(tmp); strncpy(tmp, date+6, 2); /* day */ tmp[2] = NULL; mtime.tm_mday = atoi(tmp); strncpy(tmp, date+8, 2); /* hour */ tmp[2] = NULL; mtime.tm_hour = atoi(tmp); strncpy(tmp, date+10, 2); /* min */ tmp[2] = NULL; mtime.tm_min = atoi(tmp); return(mktime(mtime)); } ============================================================================== 21. ASCII数字 -> 整数変換 (8,10,16進数対応) Linux: /lib/vsprintf.cより baseが指定されていないときは、入力データより判断する。 0** : 8進 0x** :16進 以外 :10進 unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base) { unsigned long result = 0,value; if (!base) { base = 10; if (*cp == '0') { base = 8; cp++; if ((*cp == 'x') && isxdigit(cp[1])) { cp++; base = 16; } } } while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) ? toupper(*cp) : *cp)-'A'+10) < base) { result = result*base + value; cp++; } if (endp) *endp = (char *)cp; return result; } 例:10進変換 a = simple_strtoul(s, NULL, 10); ============================================================================== 22. プログラム内でのファイル検索 /* * glob test * * gcc -o f ftest.c */ #include #include #include #include int main(int argc, char *argv[]) { int ret,i; glob_t pglob; struct stat fs; glob(argv[1], GLOB_NOSORT|GLOB_MARK, NULL, &pglob); printf("Num:%d\n", pglob.gl_pathc); for (i = 0; i < pglob.gl_pathc; ++i) { ret = stat(pglob.gl_pathv[i], &fs); if (ret != 0) { printf(" stat error %s\n", pglob.gl_pathv[i]); break; } printf("%s .. %d bytes\n", pglob.gl_pathv[i], fs.st_size); } globfree(&pglob); } ============================================================================== 23. MAC address の取得 FreeBSD: int get_my_mac(char *dev_name, char *out) { struct ifaddrs *ifa, *ifa0; struct sockaddr_dl* dl; unsigned char mac_addr[6]; char tmp[12]; int i; out[0] = (char) NULL; if (getifaddrs(&ifa0) == 0) { for (ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next) { dl = (struct sockaddr_dl*)ifa->ifa_addr; if(strncmp(dev_name, dl->sdl_data, dl->sdl_nlen) == 0) { memcpy(mac_addr, LLADDR(dl), 6); break; } } if (ifa0 != NULL) freeifaddrs(ifa0); for (i = 0; i < 6; ++i) { sprintf(tmp,"%02x",mac_addr[i]); strcat(out, tmp); } fprintf(stderr,"hwaddr: %s: ",dev_name); fprintf(stderr,"--> My MAC:%s\n", out); } else { perror("getifaddrs:"); return(-1); } return(0); } Linux: /* * GET MAC address */ #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { int skfd; struct ifreq ifr; struct sockaddr_in recvSockAddr; struct ip_mreq mreq; union MA{ unsigned char data1[14]; unsigned long data2[4]; } ma; if (argc != 2) { printf("usage getmac \n dev_name:eth0 ....\n"); exit(1); } if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { printf("error: socket() .. %s\n", strerror(errno)); exit(1); } strcpy(ifr.ifr_name, argv[1]); if (ioctl(skfd, SIOCGIFHWADDR, &ifr)) { printf("ioctl SIOCGIFHWADDR: .. %s\n", strerror(errno)); close(skfd); exit(1); } printf("ifr_hwaddr: %s: ",ifr.ifr_name,); memcpy(ma.data1, ifr.ifr_hwaddr.sa_data, 14); for (i = 0; i < 2; ++i) { printf("%04x:", (unsigned long)ma.data2[i]); } printf("\n"); close(skfd); } ============================================================================== 24. Linux: kernel内のtimer処理(タイムアウト処理など) static struct timer_list watch_foo_timer; static struct fooData foo_data; #define WATCH_FOO_INTERVALE 5*60*HZ /* 5分*/ /* * jiffies:linuxが起動してからのtick数 * 1 tickの時間は /usr/include/asm/param.h のHZで定義されている。x86は,HZ=100 (1/100秒(10ms)) */ /* * foo処理 */ void foo_mesg(void) { printk("foo_mesg() .. foo !!\n"); } /* * foo error 処理 */ void foo_err_mesg(struct fooData *data;) { printk("foo_mesg() .. foo ERROR!!\n"); } /* * timeout処理ハンドラの削除 */ void del_foo(void) { del_timer(&watch_foo_timer); } /* * foo check timer更新 * foo監視時間更新 * * event fooより呼ばれる。 * */ static void watch_foo(void) { mod_timer(&watch_foo_timer, jiffies+WATCH_FOO_INTERVALE); /* foo 監視timer 更新 */ foo_mesg(); printk("watch_foo() .. foo timer update %d\n", jiffies+WATCH_FOO_INTERVALE); } /* * foo check timeout(timeout処理ハンドラ) * * foo異常処理 & foo監視時間更新 */ void watch_foo_timer_expire(unsigned long data) { struct fooData *foo_data; foo_data = (struct fooData *) data; mod_timer(&watch_foo_timer, jiffies+WATCH_FOO_INTERVALE); /* foo 監視timer 更新 */ foo_err_mesg(foo_data); printk("watch_foo_timer_expire() .. foo receive timeout\n"); } /* * foo check start * * foo 初期化処理より呼ばれる。 */ void watch_foo_star(void) { if (watch_foo_timer.function) return; /* start済み*/ watch_foo_timer.function = &watch_foo_timer_expire; /* timeout処理ハンドラ*/ watch_foo_timer.expires = jiffies+WATCH_FOO_INTERVALE; watch_foo_timer.data = &foo_data; /*callback関数の引数として渡される*/ add_timer(&watch_foo_timer); printk("watch_foo_start() .. foo watch start\n"); } /* * foo check init. * * system 初期化処理(Ex.af_inet.c:inet_init())などより、1度だけ呼ばれる。 */ void watch_foo_init(void) { watch_foo_timer.function = 0; watch_foo_timer.expires = 0; watch_foo_timer.data = 0; printk("watch_foo_init() .. foo watch init\n"); } ============================================================================== errnoよりmessageへの変換 #include printf("%s\n",strerror(errno)); #define Err(x) { fprintf( stderr, "abc - "); perror(x); } Ex. if ((fd = open(name, O_RDONLY)) < 0) { Err("open"); return(-1); } ============================================================================== 25. プロセスが使用しているportの一覧表示 lsofを使用する。 以下で入手可能 http://www.kozupon.com/security/lsof.html http://www.yumidon.com/sava/lsof/lsof1.html ftp://vic.cc.purdue.edu/pub/ ============================================================================== 26. ログインしている人とその人がやっていることの表示 wを使用する。 % w 3:22PM up 4 days, 17:44, 5 users, load averages: 0.02, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE WHAT seki v0 - 21Oct09 23days xinit seki p1 :0.0 21Oct09 21days -csh (tcsh) seki p2 :0.0 23Oct09 21days -csh (tcsh) seki p3 luna:0.0 3:07PM - w seki p4 luna:0.0 3:07PM 12 w3m -o cgi_bin=~/cgi-b ============================================================================== 29. core-dumpの取り方 (tcsh) % limit coredumpsize 確認 coredumpsize 0 kbytes %limit coredumpsize unlimited 設定 % limit coredumpsize 確認 coredumpsize unlimited (bach) ulimit 確認 ulimit -c unlimited 設定 ============================================================================== 30. あるディレクトリ以下の全ての "*.o" 削除する find . -name '*.o' -print -exec /bin/rm -f {} \; ^ あるディレクトリの指定 ============================================================================== 31. Linux rpm パッケージをインストール rpm -i hogehoge.rpm rpm -Uvvh で詳細が出る パッケージのアンインストール rpm -e hogehoge パッケージの確認 rpm -qpil hogehoge.rpm いくつかのファイルを消去してしまいしかも何を消去したのか不確かのとき 全システムに照合し何を失ったかを知りたいならば、 rpm -Va ファイルから それはどのパッケージのものであるかを見つけるためには、 rpm -qf /usr/X11R6/bin/xjewel ============================================================================== 32. FreeBSD system update cvsupでソースツリーの同期をとって、make&install&mergemasterが簡単でしょ う。私の場合、cvsupを毎日やって変更の量や場所のあたりをつけて、重要そ うなら更新、そうでなくても週に一度は更新という運用をしています。 ちなみに、/usr/src/Makefileによると正確な手順は次の通り。 # 1. `cd /usr/src' (or to the directory containing your source tree). # 2. `make buildworld' # 3. `make buildkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC). # 4. `make installkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC). # 5. `reboot' (in single user mode: boot -s from the loader prompt). # 6. `mergemaster -p' # 7. `make installworld' # 8. `mergemaster' # 9. `reboot' 慣れないとmergemasterが何をやっているのか分からない感じですが、基本は 自分がいじったファイルはmergeする、それ以外は新規をインストールするこ とです。 # pkg_add -r cvsup # sed 's/CHANGE_THIS.*$/$SOME.MIRROR.SITE/ s/tag=RELENG.*$/tag=RELENG_4_11/' \ /usr/share/exapmples/cvsup/stable-supfile > my_stable_supfile # cvsup -g my_stable_supfile # less /usr/src/UPDATING # cd /usr/src # make buildworld && make buildkernel KERNCONF=$CONFIGFILE \ && make installkernel KERNCONF=$CONFIGFILE # reboot # mergemaster -p # shutdown now # cd /usr/src # make installworld && reboot $で始まるところは適当に置換願います ============================================================================== 33. mule 日本語環境(LANG=ja_JP.EUC)でディレクトリブラウザが正しく動作しないとき .emecsに以下を追加する。 ;;dired (LANG= ja_JP.EUC) bug fix (add-hook 'dired-mode-hook '(lambda () (setenv "LANG" "C"))) ============================================================================== 34. FreeBSD 5.x 日本語マニュアル関連コマンド LC_CTYPEもしくは LANG を ja_JP.eucJP や ja_JP.SJIS に設定 しておくことが必要 ============================================================================== 35. c:__Pマクロは、sys/cdefs.h定義されている。 ============================================================================== 36. linux:シングルユーザーモードでブートする GRUBを使用している場合 1. GRUBパスワードが設定されている場合は、pと入力し、パスワードを入力 2. ブートしようとするカーネルのバージョンのRed Hat Linuxを選択し、 eを入力して編集を選択 選択したタイトルに対する設定ファイル内の項目の一覧が表示される。 3. kernelで始まる行を選択し、eと入力して行を編集 4. 行の末尾に移動し、1文字分のスペースを空けてsingleと入力(Spacebarキーを押し、 次にsingleと入力)。Enterキーを押して編集モードを終了。 5. GRUB画面に戻り、bと入力してシングルユーザーモードでブート。 LILOを使用している場合は、 LILOブートプロンプトで次のオプションのいずれかを指定 (グラフィカルLILOを使用している場合は、Ctrl-xキーを 押してグラフィカル画面を終了し、boot:プロンプトを表示する)。 boot: linux single boot: linux emergency ============================================================================== 37. Linux:カーネルソースへのデバイスドライバの組み込み方法 キャラクタデバイスドライバ(linux-char-driver.c)を作った場合。 このファイルを、/usr/local/src/linux/arch/ppc/8xx_io/にコピー (アーキテクチャに特化しないで使用できるような場合は、 /usr/local/src/linux/driversディレクトリの適当なディレクトリにコピー)。 /usr/local/src/linux/arch/ppc/8xx_io/Config.inファイルの先頭部分に bool文を追加(リスト2)。 (Config.inの文法は、/usr/local/src/linux/Documentation/language.txt参照) /usr/local/src/linux/arch/ppc/8xx_io/Makefileファイルを編集(リスト3) リスト2. Config.inの先頭部分 # # MPC8xx Communication options # mainmenu_option next_comment comment 'MPC8xx CPM Options' bool 'Include example driver' CONFIG_EXAMPLE_DRIVER if [ "$CONFIG_NET_ETHERNET" = "y" ]; then bool 'CPM SCC Ethernet' CONFIG_SCC_ENET if [ "$CONFIG_SCC_ENET" = "y" ]; then choice 'SCC used for Ethernet' \ "SCC1 CONFIG_SCC1_ENET \ SCC2 CONFIG_SCC2_ENET \ SCC3 CONFIG_SCC3_ENET" SCC1 fi bool '860T FEC Ethernet' CONFIG_FEC_ENET if [ "$CONFIG_FEC_ENET" = "y" ]; then bool 'Use MDIO for PHY configuration' CONFIG_USE_MDIO fi bool 'Use Big CPM Ethernet Buffers' CONFIG_ENET_BIG_BUFFERS fi リスト3. Makefile O_TARGET := 8xx_io.o obj-y := commproc.o uart.o obj-$(CONFIG_FEC_ENET) += fec.o obj-$(CONFIG_SCC_ENET) += enet.o obj-$(CONFIG_UCODE_PATCH) += micropatch.o obj-$(CONFIG_EXAMPLE_DRIVER) += linux-char-driver.o include $(TOPDIR)/Rules.make ============================================================================== 38. OpenSSLのdebugモードでの接続 $ openssl s_client -debug -connect www.hellowork.go.jp:443 CONNECTED(00000003) write to 100438D0 [10044220] (142 bytes => 142 (0x8E)) 0000 - 80 8c 01 03 01 00 63 00-00 00 20 00 00 39 00 00 ......c... ..9.. 0010 - 38 00 00 35 00 00 16 00-00 13 00 00 0a 07 00 c0 8..5............ 0020 - 00 00 33 00 00 32 00 00-2f 03 00 80 00 00 66 00 ..3..2../.....f. 0030 - 00 05 00 00 04 01 00 80-08 00 80 00 00 63 00 00 .............c.. 0040 - 62 00 00 61 00 00 15 00-00 12 00 00 09 06 00 40 b..a...........@ 0050 - 00 00 65 00 00 64 00 00-60 00 00 14 00 00 11 00 ..e..d..`....... 0060 - 00 08 00 00 06 04 00 80-00 00 03 02 00 80 ae e6 ................ 0070 - 27 b1 5e 25 b3 4a 4e 7f-3e 61 4a c2 cd b9 df b8 '.^%.JN.>aJ..... 0080 - c8 2b d4 48 4c a5 d6 3e-39 39 8f 78 f3 cf .+.HL..>99.x.. read from 100438D0 [10049780] (7 bytes => 7 (0x7)) 0000 - 84 80 04 00 01 00 02 ....... read from 100438D0 [10052A9F] (1147 bytes => 1147 (0x47B)) 0000 - 04 59 00 0c 00 10 30 82-04 55 30 82 03 c2 a0 03 .Y....0..U0..... (略) --- Ciphers common between both SSL endpoints: RC4-MD5 EXP-RC4-MD5 DES-CBC-MD5 DES-CBC3-MD5 --- SSL handshake has read 1256 bytes and written 269 bytes --- New, SSLv2, Cipher is DES-CBC3-MD5 Server public key is 512 bit SSL-Session: Protocol : SSLv2 Cipher : DES-CBC3-MD5 Session-ID: ................................... (略) ============================================================================== 39. 可変引数の関数の例 (ログ関数) #include #include #include #include #include static char dateformat[256] = "%b %e %T"; void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) { time_t t; struct tm tm; char date[256]; va_list ap; time(&t); localtime_r(&t, &tm); strftime(date, sizeof(date), dateformat, &tm); va_start(ap, fmt); fprintf(stderr, "%s [%d]: ", date, getpid()); vfprintf(stderr, fmt, ap); fflush(stderr); va_end(ap); fprintf(stderr, " --> %s:%d in %s()\n", file, line, function); } (log.h) extern void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf, 5, 6))); 使い方: #include "log.h" : ast_log(LOG_WARNING, "last_code:0x%x(%c), length:%d\n", last_code, last_code, ret); : ============================================================================== 40. FreeBSD:カーネルプロセスのトレース 名称 ktrace - カーネルプロセスのトレースを行う 書式 ktrace [-aCcdi] [-f trfile] [-g pgrp | -p pid] [-t trstr] ktrace [-adi] [-f trfile] [-t trstr] command 解説 ktrace ユーティリティは、指定したプロセスのカーネルのトレースログをとりま す。カーネルトレース情報はファイル ktrace.out に記録されます。トレースさ れるカーネル動作には、システムコール、namei 変換、シグナル処理、 I/O 処理 が含まれます。 いったんプロセスのトレースを行うようにすると、トレースデータはプロセスが 終了するか、トレースポイントがクリアされるまで記録され続けます。トレース したプロセスは膨大な量のログを急速に作るため、ユーザはプロセスのトレース を行う前にトレースを取り消す方法を覚えておくことを強くお勧めします。ユー ザが実行している全てのプロセスのトレース動作を取り消すには、以下のコマン ドで十分です。このコマンドが root 権限で実行された場合には、全てのプロセ スに対してトレースの取消しが行われます。 $ ktrace -C トレースファイルはそのままでは読めませんので、 kdump(1) を使って解析して ください。 ============================================================================== 41. assert(式検証マクロ) 名称 assert - 式検証マクロ 書式 #include assert(expression); 解説 assert() マクロは、指定された expression を試験し、偽の場合は、呼び出し元 プロセスは終了されます。診断メッセージが stderr に書き込まれ、関数 abort(3) が呼び出されてプログラムを効率的に終了します。 expression が真の場合、 assert() マクロは何もしません。 assert() マクロはコンパイル時に NDEBUG をマクロとして定義することで除去で きます (例えば cc(1) のオプション -DNDEBUG を使います)。 診断 expression が偽の場合、次の診断メッセージが stderr に書き込まれます。 "assertion \"%s\" failed: file \"%s\", line %d\n", \ "expression", __FILE__, __LINE__); ============================================================================== 42. Linux:valgrind-3.1.0 http://valgrind.org/ Valgrind is a GPL'd system for debugging and profiling Linux programs. With Valgrind's tool suite you can automatically detect many memory management and threading bugs, avoiding hours of frustrating bug-hunting, making your programs more stable. You can also perform detailed profiling to help speed up your programs. Ex. valgrind --leak-check=yes -v ./inbis_info_rcv -d ============================================================================== 43. FTP:binary-fileをascii-modeで転送したときの復活プログラム /*----------------------------------------------------- * FTPのfile転送のとき * binary-fileをascii-modeで転送して * 壊してしまったときの復活プログラム * * 0x0d,0x0a(,) -> 0x0aを外す * 元dataに0x0d,0x0aの並びがある場合はダメ *----------------------------------------------------- */ #include #include int main(int argc, char **argv) { int ifd; int ofd; unsigned char i_buf[256]; unsigned char o_buf[256]; int c,j,n; if (argc != 3) { printf("usage: cov_u in_file out_file\n"); exit(0); } if ((ifd = open(argv[1], O_RDONLY)) < 0) { perror("open :"); exit(1); } if ((ofd = open(argv[2], O_RDWR|O_CREAT, 0660)) < 0) { perror("open :"); exit(1); } for (;;) { n = read(ifd, i_buf, sizeof(i_buf)); if (n <= 0) break; for ( j = c = 0; c < n; ++c,++j) { o_buf[j] = i_buf[c]; if (i_buf[c] == 0x0d) { if (i_buf[c+1] == 0x0a) { ++c; } } } if (j > 0) { write(ofd, o_buf, j); } } close(ifd); close(ofd); } ============================================================================== 44. byte オーダー変換 unsigned long convert32(unsigned long *data) { unsigned long val; const unsigned char *b = (const unsigned char *)data; val = b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0]; return val; } unsigned short convert16(unsigned short *data) { unsigned short val; const unsigned char *b = (const unsigned char *)data; val = b[1]<<8 | b[0]; return val; } ============================================================================== 45. Jump table Jump table (1) #include struct j_list { int i; int c; void *(*func)(void *); }; void add_list(void *(*f)(), struct j_list *t) { t->i = 10; t->c = 0; t->func = f; } void *test1(void *in) { printf("called .. test1\n"); return(in); } int main(int argc, char **argv) { int i; struct j_list a; struct j_list *b; add_list(&test1, &a); for (i = 0, a.c = a.i; i <30; ++i, --a.c) { printf("-%d-\n", i); if (a.c <= 1) { b = (struct j_list *) a.func((void *) &a); printf(" a.i:%d\n", b->i); if ((b->i -= 3) <= 0) b->i = 10; a.c = b->i; } sleep(1); } } --------------------- Jump table (2) #include struct j_list { int i; int c; void *data; void (*func)(void *); }; /* callback func. */ struct para { struct j_list *d1; struct j_list **d2; }; void test1(void *data) { struct para *p = (struct para *) data; printf("test1\n"); *p->d2 = p->d1; } /*---*/ /*---*/ void add_list(void (*f)(), void *data, struct j_list *t) { t->i = 10; t->c = 0; t->data = data; t->func = f; } int main(int argc, char **argv) { int i; struct j_list a; struct j_list *b; struct para data; data.d1 = &a; data.d2 = &b; add_list(&test1, (void *) &data, &a); for (i = 0, a.c = a.i; i <30; ++i, --a.c) { printf("-%d-\n", i); if (a.c <= 1) { a.func(a.data); printf(" a.i:%d\n", b->i); if ((b->i -= 3) <= 0) b->i = 10; a.c = b->i; } sleep(1); } } ============================================================================== 46. NetBSD:ELFフォーマットのリンク /usr/lib以外のDIRにあるライブラリは、ldに -L/usr/local/lib -R/usr/local/lib の様にPATHを指定する。 ============================================================================== 47. 時間測定 #include #include #include double gettimeofday_sec() { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec + (double)tv.tv_usec*1e-6; } int main() { int i; int n = 0; double t1,t2; t1 = gettimeofday_sec(); for (i = 0; i < 100000; i++) n *= i; t2 = gettimeofday_sec(); printf("time = %10.30f\n", t2 - t1); t1 = gettimeofday_sec(); for (i = 0; i < 10000000; i++) n *= i; t2 = gettimeofday_sec(); printf("time = %10.30f\n", t2 - t1); } ============================================================================== 48. ssh:remote HOSTに loginで出来ない。 (1) ~/.ssh/known_hostsを削除する。 (2) 1でもダメな場合、 $ ssh -vvv localhost OpenSSH_3.9p1, OpenSSL 0.9.7e 25 Oct 2004 debug1: Reading configuration data /etc/ssh/ssh_config debug2: ssh_connect: needpriv 0 : : debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY debug3: check_host_in_hostfile: filename /home/nishide/.ssh/known_hosts2 debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts2 debug3: check_host_in_hostfile: filename /home/nishide/.ssh/known_hosts debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts debug3: check_host_in_hostfile: filename /home/nishide/.ssh/known_hosts debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts debug2: no key of type 0 for host localhost debug3: check_host_in_hostfile: filename /home/nishide/.ssh/known_hosts2 debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts2 debug3: check_host_in_hostfile: filename /home/nishide/.ssh/known_hosts debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts debug2: no key of type 2 for host localhost Host key verification failed. となる場合。 /dev/tty /dev/ptmx のパーミッションをチェックする。 正しい例: crw-rw-rw- 1 root wheel 3, 0 Jun 20 16:28 /dev/tty ============================================================================== 49. nm コマンド nm(1) コマンドは、指定されたライブラリ内に存在するシンボルのリストを 表示します。静的ライブラリ、共有ライブラリのどちらに対しても機能 します。 指定されたライブラリについて、nm(1) は、定義されているシンボルの名前、 それぞれのシンボルの値、シンボルのタイプ、を表示できます。また、その ライブラリ内に情報が存在するならば (-l オプションを参照してください)、 シンボルがソースコード内のどこで (ファイル名と行番号) 定義されているか ということも特定できます。 シンボルタイプについては、もう少し説明が必要です。小文字はそのシンボルが ローカルであることを意味し、大文字はそのシンボルがグローバル(外部定義)で あることを意味します。典型的なシンボルタイプは次のとおりです。 ・ T (コードセクション内の普通の定義) ・ D (初期化されたデータセクション) ・ B (初期化されないデータセクション) ・ U (未定義。シンボルはライブラリによって使われているが、ライブラリ内では 定義されていない) ・ W (weak. もしも他のライブラリも同じシンボルを定義している場合、 その定義によりオーバーライドされる) 関数の名前は覚えているけれども、それがどのライブラリで定義されているか 正確には思い出せない場合、nm の「-o」オプションを使い (コマンドラインでは ファイル名より前に置きます)、出力を grep することによって、ライブラリ名を 見つけ出すことができます。 Bourne シェルであれば、/lib, /usr/lib, /usr/lib 直下のサブディレクトリ、 および /usr/local/lib 内の全ライブラリを対象にして「cos」を検索するには、 次のようにします。 nm -o /lib/* /usr/lib/* /usr/lib/*/* \ /usr/local/lib/* 2> /dev/null | grep 'cos$' ============================================================================== 50. Fatal error 'Spinlock called when not threaded.' at line 83 in file /usr/src/ http://home.jp.freebsd.org/cgi-bin/showmail/FreeBSD-users-jp/81652 > エラーの要因は、どうも両方とも根が同じなのではないかと思えます。 > nss では以下のエラーが発生し、 > FreeBSD5.3_OPT.OBJ/shlibsign -v -i ../../../../dist/FreeBSD5.3_OPT.OBJ/lib/li > ftokn3.so.1 > Fatal error 'Spinlock called when not threaded.' at line 83 in file /usr/src/ > /libpthread/thread/thr_spinlock.c (errno = 0) > Abort trap (core dumped) > ja-openoffice では以下のエラーが起きます。 > (cd /usr/ports/japanese/openoffice-1.1/work/mozilla/work/mozilla/dist/bin; / > Fatal error 'Spinlock called when not threaded.' at line 83 in file /usr/src/ > Abort trap (core dumped) > > /usr/src/lib/libpthread/thread/thr_spinlock.c の該当個所は、 > if (!__isthreaded) > PANIC("Spinlock called when not threaded."); > となっていて、両方ともここで落ちているようです。 典型的な libc_r と libpthread(or libthr) の混在現象に見えま すね。どっかに古い, libc_r にリンクしたライブラリが存在して るのでしょう。とりあえず /etc/libmap.conf に下記設定入れて 逃げてください。 ibc_r.so.5 libpthread.so.1 ibc_r.so libpthread.so 個人的には微妙に破綻してなくもないかなぁ。。という感じがちら ほらと感じられるので, この際だから pkg_delete -a して入れ直 すのもいいかな。なんて思ったりもします:-)。 spinlock のキーワードを見たら疑え! :-) ============================================================================== 51. FreeBSDでACPIを無効にしAPMを有効にする方法 1)ACPIを強制的に無効にする  ・/boot/device.hints に hint.acpi.0.disabled="1" を記述 2)APMを有効にする  ・/boot/device.hints に hint.apm.0.disabled="0" を記述  ・/boot/loader.conf に apm_load="YES" を記述  ・/etc/rc.conf に apm_enable="YES" を記述 ============================================================================== 52. xorg.conf.new の自動生成 $ Xorg -configure xorg.conf.newを/etc/X11/xorg.confへcopy HAL等の必須daemonの起動 X.org 7.4から、キーボードおよびマウスを含む殆どのデバイスがHAL経由で制御される X.orgを正常に動作させるためには、dbusやPolicyKit等のdaemonも必要なので、 システム起動時にこれらのdaemonが動作するよう、「/etc/rc.conf」 に以下の記述を追加。 「/etc/rc.conf」への追記 dbus_enable="YES" hald_enable="YES" polkitd_enable="YES" ============================================================================== 53. FreeBSD スワップ領域を増す http://docs.freebsd.org/doc/4.7-RELEASE/usr/share/doc/ja/books/faq/admin.html これは 64MBの vn-swap を作る例です (ここでは /usr/swap0 としますが、 もちろん好きな名前を使うことができます)。 カーネルが次の行を含むコンフィグファイルから構成されているかを確認します。 GENERIC カーネルには、この行が含まれています。 pseudo-device vn 1 #Vnode driver (turns a file into a device) 1. vn デバイスを作ります # cd /dev # sh ./MAKEDEV vn0 2. スワップファイルを作ります (/usr/swap0) # dd if=/dev/zero of=/usr/swap0 bs=1024k count=64 3. スワップファイルに適切なパーミッションを設定します # chmod 0600 /usr/swap0 4. /etc/rc.conf でスワップファイルを有効化させます swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired. 5. マシンを再起動します スワップファイルをすぐに有効化させたいのなら以下のようにタイプします。 # vnconfig -e /dev/vn0b /usr/swap0 swap FreeBSD 5.x 以降 #dd if=/dev/zero of=/usr/swap0 bs=1024k count=300 #chmod 0600 /usr/swap0 #mdconfig -a -t vnode -f /usr/swap0 -u 3 #swapon /dev/md3 起動時の有効化 rc.confに以下を追加 swapfile="/usr/swap0" swapの削除 # swapoff /dev/md3 # mdconfig -d -u 3 # rm /usr/swap0 ============================================================================== 54 bin2hex /* * 4bit dataを16進 1文字に変換 */ char bin2hex_4bit(unsigned char bin) { unsigned char tmp; tmp = bin & 0x0f; if (tmp < 0x0a) { tmp |= 0x30; } else { unsigned char _c=0x61; _c += ((tmp & 0x07) - 0x02); tmp = _c; } return(tmp); } /* * 8bit dataを16進 2文字に変換 */ void bin2hex_8bit(unsigned char bin, char *hex) { unsigned char _tmp; _tmp = bin & 0xf0; _tmp >>= 4; hex[0] = bin2hex_4bit(_tmp); _tmp = bin & 0x0f; hex[1] = bin2hex_4bit(_tmp); hex[2] = NULL; } void bin2hex(unsigned char *bin, int bin_len, char *hex) { int i; int p=0; for(i=0; i #include #include int main(int argc, char **argv) { char buf[1024]; int i; time_t __time; __time = time(0); srandom((unsigned long) __time); for (i=0; i<100; ++i) { unsigned long _rand; _rand = random(); bin2hex((unsigned char *) &_rand, sizeof(unsigned long), buf); printf("rand:%s .. %x\n", buf, _rand); } } ============================================================================== 55. hex2bin /* * 16進 1文字から4bitに変換 */ unsigned char hex2bin_4bit(char hex) { unsigned char _bin; if ((hex >= '0') && (hex <= '9')) { _bin = hex - '0'; } else { if ((hex >= 'a') && (hex <= 'f')) { _bin = hex - 'a'; _bin += 0x0a; } else { _bin = 0xff; } } return(_bin); } /* * 16進 2文字から8bitに変換 * "a3" --> 0xa3 */ unsigned int hex2bin_8bit(char *hex) { unsigned int _tmp; unsigned int _bin=0xffff; if ((_bin = (unsigned int) hex2bin_4bit(hex[0])) != 0xff) { _bin <<= 4; if ((_tmp = (unsigned int) hex2bin_4bit(hex[1])) != 0xff) { _bin |= _tmp; } else { _bin = 0xffff; } } return(_bin); } /* *return:data長 */ int hex2bin(char *hex, unsigned char *bin) { unsigned int _bin; char _tmp[3]; int i; int p=0; int len=strlen(hex); for(i=0; i #include #include int main(int argc, char **argv) { char buf[1024]; unsigned char bin[1024]; int i; int ret; time_t __time; strcpy(buf, "1234567890abcdf0"); printf("%s -->\n", buf); ret = hex2bin(buf, bin); for (i=0; i\n", buf); ret = hex2bin(buf, bin); for (i=0; i\n", buf); ret = hex2bin(buf, bin); for (i=0; i xorg jp106 jp ctrl:nocaps 上記の通り、X.org 7.4からはキーボードの制御もHAL経由となっているため、 「/etc/X11/xorg.conf」を編集する従来の設定方法とは違う点に注意してください。 パフォーマンス向上の為の設定 X.orgについては、以下の設定を行うことにより、パフォーマンスを向上させることが出来ます。 「/etc/sysctl.conf」に以下の記述を追記してください。 「/etc/sysctl.conf」への追記 kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 ============================================================================== 58. Caps_Lock,Control KEYの交換 $ cat my_xmodmap remove Lock = Caps_Lock remove Control = Control_L keysym Control_L = Caps_Lock keysym Caps_Lock = Control_L add Lock = Caps_Lock add Control = Control_L $ xmodmap my_xmodmap ============================================================================== 59. Zaurus LS-B500メンテナンスメニューを表示する。 http://support.ezaurus.com/sl-b500/update/b500update/b500updatecard.asp 1. 全てのアプリケーションを終了し、電源を切ります。 2. ACアダプターを接続します。 3. 本体裏側の電池交換スイッチを「解除(交換時)」側に切り換え、 電池ぶたを取り外します。 4. 5秒待ってから、電池ぶたの中の「リセットボタン」を 付属のタッチペンで押します。 5. 電池ぶたを取り付け、電池交換スイッチを「ロック(使用時)」 側に切り換えます。 6. 充電ランプ(オレンジ色)が点灯していることを確認して、 [OK]キーを押しながら、[電源]キーを押します。 ========================================================================== 60. Zaurus LS-B500 の時刻合わせ * [ntpdate_ntp-4.1.1b-z-4_arm.ipk] をインストールする。 * [/etc/ppp/ip-up] に以下を追加。 if [ -e /usr/bin/ntpdate ] then /usr/bin/ntpdate NTPserver & fi ========================================================================== 61. Linux(組み込み系)仮想端末デバイス 現在e-gateway8000の仮想端末デバイスが2つしか無いためsshのセッションが 2つまでの様です。 ls -l /dev/pts crw--w--w- 1 root root 136, 0 Jul 6 19:15 0 crw--w--w- 1 root root 136, 1 Jul 6 19:15 1 そこで以下の様に仮想端末デバイス作成して見ました。 mknod /dev/pts/2 c 136 2 mknod /dev/pts/3 c 136 3 mknod /dev/pts/4 c 136 4 mknod /dev/pts/5 c 136 5 ls -l /dev/pts crw--w--w- 1 root root 136, 0 Jul 6 19:26 0 crw--w--w- 1 root root 136, 1 Jul 6 19:15 1 crw--w--w- 1 root root 136, 2 Jul 6 19:11 2 crw--w--w- 1 root root 136, 3 Jul 6 19:15 3 crw--w--w- 1 root root 136, 4 Jul 6 19:16 4 crw--w--w- 1 root root 136, 5 Jul 6 19:24 5 sshで仮想端末デバイスの数(7つ)までセッションを張る事が出来る 事を確認しました。 ========================================================================== 62. login shellの変更 login shellの変更は、使用するshellが /etc/shellsに登録されているか チェックする 例: cat /etc/shells /bin/sh /bin/bash /bin/ash /bin/csh ==========================================================================