﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-花之剑'HOME-文章分类-linux</title><link>http://www.blogjava.net/lantin/category/18495.html</link><description>一朵飘舞在风中的雪花，挣扎着，不想被融化。</description><language>zh-cn</language><lastBuildDate>Sat, 08 Mar 2008 14:17:21 GMT</lastBuildDate><pubDate>Sat, 08 Mar 2008 14:17:21 GMT</pubDate><ttl>60</ttl><item><title>linux多线程设计(转)</title><link>http://www.blogjava.net/lantin/articles/178027.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sun, 27 Jan 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/178027.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/178027.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/178027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/178027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/178027.html</trackback:ping><description><![CDATA[
		<div class="box2">
				<span class="Tit">
				</span> </div>
		<table class="htb wr" cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div class="box2 p14">#include &lt;pthread.h&gt;<br /><br />1、创建<br /><br />int pthread_create( pthread_t *tid, const pthread_attr_t *attr, void *(* func) (void *), void *arg );<br /><br />attr: 线程属性包括：优先级、初始栈大小，是否应该成为一个守护线程。<br /><br />缺省设置，NULL<br /><br />后面是线程要执行的函数和参数<br /><br />成功返回 0<br /><br />2、等待一个给定线程终止<br /><br />int pthread_join( pthread_t tid, void **status);<br /><br />statues返回等待线程的返回值<br /><br />3、得到自身的pid<br /><br />pthread_t pthread_self(void);<br /><br />4、pthread_detach函数<br /><br />int pthread_detach( pthread_t pid );<br /><br />把指定的线程转变为脱离状态<br /><br />一个线程或者是可汇合的（joinable，缺省值），或者是脱离的（detached）。当一个可汇合的线程终止时，它的线程ID和退出状态将留到另一个线程对它调用pthread_join。脱离线程却象守护进程：当它们终止的时，所有相关资源都被释放，我们不能等待它们终止。如果一个线程需要知道另一个线程什么时候终止，那就最好好吃第二个线程的可汇合状态。<br /><br />本函数通常由想让自己脱离的线程调用，如下语句<br /><br />pthread_detach( pthread_self() );<br /><br />5、终止一个线程<br /><br />void pthread_exit( void *statue );<br /><br />指针sttus不能指向局部于调用对象，因为线程终止时这样的对象也消失<br /><br />1．线程属性设置<br />我们用pthread_create函数创建一个线程，在这个线程中，我们使用默认参数，即将该函数的第二个参数设为NULL。的确，对大多数程序来说，使用默认属性就够了，但我们还是有必要来了解一下线程的有关属性。<br />属性结构为pthread_attr_t，它同样在头文件pthread.h中定义，属性值不能直接设置，须使用相关函数进行操作，初始化的函数为pthread_attr_init，这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、<br />堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级。<br /><br />1．绑定<br />关于线程的绑定，牵涉到另外一个概念：轻进程（LWP：Light Weight Process）。轻进程可以理解为内核线程，它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的，一个轻进程可以控制一个或多个线程。默认状况下，启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的，这种状况即称为非绑定的。绑定状况下，则顾名思义，即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度，这是因为CPU时间片的调度是面向轻进程的，绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。<br />　　设置线程绑定状态的函数为 pthread_attr_setscope，它有两个参数，第一个是指向属性结构的指针，第二个是绑定类型，它有两个取值： PTHREAD_SCOPE_SYSTEM（绑定的）和PTHREAD_SCOPE_PROCESS（非绑定的）。下面的代码即创建了一个绑定的线程。<br />＃i nclude &lt;pthread.h&gt;<br />pthread_attr_t attr;<br />pthread_t tid;<br />/*初始化属性值，均设为默认值*/<br />pthread_attr_init(&amp;attr); <br />pthread_attr_setscope(&amp;attr, PTHREAD_SCOPE_SYSTEM);<br />pthread_create(&amp;tid, &amp;attr, (void *) my_function, NULL);<br /><br />2．线程分离状态                                                                                                                                        线程的分离状态决定一个线程以什么样的方式来终止自己。非分离的线程终止时，其线程ID和退出状态将保留，直到另外一个线程调用pthread_join.分离的线程在当它终止时，所有的资源将释放，我们不能等待它终止。                                                                                        设置线程分离状态的函数为 pthread_attr_setdetachstate（pthread_attr_t *attr, int detachstate）。第二个参数可选为PTHREAD_CREATE_DETACHED（分离线程）和 PTHREAD _CREATE_JOINABLE（非分离线程）。这里要注意的一点是，如果设置一个线程为分离线程，而这个线程运行又非常快，它很可能在 pthread_create函数返回之前就终止了，它终止以后就可能将线程号和系统资源移交给其他的线程使用，这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施，最简单的方法之一是可以在被创建的线程里调用 pthread_cond_timewait函数，让这个线程等待一会儿，留出足够的时间让函数pthread_create返回。设置一段等待时间，是在多线程编程里常用的方法。<br />3．优先级                                                                                                                                                它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数 pthread_attr_setschedparam进行存放，一般说来，我们总是先取优先级，对取得的值修改后再存放回去。下面即是一段简单的例子。<br /><br />＃i nclude &lt;pthread.h&gt;<br />＃i nclude &lt;sched.h&gt;<br />pthread_attr_t attr; pthread_t tid;<br />sched_param param;<br />int newprio=20; <br />/*初始化属性*/<br />pthread_attr_init(&amp;attr); <br />/*设置优先级*/<br />pthread_attr_getschedparam(&amp;attr, &amp;param);  <br />param.sched_priority=newprio;<br />pthread_attr_setschedparam(&amp;attr, &amp;param);<br />pthread_create(&amp;tid, &amp;attr, (void *)myfunction, myarg);<br /><br />四．线程数据处理                                                                                                                                和进程相比，线程的最大优点之一是数据的共享性，各个进程共享父进程处沿袭的数据段，可以方便的获得、修改数据。但这也给多线程编程带来了许多问题。我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的，即同时不能运行一个函数的多个拷贝（除非使用不同的数据段）。在函数中声明的静态变量常常带来问题，函数的返回值也会有问题。因为如果返回的是函数内部静态声明的空间的地址，则在一个线程调用该函数得到地址后使用该地址指向的数据时，别的线程可能调用此函数并修改了这一段数据。在进程中共享的变量必须用关键字volatile来定义，这是为了防止编译器在优化时（如gcc中使用-OX参数）改变它们的使用方式。为了保护变量，我们必须使用信号量、互斥等方法来保证我们对变量的正确使用。<br />1．线程数据                                                                                                                                                在单线程的程序里，有两种基本的数据：全局变量和局部变量。但在多线程程序里，还有第三种数据类型：线程数据（TSD: Thread-Specific Data）。它和全局变量很象，在线程内部，各个函数可以象使用全局变量一样调用它，但它对线程外部的其它线程是不可见的。例如我们常见的变量errno，它返回标准的出错信息。它显然不能是一个局部变量，几乎每个函数都应该可以调用它；但它又不能是一个全局变量，否则在 A线程里输出的很可能是B线程的出错信息。要实现诸如此类的变量，我们就必须使用线程数据。我们为每个线程数据创建一个键，它和这个键相关联，在各个线程里，都使用这个键来指代线程数据，但在不同的线程里，这个键代表的数据是不同的，在同一个线程里，它代表同样的数据内容。<br />　　和线程数据相关的函数主要有4个：创建一个键；为一个键指定线程数据；从一个键读取线程数据；删除键。<br />　　创建键的函数原型为：<br />　　int pthread_key_create __P ((pthread_key_t *__key,void (*__destr_function) (void *)));                                                                                                                                                第一个参数为指向一个键值的指针，第二个参数指明了一个destructor函数，如果这个参数不为空，那么当每个线程结束时，系统将调用这个函数来释放绑定在这个键上的内存块。这个函数常和函数pthread_once ((pthread_once_t*once_control, void (*initroutine) (void)))一起使用，为了让这个键只被创建一次。函数pthread_once声明一个初始化函数，第一次调用pthread_once时它执行这个函数，以后的调用将被它忽略。<br />int pthread_key_delete(pthread_key_t *key);<br />该函数用于删除一个由pthread_key_create 函数调用创建的键。调用成功返回值为0，否则返回错误代码。<br />在下面的例子中，我们创建一个键，并将它和某个数据相关联。我们要定义一个函数 createWindow，这个函数定义一个图形窗口（数据类型为Fl_Window *，这是图形界面开发工具FLTK中的数据类型）。由于各个线程都会调用这个函数，所以我们使用线程数据。<br />/* 声明一个键*/<br />pthread_key_t myWinKey;<br />/* 函数 createWindow */<br />void createWindow ( void ) {<br />Fl_Window * win;<br />static pthread_once_t once= PTHREAD_ONCE_INIT;<br />/* 调用函数createMyKey，创建键*/<br />pthread_once ( &amp; once, createMyKey) ;<br />/*win指向一个新建立的窗口*/<br />win=new Fl_Window( 0, 0, 100, 100, "MyWindow");<br />/* 对此窗口作一些可能的设置工作，如大小、位置、名称等*/<br />setWindow(win);<br />/* 将窗口指针值绑定在键myWinKey上*/<br />pthread_setpecific ( myWinKey, win);<br />}<br />/* 函数 createMyKey，创建一个键，并指定了destructor */<br />void createMyKey ( void ) {<br />pthread_keycreate(&amp;myWinKey, freeWinKey);<br />}<br />/* 函数 freeWinKey，释放空间*/<br />void freeWinKey ( Fl_Window * win){<br />delete win;<br />}<br />这样，在不同的线程中调用函数createMyWin，都可以得到在线程内部均可见的窗口变量，这个变量通过函数 pthread_getspecific得到。在上面的例子中，我们已经使用了函数pthread_setspecific来将线程数据和一个键绑定在一起。这两个函数的原型如下：<br />　　<br />int pthread_setspecific __P ((pthread_key_t __key,__const void *__pointer)); 该函数设置一个线程专有数据的值，赋给由pthread_key_create 创建的键，调用成功返回值为0，否则返回错误代码。<br />void *pthread_getspecific __P ((pthread_key_t __key));                                                 该函数获得绑定到指定键上的值。调用成功，返回给定参数key 所对应的数据。如果没有数据连接到该键，则返回NULL。<br /><br />　　这两个函数的参数意义和使用方法是显而易见的。要注意的是，用pthread_setspecific为一个键指定新的线程数据时，必须自己释放原有的线程数据以回收空间。这个过程函数pthread_key_delete用来删除一个键，这个键占用的内存将被释放，但同样要注意的是，它只释放键占用的内存，并不释放该键关联的线程数据所占用的内存资源，而且它也不会触发函数pthread_key_create中定义的destructor函数。线程数据的释放必须在释放键之前完成。<br />2．互斥锁                                                                                                                                                假设各个现成向同一个文件顺序写入数据，最后得到的结果是不可想象的。所以用互斥锁来保证一段时间内只有一个线程在执行一段代码。<br /><br /><br /><br />使用int pthread_mutex_lock锁住互斥锁，使用int pthread_mutex_unlock解琐。<br />如果我们试图为一个已被其他线程锁住的互斥锁加锁，程序便会阻塞直到该互斥对象解锁。<br />如果在共享内存中分配一个互斥锁，我们必须在运行时调用ptgread_mutex_init函数尽心初始化。<br />void reader_function ( void );<br />void writer_function ( void ); <br />char buffer;<br />int buffer_has_item=0;<br />pthread_mutex_t mutex;<br />struct timespec delay;<br />void main ( void ){<br />pthread_t reader;<br />/* 定义延迟时间*/<br />delay.tv_sec = 2;<br />delay.tv_nec = 0;<br />/* 用默认属性初始化一个互斥锁对象*/<br />pthread_mutex_init (&amp;mutex,NULL);<br />pthread_create(&amp;reader, pthread_attr_default, (void *)&amp;reader_function), NULL);<br />writer_function( );<br />}<br />void writer_function (void){<br />while(1){<br />/* 锁定互斥锁*/<br />pthread_mutex_lock (&amp;mutex);<br />if (buffer_has_item==0){<br />buffer=make_new_item( );<br />buffer_has_item=1;<br />}<br />/* 打开互斥锁*/<br />pthread_mutex_unlock(&amp;mutex);<br />pthread_delay_np(&amp;delay);<br />}<br />}<br />void reader_function(void){<br />while(1){<br />pthread_mutex_lock(&amp;mutex);<br />if(buffer_has_item==1){<br />consume_item(buffer);<br />buffer_has_item=0;<br />}<br />pthread_mutex_unlock(&amp;mutex);<br />pthread_delay_np(&amp;delay);<br />}<br />}<br />函数 pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁，须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared，它有两个取值， PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步，后者用于同步本进程的不同线程。在上面的例子中，我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型，可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制，一般情况下，选用最后一个默认属性。<br />需要注意的是在使用互斥锁的过程中很有可能会出现死锁：两个线程试图同时占用两个资源，并按不同的次序锁定相应的互斥锁，例如两个线程都需要锁定互斥锁1和互斥锁2，a线程先锁定互斥锁1，b线程先锁定互斥锁2，这时就出现了死锁。此时我们可以使用函数 pthread_mutex_trylock，它是函数pthread_mutex_lock的非阻塞版本，当它发现死锁不可避免时，它会返回相应的信息，程序员可以针对死锁做出相应的处理。另外不同的互斥锁类型对死锁的处理不一样，但最主要的还是要程序员自己在程序设计注意这一点。<br />3．条件变量<br />互斥锁一个明显的缺点是它只有两种状态：锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足，它常和互斥锁一起使用。使用时，条件变量被用来阻塞一个线程，当条件不满足时，线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量，它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般说来，条件变量被用来进行线承间的同步。<br />条件变量的结构为pthread_cond_t，函数pthread_cond_init（）被用来初始化一个条件变量。它的原型为：<br /><br />int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));<br />          <br />其中cond是一个指向结构pthread_cond_t的指针，cond_attr是一个指向结构pthread_condattr_t的指针。结构 pthread_condattr_t是条件变量的属性结构，和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用，默认值是 PTHREAD_ PROCESS_PRIVATE，即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。<br />在pthread中，条件变量是一个pthread_cond_t类型的变量，条件变量使用下面两个函数：<br /><br /><br /></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/178027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-27 16:09 <a href="http://www.blogjava.net/lantin/articles/178027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言中tm结构体</title><link>http://www.blogjava.net/lantin/articles/177127.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Tue, 22 Jan 2008 12:15:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/177127.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/177127.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/177127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/177127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/177127.html</trackback:ping><description><![CDATA[
		<p>struct tm<br />{<br />  int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */<br />  int tm_min;                   /* Minutes.     [0-59] */<br />  int tm_hour;                  /* Hours.       [0-23] */<br />  int tm_mday;                  /* Day.         [1-31] */<br />  int tm_mon;                   /* Month.       [0-11] */<br />  int tm_year;                  /* Year - 1900.  */<br />  int tm_wday;                  /* Day of week. [0-6] */<br />  int tm_yday;                  /* Days in year.[0-365] */<br />  int tm_isdst;                 /* DST.         [-1/0/1]*/</p>
		<p>#ifdef  __USE_BSD<br />  long int tm_gmtoff;           /* Seconds east of UTC.  */<br />  __const char *tm_zone;        /* Timezone abbreviation.  */<br />#else<br />  long int __tm_gmtoff;         /* Seconds east of UTC.  */<br />  __const char *__tm_zone;      /* Timezone abbreviation.  */<br />#endif<br />};<br /><br />在C语言中 <br />有time_t tm timeval等几种类型的时间<br />1.time_t为typedef __int64 __time64_t; <br />2.struct timeval<br />{<br />      uint tv_sec;<br />      uint tv.usec;<br />}<br /><br /><br /><br />具体操作函数<br />包含文件:&lt;sys/time.h&gt; &lt;time.h&gt; <br /><br />tm *gmtime(time_t * t);<br />time_t time(time_t *t);<br />char *asctime(const struct tm *timeptr);<br />char *ctime(const time_t *timer); <br />把tm指针转换为time_t<br />time_t mktime(struct tm *timeptr);<br />localtime和gmtime的区别在于gmtime将时间转换为国际标准格式，也就是相对于1970 00:00:00开始的时间戳<br />而localtime是相对于本地的时区的格式。<br />#include&lt;stdio.h&gt;<br />#include&lt;time.h&gt;<br />#include&lt;sys/time.h&gt;<br />#include&lt;signal.h&gt;<br />#include&lt;pthread.h&gt;<br />void quit_t()<br />{<br />        printf("eixt now");<br />        exit(-1);<br />}<br />int main()<br />{<br />/*      struct timeval  vt;<br />        gettimeofday(&amp;vt , NULL);<br />        while(1)<br />        {<br />                printf("%u:%u\n",vt.tv_sec,vt.tv_usec);<br />                sleep(2);<br />                signal(SIGINT, quit_t);<br />        }<br />*/</p>
		<p>        struct tm *tt;<br />        time_t t = time(NULL);<br />        tt = gmtime(&amp;t);<br />        //char *s = asctime(tt);<br />        printf("%d-%d-%d %d:%d:%d",tt-&gt;tm_year+1900,tt-&gt;tm_mon+1,tt-&gt;tm_mday,tt-&gt;tm_hour,tt-&gt;tm_min,tt-&gt;tm_sec);<br />        return 0;<br />}<br /></p>
<img src ="http://www.blogjava.net/lantin/aggbug/177127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-22 20:15 <a href="http://www.blogjava.net/lantin/articles/177127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络地址结构解析</title><link>http://www.blogjava.net/lantin/articles/172961.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 05 Jan 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/172961.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/172961.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/172961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/172961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/172961.html</trackback:ping><description><![CDATA[
		<p>&lt;netinet/in.h&gt;<br />struct in_addr<br />{<br /> in_addr_t s_addr;</p>
		<p>}</p>
		<p>通用地址结构 用于网络连接 accept bind listen and so on~~~~</p>
		<p>
				<br />&lt;sys/socket.h&gt;<br />struct sockaddr<br />{<br /> unit8_t sa len;<br /> sa_family_t sa_family;<br /> char sa_data[14];<br />}</p>
		<p>int bind(sockfd, (struct sockaddr *), socklen_t);</p>
		<p> char *inet_ntoa(struct in_addr inaddr)  //将网络二进制转化为字符地址<br />in_addr_t inet_aton(char *addr)               //将字符串转化为网络二进制地址</p>
<img src ="http://www.blogjava.net/lantin/aggbug/172961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-05 14:12 <a href="http://www.blogjava.net/lantin/articles/172961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改linux默认的字符集</title><link>http://www.blogjava.net/lantin/articles/172939.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 05 Jan 2008 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/172939.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/172939.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/172939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/172939.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/172939.html</trackback:ping><description><![CDATA[
		<table width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<div align="center">
												<strong>
														<font color="#ff0000" size="5">修改linux默认的字符集</font>
												</strong>
										</div>
								</td>
						</tr>
						<tr>
								<td height="30">
										<div align="center">
												<font color="#cc6600">来源：   作者：eric</font>
										</div>
								</td>
						</tr>
						<tr>
								<td>
										<p>
										</p>
										<p>修改 /etc/sysconfig/i18n 文件，如<br />LANG="en_US.UTF-8"，xwindow会显示英文界面，<br />LANG="zh_CN.GB18030"，xwindow会显示中文界面。 <br />还有一种方法 cp /etc/sysconfig/i18n $HOME/.i18n <br />修改 $HOME/.i18n 文件，如<br />LANG="en_US.UTF-8"，xwindow会显示英文界面，<br />LANG="zh_CN.GB18030"，xwindow会显示中文界面。<br />这样就可以改变个人的界面语言，而不影响别的用户<br /><br />修改后的/etc/sysconfig/i18n 文件为：<br />LANG="en_US.UTF-8"<br />SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"<br />SYSFONT="latarcyrheb-sun16"<br />LC_ALL="en_US.UTF-8"<br />export LC_ALL<br /><br />设置完毕后重启或者用rc.local使生效</p>
										<p>
												<br />或修改登录用户的.bash_profile文件加入<br />export LANG=zh_CN.GB18030<br />export LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN<br /></p>
										<p>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/172939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2008-01-05 13:03 <a href="http://www.blogjava.net/lantin/articles/172939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 内核剖析[转]</title><link>http://www.blogjava.net/lantin/articles/133435.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 30 Jul 2007 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/133435.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/133435.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/133435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/133435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/133435.html</trackback:ping><description><![CDATA[<a href="http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn">http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn</a><br><img height=250 alt="" src="http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/figure2.jpg" width=370 border=0><br>linux结构
<img src ="http://www.blogjava.net/lantin/aggbug/133435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-07-30 21:26 <a href="http://www.blogjava.net/lantin/articles/133435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solaris 挂载磁盘</title><link>http://www.blogjava.net/lantin/articles/133010.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 28 Jul 2007 07:53:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/133010.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/133010.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/133010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/133010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/133010.html</trackback:ping><description><![CDATA[solaris 挂载和liunx有区别<br>linux挂载是mount&nbsp;[-option] &nbsp;/dev/hda1&nbsp;&nbsp; /mnt/<br>在solaris下，用mount -F pcfs /dev/dsk/cdt0p0:1&nbsp;&nbsp; /mnt<br>而且在要挂载的磁盘分区必须上fat格式的。soalris不支持ntfs格式。
<img src ="http://www.blogjava.net/lantin/aggbug/133010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-07-28 15:53 <a href="http://www.blogjava.net/lantin/articles/133010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 网络配置详解[转]</title><link>http://www.blogjava.net/lantin/articles/122899.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Fri, 08 Jun 2007 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/122899.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/122899.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/122899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/122899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/122899.html</trackback:ping><description><![CDATA[查看基本配置<br>ipconfig<br><br>cat /etc/resolv.conf <br><br><strong>.常用的网络命令</strong>
<p style="TEXT-INDENT: 2em">计算机网络的好处就在于资源和信息共享。Linux系统为大家提供了一组功能强大的网络命令使得用户可以方便地调试网络，查看网络状况和资源使用情况，以及远程登录和文件传输等工作。上面介绍了网络设备的安装及网络环境的设置，下面就向大家介绍一些常用的网络命令。
<p style="TEXT-INDENT: 2em">* ping
<p style="TEXT-INDENT: 2em">ping命令用来检查网络上某台主机是否处于活动状态，它利用TCP/IP协议簇中的ICMP协议的ECHO_REQUEST数据包强制性地要求网络上某台特定的主机作出响应，如果不能ping 通某台主机，证明主机和那台主机之间的网络存在故障。但ping 命令只是经过底层的几个协议，就算能ping 通，但只能说明该条线路正常连接，并不能保证其他高层的服务正常运行，但如果不能ping 通，则这两台主机根本不能进行任何通信。
<p style="TEXT-INDENT: 2em">* traceroute
<p style="TEXT-INDENT: 2em">traceroute命令也是用于检查网络是否能够正常通信，与ping不同的是，ping命令只能测试出从本机到目的host是否能够通信，而traceroute命令则能测试出从本机经过了哪些路由器或主机到达目的主机，如果不能到达，其故障具体是出在什么地方。所以我们常常在ping不通时用该命令在进一步查找原因所在。
<p style="TEXT-INDENT: 2em">*netstat
<p style="TEXT-INDENT: 2em">netstat命令用于显示网络状态信息，其用途很广泛，可以用来察看网络连接状态、接口配置、路由表等，并取得一些统计信息。该命令的主要参数和用途如下：
<p style="TEXT-INDENT: 2em">-a ：显示所有配置的接口
<p style="TEXT-INDENT: 2em">-i ：显示接口的统计信息
<p style="TEXT-INDENT: 2em">-n ：以数字的形式显示ip地址
<p style="TEXT-INDENT: 2em">-r ：显示内核的路由表
<p style="TEXT-INDENT: 2em">-s ：显示计数器的值
<p style="TEXT-INDENT: 2em">*ifconfig
<p style="TEXT-INDENT: 2em">前面已经讲到了，ifconfig命令用来查看网络接口的配置情况，也用于调试网络设备是否已经正确安装配置，或者用该命令来重新配置网络，只是用ifconfig命令配置的网络不是永久性的，系统一旦重新启动，先前用ifconfig配置的各种参数便不复存在。
<p style="TEXT-INDENT: 2em">*telnet
<p style="TEXT-INDENT: 2em">telnet命令用于远程登录，其命令格式为：telnet 主机名（或ip地址）。通过telnet命令登录远程计算机，就像登录到本机上执行操作一样。当然，要想远程登录到一台计算机上，必须知道该机合法的用户名和密码。要提醒大家的一点是，当用telnet命令登录并结束了远程会话后，一定要使用logout命令退出远程系统，以免造成意想不到的问题。
<p style="TEXT-INDENT: 2em">*rlogin
<p style="TEXT-INDENT: 2em">rlogin是remote login（远程登录的缩写），与telnet命令很相似，最常用的格式为：
<p style="TEXT-INDENT: 2em">rlogin host
<p style="TEXT-INDENT: 2em">rlogin命令还带有一些参数，常用的有：
<p style="TEXT-INDENT: 2em">-8 ：始终允许8位输入数据管道，允许发送格式化ANSI字符和其他特殊代码。
<p style="TEXT-INDENT: 2em">-E ：禁止把任何字符当成转义字符。当该参数与-8一起使用时，便提供一个完全的透明连接。
<p style="TEXT-INDENT: 2em">-L ：允许rlogin会话在litout模式下运行。
<p style="TEXT-INDENT: 2em">-x ：为所有通过rlogin会话交互的数据进行DES加密，从而提供安全性。
<p style="TEXT-INDENT: 2em">*ftp
<p style="TEXT-INDENT: 2em">ftp命令是标准的文件传输协议的用户接口，命令格式为：ftp 主机名或ip地址，用于在TCP/IP网络上进行文件传输。ftp命令可以用来传输ASCII文件和二进制文件。同样，要想实现ftp文件传输，你必须知道远程计算机上合法的用户名和口令，并且该用户名具有所要传输的文件的存取权限。
<p style="TEXT-INDENT: 2em">*rcp
<p style="TEXT-INDENT: 2em">rcp是remote file copy的缩写，即远程文件拷贝，用于在计算机之间拷贝文件，其命令格式有两种，分别用于文件到文件的拷贝和将文件或目录拷贝到另一个目录下，其一般格式为：
<p style="TEXT-INDENT: 2em">rcp [-px] [-k realm] file1 file2
<p style="TEXT-INDENT: 2em">rcp [-px] [-r] [-k realm] file
<p style="TEXT-INDENT: 2em">其中，-p 是保留原文件的修改时间和模式，忽略umask；-x 对所有数据实行DES加密，提高安全性；-k 是请求rcp获得在指定区域内的远程主机的Kerbero许可；-r 是以递归的方式把源目录中的所有文件或目录都拷贝到目的目录中</p>
/etc/conf.module <br>/etc/HOSTNAME <br>/etc/sysconfig/network-scripts/ifcfg-ethN <br>/etc/resolv.conf <br>/etc/host.conf <br>/etc/sysconfig/network <br>/etc/hosts&nbsp; <br>/etc/inetd.conf <br>/etc/hosts.allow <br>/etc/services <br>/etc/securetty&nbsp; <br>/etc/rc.d/rc.local&nbsp; <br><br><br><br>　　要建立一个安全Linux服务器就首先要了解Linux环境下和网络服务相关的配置文件的含义及如何进行安全的配置。在Linux系统中，TCP/IP网络是通过若干个文本文件进行配置的，也许你需要编辑这些文件来完成联网工作，但是这些配置文件大都可以通过配置命令linuxconf(其中网络部分的配置可以通过netconf命令来实现)命令来实现。下面介绍基本的&nbsp;TCP/IP网络配置文件。&nbsp; <br><br>*&nbsp;/etc/conf.modules&nbsp;文件&nbsp; <br>　　该配置文件定义了各种需要在启动时加载的模块的参数信息。这里主要着重讨论关于网卡的配置。在使用Linux做网关的情况下，Linux服务器至少需要配置两块网卡。为了减少启动时可能出现的问题，Linux内核不会自动检测多个网卡。对于没有将网卡的驱动编译到内核而是作为模块动态载入的系统若需要安装多块网卡，应该在&#8220;conf.modules&#8221;文件中进行相应的配置。&nbsp; <br><br>　　若设备驱动被编译为模块（内核的模块）：对于PCI设备，模块将自动检测到所有已经安装到系统上的设备；对于ISA卡，则需要向模块提供IO地址，以使模块知道在何处寻找该卡，这些信息在&#8220;/etc/conf.modules&#8221;中提供。&nbsp; <br><br>　　例如，我们有两块ISA总线的3c509卡，一个IO地址是0x300，另一个是0x320。编辑&#8220;conf.modules&#8221;文件如下：&nbsp;&nbsp; <br>　　alias&nbsp;eth0&nbsp;3c509&nbsp; <br>　　alias&nbsp;eth1&nbsp;3c509&nbsp; <br>　　options&nbsp;3c509&nbsp;io=0x300,0x320&nbsp; <br><br>　　这是说明3c509的驱动程序应当分别以eth0或eth1的名称被加载（alias&nbsp;eth0,eth1），并且它们应该以参数io=0x300,0x320被装载，来通知驱动程序到哪里去寻找网卡，其中0x是不可缺少的。&nbsp; <br><br>　　对于PCI卡，仅仅需要alias命令来使ethN和适当的驱动模块名关联，PCI卡的IO地址将会被自动的检测到。对于PCI卡，编辑&#8220;conf.modules&#8221;文件如下：&nbsp; <br><br>　　alias&nbsp;eth0&nbsp;3c905&nbsp; <br>　　　alias&nbsp;eth1&nbsp;3c905&nbsp; <br><br>　　若驱动已经被编译进了内核：系统启动时的PCI检测程序将会自动找到所有相关的网卡。ISA卡一般也能够被自动检测到，但是在某些情况下，ISA卡仍然需要做下面的配置工作：&nbsp; <br><br>　　在&#8220;/etc/lilo.conf&#8221;中增加配置信息，其方法是通过LILO程序将启动参数信息传递给内核。对于ISA卡，编辑&#8220;lilo.conf&#8221;文件，增加如下内容：&nbsp; <br><br>　　append="&nbsp;ether="0,0,eth0&nbsp;ether="0,0,eth1"&nbsp; <br><br>　　注：先不要在&#8220;lilo.conf&#8221;中加入启动参数，测试一下你的ISA卡，若失败再使用启动参数。&nbsp; <br><br>　　如果用传递启动参数的方法，eth0和eth1将按照启动时被发现的顺序来设置。&nbsp; <br><br><br>*&nbsp;/etc/HOSTNAME&nbsp;文件&nbsp; <br>　　该文件包含了系统的主机名称，包括完全的域名，如：deep.openarch.com。&nbsp; <br><br>*/etc/sysconfig/network-scripts/ifcfg-ethN&nbsp;文件&nbsp; <br>　　在RedHat中，系统网络设备的配置文件保存在&#8220;/etc/sysconfig/network-scripts&#8221;目录下，ifcfg-eth0包含第一块网卡的配置信息，ifcfg-eth1包含第二块网卡的配置信息。&nbsp; <br><br>　　下面是&#8220;/etc/sysconfig/network-scripts/ifcfg-eth0&#8221;文件的示例：&nbsp; <br><br>　　DEVICE=eth0&nbsp; <br><br>　　IPADDR=208.164.186.1&nbsp; <br><br>　　NETMASK=255.255.255.0&nbsp; <br><br>　　NETWORK=208.164.186.0&nbsp; <br><br>　　BROADCAST=208.164.186.255&nbsp; <br><br>　　ONBOOT=yes&nbsp; <br><br>　　BOOTPROTO=none&nbsp; <br><br>　　USERCTL=no&nbsp; <br><br>　　若希望手工修改网络地址或在新的接口上增加新的网络界面，可以通过修改对应的文件（ifcfg-ethN）或创建新的文件来实现。&nbsp; <br><br>　　DEVICE=name　　　　&nbsp;name表示物理设备的名字&nbsp; <br><br>　　IPADDR=addr　　　　&nbsp;addr表示赋给该卡的IP地址&nbsp; <br><br>　　NETMASK=mask　　　　mask表示网络掩码&nbsp; <br><br>　　NETWORK=addr　　　　addr表示网络地址&nbsp; <br><br>　　BROADCAST=addr　　&nbsp;addr表示广播地址&nbsp; <br><br>　　ONBOOT=yes/no　　&nbsp;启动时是否激活该卡&nbsp; <br><br>　　none：无须启动协议&nbsp; <br><br>　　bootp：使用bootp协议&nbsp; <br><br>　　dhcp：使用dhcp协议&nbsp; <br><br>　　USERCTL=yes/no　　　　　　&nbsp;是否允许非root用户控制该设备&nbsp; <br>*/etc/resolv.conf&nbsp;文件&nbsp;&nbsp; <br>　　该文件是由域名解析器（resolver，一个根据主机名解析IP地址的库）使用的配置文件，示例如下：&nbsp;&nbsp; <br><br>　　search&nbsp;openarch.com&nbsp;&nbsp; <br><br>　　nameserver&nbsp;208.164.186.1&nbsp;&nbsp; <br><br>　　nameserver&nbsp;208.164.186.2&nbsp;&nbsp; <br><br>　　&#8220;search&nbsp;domainname.com&#8221;表示当提供了一个不包括完全域名的主机名时，在该主机名后添加domainname.com的后缀；&#8220;nameserver&#8221;表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的。&nbsp;&nbsp; <br><br>*/etc/host.conf&nbsp;文件&nbsp;&nbsp; <br>　　该文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个&#8220;/etc/host.conf&#8221;的示例：&nbsp;&nbsp; <br><br>　　order&nbsp;bind,hosts&nbsp;&nbsp; <br><br>　　multi&nbsp;on&nbsp;&nbsp; <br><br>　　ospoof&nbsp;on&nbsp;&nbsp; <br><br>　　&#8220;order&nbsp;bind,hosts&#8221;指定主机名查询顺序，这里规定先使用DNS来解析域名，然后再查询&#8220;/etc/hosts&#8221;文件(也可以相反)。&nbsp;&nbsp; <br><br>　　&#8220;multi&nbsp;on&#8221;指定是否&#8220;/etc/hosts&#8221;文件中指定的主机可以有多个地址，拥有多个IP地址的主机一般称为多穴主机。&nbsp;&nbsp; <br><br>　　&#8220;nospoof&nbsp;on&#8221;指不允许对该服务器进行IP地址欺骗。IP欺骗是一种攻击系统安全的手段，通过把IP地址伪装成别的计算机，来取得其它计算机的信任。*/etc/sysconfig/network&nbsp;文件&nbsp;&nbsp; <br>　　该文件用来指定服务器上的网络配置信息，下面是一个示例：&nbsp;&nbsp; <br><br>　　NETWORK=yes&nbsp;&nbsp; <br><br>　　RORWARD_IPV4=yes&nbsp;&nbsp; <br><br>　　HOSTNAME=deep.openarch.com&nbsp;&nbsp; <br><br>　　GAREWAY=0.0.0.0&nbsp;&nbsp; <br><br>　　GATEWAYDEV=&nbsp;&nbsp; <br><br>　　NETWORK=yes/no　　　　&nbsp;网络是否被配置；&nbsp;&nbsp; <br><br>　　FORWARD_IPV4=yes/no　　　　是否开启IP转发功能&nbsp;&nbsp; <br><br>　　HOSTNAME=hostname&nbsp;hostname表示服务器的主机名&nbsp;&nbsp; <br><br>　　GAREWAY=gw-ip　　　　&nbsp;gw-ip表示网络网关的IP地址&nbsp;&nbsp; <br><br>　　GAREWAYDEV=gw-dev　　&nbsp;gw-dw表示网关的设备名，如：etho等&nbsp;&nbsp; <br><br>　　注意：为了和老的软件相兼容，&#8220;/etc/HOSTNAME&#8221;文件应该用和HOSTNAME=hostname相同的主机名。&nbsp;&nbsp; <br><br>*/etc/hosts&nbsp;文件&nbsp;&nbsp; <br>　　当机器启动时，在可以查询DNS以前，机器需要查询一些主机名到IP地址的匹配。这些匹配信息存放在/etc/hosts文件中。在没有域名服务器情况下，系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址。&nbsp;&nbsp; <br><br>　　下面是一个&#8220;/etc/hosts&#8221;文件的示例：&nbsp;&nbsp; <br><br>　　IP&nbsp;Address　　　　&nbsp;Hostname　　　　　　　　　　&nbsp;Alias&nbsp;&nbsp; <br><br>　　127.0.0.1　　　　　　Localhost　　　　　　　　　　Gate.openarch.com&nbsp;&nbsp; <br><br>　　208.164.186.1　　　　gate.openarch.com&nbsp;Gate&nbsp;&nbsp; <br><br>　　&#8230;&#8230;&#8230;&#8230;　　　　　　&nbsp;&#8230;&#8230;&#8230;&#8230;　　　　　　　　　　&nbsp;&#8230;&#8230;&#8230;&nbsp;&nbsp; <br><br>　　最左边一列是主机IP信息，中间一列是主机名。任何后面的列都是该主机的别名。一旦配置完机器的网络配置文件，应该重新启动网络以使修改生效。使用下面的命令来重新启动网络：/etc/rc.d/init.d/network&nbsp;restart&nbsp;&nbsp; <br><br>*&nbsp;/etc/inetd.conf&nbsp;文件&nbsp;&nbsp; <br>　　众所周知，作为服务器来说，服务端口开放越多，系统安全稳定性越难以保证。所以提供特定服务的服务器应该尽可能开放提供服务必不可少的端口，而将与服务器服务无关的服务关闭，比如：一台作为www和ftp服务器的机器，应该只开放80&nbsp;和25端口，而将其他无关的服务如：finger&nbsp;auth等服务关掉，以减少系统漏洞。&nbsp;&nbsp; <br><br>　　而inetd，也叫作&#8220;超级服务器&#8221;，就是监视一些网络请求的守护进程，其根据网络请求来调用相应的服务进程来处理连接请求。inetd.conf则是inetd的配置文件。inetd.conf文件告诉inetd监听哪些网络端口，为每个端口启动哪个服务。在任何的网络环境中使用Linux系统，第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉，最好卸载掉，这样黑客就少了一些攻击系统的机会。查看&#8220;/etc/inetd.conf&#8221;文件，了解一下inetd提供哪些服务。用加上注释的方法（在一行的开头加上#号），禁止任何不需要的服务，再给inetd进程发一个SIGHUP信号。&nbsp;&nbsp; <br><br>　　第一步：把文件的许可权限改成600。&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;chmod&nbsp;600&nbsp;/etc/inetd.conf&nbsp;&nbsp; <br><br>　　第二步：确信文件的所有者是root。&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;stat&nbsp;/etc/inetd.conf&nbsp;&nbsp; <br><br>　　第三步：编辑&#8220;inetd.conf&#8221;文件（vi&nbsp;/etc/inetd.conf），禁止所有不需要的服务，如：ftp、&nbsp;telnet、&nbsp;shell、&nbsp;login、&nbsp;exec、talk、ntalk、&nbsp;imap、&nbsp;pop-2、pop-3、finger、auth，等等。如果你觉得某些服务有用，可以不禁止这些服务。但是，把这些服务禁止掉，系统受攻击的可能性就会小很多。改变后的&#8220;inetd.conf&#8221;文件的内容如下面所示：inetd.conf&nbsp; <br><br>　　第四步：&nbsp;&nbsp; <br><br>　　为了保证&#8220;inetd.conf&#8221;文件的安全，可以用chattr命令把它设成不可改变。把文件设成不可改变的只要用下面的命令：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/inetd.conf&nbsp;&nbsp; <br><br>　　这样可以避免&#8220;inetd.conf&#8221;文件的任何改变（意外或是别的原因）。一个有&#8220;i&#8221;属性的文件是不能被改动的：不能删除或重命名，不能创建这个文件的链接，不能往这个文件里写数据。只有系统管理员才能设置和清除这个属性。如果要改变inetd.conf文件，你必须先清除这个不允许改变的标志：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;chattr&nbsp;-i&nbsp;/etc/inetd.conf&nbsp;&nbsp; <br><br>　　但是对于诸如sendmail，named，www等服务，由于它们不象finger，telnet等服务，在请求到来时由inet守护进程启动相应的进程提供服务，而是在系统启动时，作为守护进程运行的。而对于redhat&nbsp;linux，提供了一个linuxconfig命令，可以通过它在图形界面下交互式地设置是否在启动时运行相关服务。也可以通过命令来设置是否启动时启动某个服务，如：[root@deep]#&nbsp;chkconfig&nbsp;&#8211;level&nbsp;35&nbsp;named&nbsp;off&nbsp;&nbsp; <br>但是对于telnet、ftp等服务，如果将其一同关闭，那么对于管理员需要远程管理时，将非常不方便。Linux提供另外一种更为灵活和有效的方法来实现对服务请求用户的限制，从而可以在保证安全性的基础上，使可信任用户使用各种服务。Linux提供了一个叫TCP&nbsp;wrapper的程序。在大多数发布版本中该程序往往是缺省地被安装。利用TCP&nbsp;wrapper你可以限制访问前面提到的某些服务。而且TCP&nbsp;wrapper的记录文件记录了所有的企图访问你的系统的行为。通过last命令查看该程序的log，管理员可以获知谁曾经或者企图连接你的系统。&nbsp;&nbsp; <br><br>　　在/etc目录下，有两个文件：hosts.deny&nbsp;hosts.allow&nbsp;通过配置这两个文件，你可以指定哪些机器可以使用这些服务，哪些不可以使用这些服务。&nbsp;&nbsp; <br><br>　　当服务请求到达服务器时，TCP&nbsp;wrapper就按照下列顺序查询这两个文件，直到遇到一个匹配为止：&nbsp;&nbsp; <br><br>　　1.当在/etc/hosts.allow里面有一项与请求服务的主机地址项匹配，那么就允许该主机获取该服务&nbsp;&nbsp; <br><br>　　2.否则，如果在/etc/hosts.deny里面有一项与请求服务的主机地址项匹配，就禁止该主机使用该项服务。&nbsp;&nbsp; <br><br>　　3.如果相应的配置文件不存在，访问控制软件就认为是一个空文件，所以可以通过删除或者移走配置文件实现对清除所有设置。在文件中，空白行或者以#开头的行被忽略，你可以通过在行前加&nbsp;#&nbsp;实现注释功能。&nbsp;&nbsp; <br><br>　　配置这两个文件是通过一种简单的访问控制语言来实现的，访问控制语句的基本格式为：&nbsp;&nbsp; <br><br>　　程序名列表:主机名/IP地址列表。&nbsp;&nbsp; <br><br>　　程序名列表指定一个或者多个提供相应服务的程序的名字，名字之间用逗号或者空格分割，可以在inetd.conf文件里查看提供相应服务的程序名：如上面的文件示例中，telent所在行的最后一项就是所需的程序名：in.telnetd。&nbsp;&nbsp; <br><br>　　主机名/IP地址列表指定允许或者禁止使用该服务的一个或者多个主机的标识，主机名之间用逗号或空格分隔。程序名和主机地址都可以使用通配符，实现方便的指定多项服务和多个主机。&nbsp;&nbsp; <br><br>　　Linux提供了下面灵活的方式指定进程或者主机列表:&nbsp;&nbsp; <br><br>　　1.一个以"."起始的域名串，如&nbsp;.amms.ac.cn&nbsp;那么www.amms.ac.cn就和这一项匹配&nbsp;&nbsp; <br><br>　　2.以"."结尾的IP串如&nbsp;202.37.152.&nbsp;那么IP地址包括202.37.152.&nbsp;的主机都与这一项匹配。&nbsp;&nbsp; <br><br>　　3.格式为n.n.n.n/m.m.m.m表示网络/掩码，如果请求服务的主机的IP地址与掩码的位与的结果等于n.n.n.n&nbsp;那么该主机与该项匹配。&nbsp;&nbsp; <br><br>　　4.ALL表示匹配所有可能性&nbsp;&nbsp; <br><br>　　5.EXPECT表示除去后面所定义的主机。如:list_1&nbsp;EXCEPT&nbsp;list_2&nbsp;表示list_1主机列表中除去List_2所列出的主机&nbsp;&nbsp; <br><br>　　6.LOCAL表示匹配所有主机名中不包含"."的主机&nbsp;&nbsp; <br><br>　　上面的几种方式只是Linux提供的方式中的几种，但是对于我们的一般应用来说是足够了。我们通过举几个例子来说明这个问题：&nbsp;&nbsp; <br><br>　　例一：我们只希望允许同一个局域网的机器使用服务器的ftp功能，而禁止广域网上面的ftp服务请求，本地局域网由&nbsp;202.39.154.、202.39.153.和202.39.152.&nbsp;三个网段组成。&nbsp;&nbsp; <br><br>　　在hosts.deny文件中，我们定义禁止所有机器请求所有服务：&nbsp;&nbsp; <br><br>　　ALL:ALL&nbsp;&nbsp; <br><br>　　在hosts.allow文件中，我们定义只允许局域网访问ftp功能：&nbsp;&nbsp; <br><br>　　in.ftpd&nbsp;-l&nbsp;&#8211;a:&nbsp;202.39.154&nbsp;202.39.153.&nbsp;202.39.152.&nbsp;&nbsp; <br><br>　　这样，当非局域网的机器请求ftp服务时，就会被拒绝。而局域网的机器可以使用ftp服务。此外，应该定期检查/var/log目录下的纪录文件，发现对系统安全有威胁的登录事件。last命令可以有效的查看系统登录事件，发现问题所在。&nbsp;&nbsp; <br><br>　　最后tcpdchk是检查TCP_WAPPERS配置的程序。它检查TCP_WAPPERS的配置，并报告它可以发现的问题或潜在的问题。在所有的配置都完成了之后，请运行tcpdchk程序：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;tcpdchk&nbsp;&nbsp; <br><br>*&nbsp;/etc/services&nbsp;文件&nbsp;&nbsp; <br>　　端口号和标准服务之间的对应关系在RFC&nbsp;1700&nbsp;&#8220;Assigned&nbsp;Numbers&#8221;中有详细的定义。&#8220;/etc/services&#8221;文件使得服务器和客户端的程序能够把服务的名字转成端口号，这张表在每一台主机上都存在，其文件名是&#8220;/etc/services&#8221;。只有&#8220;root&#8221;用户才有权限修改这个文件，而且在通常情况下这个文件是没有必要修改的，因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性，我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/services&nbsp;&nbsp; <br><br>*&nbsp;/etc/securetty&nbsp;文件&nbsp;&nbsp; <br>　　&#8220;/etc/securetty&#8221;文件允许你规定&#8220;root&#8221;用户可以从那个TTY设备登录。登录程序（通常是&#8220;/bin/login&#8221;）需要读取&#8220;/etc/securetty&#8221;文件。它的格式是：列出来的tty设备都是允许登录的，注释掉或是在这个文件中不存在的都是不允许root登录的。&nbsp;&nbsp; <br><br>　　注释掉（在这一行的开头加上＃号）所有你想不让root登录的tty设备。&nbsp;&nbsp; <br><br>　　编辑securetty文件（vi&nbsp;/etc/securetty）象下面一样，注释掉一些行：&nbsp;&nbsp; <br><br>　　tty1&nbsp;&nbsp; <br><br>　　#tty2&nbsp;&nbsp; <br><br>　　#tty3&nbsp;&nbsp; <br><br>　　#tty4&nbsp;&nbsp; <br><br>　　#tty5&nbsp;&nbsp; <br><br>　　#tty6&nbsp;&nbsp; <br><br>　　#tty7&nbsp;&nbsp; <br><br>　　#tty8&nbsp;&nbsp; <br><br>*&nbsp;使Control-Alt-Delete关机键无效&nbsp;&nbsp; <br>　　把&#8220;/etc/inittab&#8221;文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方，这非常重要。&nbsp;&nbsp; <br><br>　　编辑inittab文件（vi&nbsp;/etc/inittab）把这一行：&nbsp;&nbsp; <br><br>　　ca::ctrlaltdel:/sbin/shutdown&nbsp;-t3&nbsp;-r&nbsp;now&nbsp;&nbsp; <br><br>　　改为：&nbsp;&nbsp; <br><br>　　#ca::ctrlaltdel:/sbin/shutdown&nbsp;-t3&nbsp;-r&nbsp;now&nbsp;&nbsp; <br><br>　　用下面的命令使改变生效：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;/sbin/init&nbsp;q&nbsp;&nbsp; <br><br>*&nbsp;改变&#8220;/etc/rc.d/init.d/&#8221;目录下的脚本文件的访问许可&nbsp;&nbsp; <br>　　/etc/rc.d/init.d/下的脚本主要包含了启动服务的脚本程序。一般用户没有什么必要知道脚本文件的内容。所以应该改变这些脚本文件的权限。&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;chmod&nbsp;-R&nbsp;700&nbsp;/etc/rc.d/init.d/*&nbsp;&nbsp; <br><br>　　这样只有root可以读、写和执行这个目录下的脚本。&nbsp;&nbsp; <br>*&nbsp;/etc/rc.d/rc.local&nbsp;文件&nbsp;&nbsp; <br>　　在默认情况下，当登录装有Linux系统的计算机时，系统会告诉你Linux发行版的名字、版本号、内核版本和服务器名称。这泄露了太多的系统信息。最好只显示一个&#8220;Login:&#8221;的提示信息。&nbsp;&nbsp; <br><br>　　第一步：&nbsp;&nbsp; <br><br>　　编辑&#8220;/ect/rc.d/rc.local&#8221;文件，在下面这些行的前面加上&#8220;#&#8221;：&nbsp;&nbsp; <br><br>　　--&nbsp;&nbsp; <br><br>　　#&nbsp;This&nbsp;will&nbsp;overwrite&nbsp;/etc/issue&nbsp;at&nbsp;every&nbsp;boot.&nbsp;So,&nbsp;make&nbsp;any&nbsp;changes&nbsp;you&nbsp;&nbsp; <br><br>　　#&nbsp;want&nbsp;to&nbsp;make&nbsp;to&nbsp;/etc/issue&nbsp;here&nbsp;or&nbsp;you&nbsp;will&nbsp;lose&nbsp;them&nbsp;when&nbsp;you&nbsp;reboot.&nbsp;&nbsp; <br><br>　　#echo&nbsp;""&nbsp;&gt;&nbsp;/etc/issue&nbsp;&nbsp; <br><br>　　#echo&nbsp;"$R"&nbsp;&gt;&gt;&nbsp;/etc/issue&nbsp;&nbsp; <br><br>　　#echo&nbsp;"Kernel&nbsp;$(uname&nbsp;-r)&nbsp;on&nbsp;$a&nbsp;$(uname&nbsp;-m)"&nbsp;&gt;&gt;&nbsp;/etc/issue&nbsp;&nbsp; <br><br>　　#&nbsp;&nbsp; <br><br>　　#cp&nbsp;-f&nbsp;/etc/issue&nbsp;/etc/issue.net&nbsp;&nbsp; <br><br>　　#echo&nbsp;&gt;&gt;&nbsp;/etc/issue&nbsp;&nbsp; <br><br>　　--&nbsp;&nbsp; <br><br>　　第二步：&nbsp;&nbsp; <br><br>　　删除&#8220;/etc&#8221;目录下的&#8220;issue.net&#8221;和&#8220;issue&#8221;文件：&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;rm&nbsp;-f&nbsp;/etc/issue&nbsp;&nbsp; <br><br>　　[root@deep]#&nbsp;rm&nbsp;-f&nbsp;/etc/issue.net&nbsp;&nbsp; <br><br>　　注意：&#8220;/etc/issue.net&#8221;文件是用户从网络登录计算机时（例如：telnet&nbsp;、SSH），看到的登录提示。同样在&#8220;&#8221;目录下还有一个&#8220;issue&#8221;文件，是用户从本地登录时看到的提示。这&nbsp;两个文件都是文本文件，可以根据需要改变。但是，如果想删掉这两个文件，必须向上面介绍的那样把&nbsp;&#8220;/etc/rc.d/rc.local&#8221;脚本中的那些行注释掉，否则每次重新启动的时候，系统又会重新创建这两个文件。&nbsp;&nbsp; <br>
<img src ="http://www.blogjava.net/lantin/aggbug/122899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-06-08 17:36 <a href="http://www.blogjava.net/lantin/articles/122899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用larbin架设搜索引擎（序）</title><link>http://www.blogjava.net/lantin/articles/103040.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Sat, 10 Mar 2007 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/103040.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/103040.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/103040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/103040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/103040.html</trackback:ping><description><![CDATA[　这学期想研究一下搜索引擎原理，恰好有些想法．就动起手来，准备研究研究<br />开始觉得挺迷茫的，在网上找了点资料，都是宏观的介绍，而没有实质的解答．<br />多些剑心提供的有关搜索引擎相关的资料，让我现在心里有底了．<br />今天下了一个crawler -larbin2.6.3 据说是一个相当不错的爬虫，一天能爬下５００万张网页．<br />我开始尝试去调试它．<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 177px; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">tar </span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">xzvf larbin</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2.6</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />cd larbin</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">2.6</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008080">chmod</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">x configure<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />vi option</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">h{配置option</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">h}<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />vi larbin</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">conf<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />vi  src</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">types</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">h<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">compile</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">./</span><span style="COLOR: #000000">configure<br />   gmake<br />  ./larbin</span></div><img src ="http://www.blogjava.net/lantin/aggbug/103040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2007-03-10 21:21 <a href="http://www.blogjava.net/lantin/articles/103040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux NFS服务器性能优化(转)</title><link>http://www.blogjava.net/lantin/articles/88521.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88521.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88521.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88521.html</trackback:ping><description><![CDATA[
		<table class="textbox" cellspacing="0" cellpadding="4" width="99%" align="center" border="0">
				<tbody>
						<tr>
								<td class="textbox-title">
										<b>Linux NFS服务器性能优化</b>    <span class="comment-text">[引用 2006-01-04 14:22:18 | 发表者: zhhaju]</span></td>
								<td class="textbox-title" align="right">
										<a title="编辑..." href="http://post.blog.hexun.com/zhhaju/postarticle.aspx?articleid=2000143">
												<img id="idIconEdit" src="http://blog.hexun.com/images/icon_edit.gif" border="0" />
										</a> <a title="删除..." onclick="return isDel();" href="http://blog.hexun.com/zhhaju/deletearticle.aspx?articleid=2000143" target="_blank"><img id="idIconDel" src="http://blog.hexun.com/images/icon_del.gif" border="0" /></a> </td>
						</tr>
						<tr>
								<td class="textbox-content" colspan="2">
										<br />
										<strong>
												<span class="tpc_title">Linux NFS服务器性能优化</span>
												<br />
												<br />
										</strong>
										<span class="tpc_content">
												<font size="2">NFS是网络文件系统（Network File System）的简称，是分布式计算系统的一个组成部分，可实现在异种网络上共享和装配远程文件系统。NFS由Sun公司开发，目前已经成为文件服务的一种标准（RFC1904，RFC1813）。其最大的功能就是可以通过网络，让不同操作系统的计算机可以共享数据，所以也可以将它看做是一个文件服务器。NFS文件服务器是Linux最常见网络的服务之一。尽管它的规则简单，却有着丰富的内涵。NFS 服务器可以看作是一个文件服务器，它可以让你的PC通过网络将远端的NFS 服务器共享出来的文件挂载到自己的系统中，在客户端看来使用NFS的远端文件就象是在使用本地文件一样。 <br />　　一、硬件设备的选择<br /><br />　　随着计算机技术的发展，以硬盘为首的I/O设备对计算机的整体性能影响越来越大，通讯服务器（messaging/E-mail/VOD）:快速的I/O是这类应用的关键，硬盘的I/O吞吐能力是主要瓶颈；数据仓库:大型商业数据存储、编目、索引、数据分析，高速商业计算等，需要具有良好的网络和硬盘I/O吞吐能力；数据库（ERP/OLTP等）服务器，除了需要具有强大的CPU处理能力，同时需要有很好的磁盘I/O吞吐性能； <br /><br />　　NFS网络文件系统性能的主要瓶颈是硬盘的I/O性能和网络带宽。SCSI（Small Computer System Interface，小型计算机系统接口）技术在需要高性能的网络服务器和工作站领域却得到了广泛应用，现在已经成为网络服务器的标准的接口选择。速度从SCSI－I最初的5MBps到2005年的320MBps。内部传输率的高低是评价一个硬盘整体性能的决定性因素，硬盘数据传输率分为内外部传输率。通常称外部传输率也为突发数据传输率或接口传输率，指从硬盘的缓存中向外输出数据的速度。由于硬盘的内部传输率要小于外部传输率，所以只有内部传输率才可以作为衡量硬盘性能的真正标准。SCSI硬盘技术在内部传输率要性能上有更大优势。通常在一个50个用户的NFS网络系统中使用10个基于RAID5级别10000rpm的SCSI硬盘可以达到较好的效果。<br /><br />　　在服务器磁盘I/O性能之后，网络带宽是网络文件系统下一个瓶颈。通常应当使用单独的1000兆快速以太网连接NFS服务器和客户机发送报文信息。同时确保NFS服务器和客户机工作正常，交换机、路由器等网络设备工作正常。图－1是一个理想的NFS网络拓扑结构。<br /><br /><img onclick="if(this.width&gt;screen.width-461) window.open('http://yesky.anhuinews.com/imagelist/05/12/jb65xy7r5n3t.jpg');" src="http://yesky.anhuinews.com/imagelist/05/12/jb65xy7r5n3t.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /><br /><br />图－1 一个理想的NFS网络拓扑结构<br /><br />　　二、软件环境优化<br /><br />　　如果我们没有很高硬件环境，可以考虑从软件方面优化性能。<br /><br />　　1、清理NFS服务器磁盘碎片：<br /><br />　　不论Linux文件系统采用什么文件格式（ext3、JFS、XFS、ReiserFS ）、何种类型的硬盘(IDE 、SCSI)，随着时间的推移文件系统都会趋向于碎片化。ext3、JFS等高级文件系统可以减少文件系统的碎片化，但是并没有消除。在繁忙的数据库服务器中，随着时间的过去，文件碎片化将降低硬盘性能，硬盘性能从硬盘读出或写入数据时才能注意到。时间长了会发现每个磁盘上确实积累了非常多的垃圾文件，释放磁盘空间可以帮助系统更好地工作。Linux最好的整理磁盘碎片的方法是做一个完全的备份，重新格式化分区，然后从备份恢复文件。但是对于7×24小时工作关键任务服务器来说是比较困难的。Kleandisk是一个高效的磁盘清理工具，它能把磁盘上的文件分成不同的"组",比如把所有的"core"文件归成一组（Group），这样要删除所有core文件时只要删除这个组就行了。core文件是当软件运行出错时产生的文件，它对于软件开发人员比较有用，对于其他用户（比如电子邮件服务器）却没有任何意义。因此，如果没有软件开发的需要，见到core文件就可以将其删除。<br /><br />　　2、开启硬盘DMA<br /><br />　　现在使用的IDE硬盘基本支持DMA66/100/133（直接内存读取）但是Linux发行版本安装后一般没有打开，可以/etc/rc.d/rc.local 最後面加上一行： /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 这样以后每次开机，硬盘的 DMA 就会开启，不必每次手动设定。添加前后你可以使用命令：hdparm -Tt /dev/hda 来测试对比一下。 <br /><br />3、调整缓冲区刷新参数 <br /><br /><br /><br />　　Linux内核中，包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成，这个文件的格式是这样的：<br /><br /># cat /proc/sys/vm/bdflush<br /><br />30     64     64     256   500   3000   60     0     0 <br /><br /><br />　　每一栏是一个参数，其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘，第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RHEL 4.0中的缺省值。可以使用两种方法修改：<br /><br />　　（1）使用命令<br /><br /># echo "100 128 128 512 5000 3000 60 0 0"&gt;/proc/sys/vm/bdflush<br /><br /><br />　　并将这条命令加到/etc/rc.d/rc.local文件中去。<br /><br />　　（2）在/etc/sysctl.conf 文件中加入如下行:<br /><br />vm.bdflush = 100 128 128 512 5000 3000 60 0 0 <br /><br /><br />　　以上的设置加大了缓冲区大小，降低了bdflush被启动的频度，VFS的缓冲刷新机制是Linux文件系统高效的原因之一。 <br /><br />　　4、NFS版本的选择<br /><br />　　NFS协议从诞生到现在为止，已经有多个版本，如NFS V2（rfc1094）,NFS V3（rfc1813）（最新的版本是V4（rfc3010）。最早，Sun公司曾将NFS v2设计成为只使用UDP协议，主要原因是当时机器的内存、网络速度和CPU的影响，不得不选择对机器负担较轻的方式。而到了NFS v3，Sun公司选择了TCP协议作为缺省的传输方式。<br /><br />　　V3相对V2的主要区别： <br /><br />　　1、文件尺寸 <br /><br />　　V2版本最大只支持32BIT的文件大小(4G),而NFS V3版本新增加了支持64BIT文件大小的技术。 <br /><br />　　2、文件传输尺寸 <br /><br />　　V3版本没有限定传输尺寸，V2版本最多只能设定为8k，可以使用-rsize and -wsize 选项来进行设定。 <br /><br />　　3、完整的信息返回 <br /><br />　　V3版本增加和完善了许多错误和成功信息的返回，对于服务器的设置和管理能带来很大好处。 <br /><br />　　4、增加了对TCP传输协议的支持<br /><br />　　V2版本只提供了对UDP协议的支持，在一些高要求的网络环境中有很大限制，V3增加了对TCP协议的支持。UDP有着传输速度快，非连接传输的便捷特性，但是UDP在传输上没有TCP来的稳定，当网络不稳定或者黑客入侵的时候很容易使NFS的 Performance 大幅降低甚至使网络瘫痪。所以对于不同情况的网络要有针对的选择传输协议。<br /><br />　　5、异步写入特性。<br /><br />　　6、改进了服务器的mount性能。<br /><br />　　在Linux上，UDP协议是缺省使用的协议。作为服务器而言，别无选择。但作为客户端，可以使用TCP协议和其它使用TCP的NFS服务器互连。在局域网中使用UDP协议较好，因为局域网有比较稳定的网络保证，使用UDP可以带来更好的性能，RHEL 4.0默认使用V2版本。但是 Linux也可以通过mount option的nfsvers=n进行选择。<br /><br />　　5、优化输入输出<br /><br />　　I/O程序对Linux系统性能也是相当重要的，网络硬件I/O对服务器尤其重要。现在大多数Linux服务器使用10/100 Mb以太网。如果有较重的网络负载，则可以考虑千兆以太网卡。如果没有能力购买千兆网卡的话：可以使用多块网卡虚拟成为一块网卡，具有相同的IP地址。这项技术，在Linux中，这种技术称为Bonding。Bonding在Linux2.4以上内核中已经包含了，只需要在编译的时候把网络设备选项中的Bonding driver support选中见图2。当然利用Bonding技术配置双网卡绑定的前提条件是两块网卡芯片组型号相同，并且都具备独立的BIOS芯片。<br /><br /><img onclick="if(this.width&gt;screen.width-461) window.open('http://yesky.anhuinews.com/imagelist/05/12/a83901sofwt2.jpg');" src="http://yesky.anhuinews.com/imagelist/05/12/a83901sofwt2.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /><br /><br />图2 Linux内核的Bonding driver support选项<br /><br />然后，重新编译核心，重新起动计算机，执行如下命令：<br /><br />#ifconfig eth0 down<br /><br />#ifconfig bond0 ipaddress<br />#ifenslave bond0 eth0<br />#ifenslave bond0 eth1<br /><br /><br /><br />　　现在两块网卡已经象一块一样工作了。这样可以提高集群节点间的数据传输.bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两块100兆网卡作bonding,可大大提高服务器到交换机之间的带宽.但是需要在交换机上设置连接bonding网卡的两个子口映射为同一个虚拟接口。编辑/etc/modules.conf文件，加入如下内容，以使系统在启动时加载Bonding模块。<br /><br />alias bond0 bonding<br /><br />options bond0 mode=0<br /><br /><br />　　“mode”的值表示工作模式，共有0、1、2和3四种模式，这里设定为0。Bonding工作在负载均衡（Load Balancing (round-robin)）方式下，即两块网卡同时工作，这时理论上Bonding能提供两倍的带宽。Bonding运行在网卡的混杂（Promisc）模式下，而且它将两块网卡的MAC地址修改为一样的。混杂模式就是网卡不再只接收目的硬件地址是自身MAC地址的数据帧，而是可以接收网络上所有的帧。<br /><br />6、关闭NFS服务器不用的服务 <br /><br /><br /><br />　　Linux在启动时需要启动很多系统服务，它们向本地和网络用户提供了Linux的系统功能接口，直接面向应用程序和用户。但是，开启不必要服务则会给操作系统带来安全和性能上的影响。以root身份运行： <br /><br /><br />#ntsysv<br /><br /><br /><br />　　把不需要的服务和进程前面的*去掉（用空格键），然后重新启动系统服务，这样就可以使不需要的服务和进程不再启动。不但安全，而且还能提高系统的性能，一举两得。<br /><br />　　7、设定客户机合适的最大传输单元MTU<br /><br />　　每个网络都存在最大传输单元MTU（maximum transfer unit），要求每个数据报必须适合MTU。如果一个数据报进入了一个MTU小于该数据报长度的网络，那么处于网络边界上的路由器会把该数据报分解为多个小的数据报。这样会影响NFS网络系统的性能。tracepath它是一个工具：它用來跟踪MTU的路徑：首先使用超级用户权限登陆客户机，使用命令：:<br /><br />Resume: pmtu 1500 hops 1 back 1<br /><br /><br /><br />　　其中192.168.1.4是NFS服务器IP地址，2049是NFS服务器开启的UDP协议的端口号。<br /><br />　　可以使用命令查看：rpcinfo －p 192.168.1.4。最后tracepath命令会给出一个MTU值。<br /><br />　　然后使用ifconfig命令查看客户机上用于连接NFS服务器的网卡接口的MTU值。如果两者相差很多，可以使用Ifconfig命令修改。<br /><br /><br /><br />proc3 22 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br /><br /><br /><br />　　在第五行“th”后的 8表示8个线程。其他数字代表每秒钟线程使用的最大百分比。如果后边三个数字比较大表示可能现在挂载客户机数目比较多，需要增加线程数目。<br /><br />　　（1）首先停止nfs服务<br /><br /># echo 65536 &gt; /proc/sys/net/core/rmem_default<br />＃ntsysv<br /><br /><img onclick="if(this.width&gt;screen.width-461) window.open('http://yesky.anhuinews.com/imagelist/05/12/f0x5l19j3o8o.jpg');" height="357" src="http://yesky.anhuinews.com/imagelist/05/12/f0x5l19j3o8o.jpg" width="465" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /><br /><br />图3自动挂载NFS文件系统<br /><br />　　打开如图3所示的窗口，在autofs和apmd服务选项加上*（用空格键），然后重新启动系统，这样可以自动挂载NFS文件系统。<br /><br />　　13. 使用stand-alone模式运行NFS<br /><br />　　NFS服务器可以以stand-alone、xinetd两种模式运行。stand－alone方式是Unix传统的C/S模式的访问模式。服务器监听（Listen）在一个特点的端口上等待客户端的联机。如果客户端产生一个连接请求，守护进程就创建（Fork）一个子服务器响应这个连接，而主服务器继续监听。以保持多个子服务器池等待下一个客户端请求。stand－alone模式工作原理见图4。<br /><br /><img onclick="if(this.width&gt;screen.width-461) window.open('http://yesky.anhuinews.com/imagelist/05/12/trpxr3rw30m8.jpg');" src="http://yesky.anhuinews.com/imagelist/05/12/trpxr3rw30m8.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /><br /><br />图4 stand－alone工作模式<br /><br />　　工作在stand－alone模式下的网络服务有route、gated。另外是大家最熟悉是Web服务器：Apache和邮件服务器Sendmail、NFS。因为在NFS这种负载很大服务器上，预先创子服务器，可以通过客户的服务速度。在Linux系统中通过stand－alone工作模式启动的服务由/etc/rc.d/下面对应的运行级别当中的符号链接启动。和stand－alone工作模式相比，xinetd模式不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口，这样就降低了系统开销，保护系统资源。但是对于访问量大、经常出现并发访问时，xinetd想要频繁启动对应的网络服务进程，反而会导致系统性能下降。察看系统为Linux服务提供那种模式方法在Linux命令行可以使用pstree命令可以看到两种不同方式启动的网络服务。一般来说系统一些负载高的服务：NFS、sendmail、Apache服务是单独启动的。<br /><br />14、 NFS服务器设置的调优步骤： <br /><br /><br /><br />　　（1）首先挂接NFS服务器和每个客户端。（2） 然后测量当前网络、服务器和每个客户端的执行效率。（3）优化读写块大小。（4） 调整服务器 。 重复第一到第三步直到达到你渴望的性能。 <br /><br />　　1、挂载/home/cao目录 <br /><br />　　首先建立这个目录，然后再利用mount指令来挂载NFS 服务器的/home/cao目录： <br /><br /><br /><br /># mount -t nfs 192.168.1.4:/home/cao /home/nfs/cao<br /><br /><br /><br />　　下面使用df命令查看挂载的目录中已经包括：NFS 服务器的IP地址的共享目录，见图5。<br /><br /><img onclick="if(this.width&gt;screen.width-461) window.open('http://yesky.anhuinews.com/imagelist/05/12/cpcajx76ur28.jpg');" src="http://yesky.anhuinews.com/imagelist/05/12/cpcajx76ur28.jpg" onload="var image=new Image();image.src=this.src;if(image.width&gt;0 &amp;&amp; image.height&gt;0){if(image.width&gt;=510){this.width=510;this.height=image.height*510/image.width;}}" border="0" /><br /><br />图5 挂载NFS服务器的共享目录<br /><br />　　将资料挂载进来后，只要进入/home/nfs/cao目录，就等于到了IP地址：192.168.1.4那部NFS 服务器的/home/cao目录中。<br /><br />　　2、测试读写数据时间<br /><br />　　NFS V2版本的文件传输尺寸设定（-rsize， -wsize）V2最多只能设定为8k，缺省情况是4k（4098字节），实际情况可能和缺省值有差别。这时需要进行实际测试得到一个最佳值。方法是：<br /><br />　　（1）测试NFS网络文件系统的写性能<br /><br />　　首先以超级用户身份挂载NFS服务器的/home/cao目录。然后进入本地目录使用命令： <br /><br />time dd if=/dev/zero of=/home/nfs/cao/nfs.dat bs=16k count=16384<br /><br /><br /><br />　　这个命令意思使用命令 dd 向/dev/zero不断输入一个文件，是在NFS服务器的nfs.dat文件里写16384个16KB的块，bs是值是16K也就是一个256MB的文件，通常文件大小（256MB）设定为NFS服务器内存的2倍。同时回写到客户机中同样大小、数量的块。正常的输出结果可能是：<br /><br />输出了 16384+0 个块<br /><br />user   0m0.200s<br /><br /><br /><br />输出了 66535+0 个块<br /><br />user   0m0.420s<br /><br /><br /><br />&lt;p '&gt;192.168.1.4: :/home/cao /home/nfs/cao nfs   rsize=8192,wsize=8192,timeo=10,intr <br /><br /><br />　　重新使用命令挂载NFS服务器的/home/cao的目录，然后重复上面的（1）、（2）、（3）步骤。比较修改读写块大小后，读写性能是否有所提高。如果没有提高的话可以直接删除/etc/fstab文件。接着寻找最佳值。用于测试的rsize和wsize必须是1024的倍数，对于NFS V2版本来说8192是RSIZE和WSIZE的最大数值。<br /><br />　　总结：本文介绍了如何在现有条件下提高NFS文件服务器性能，网络管理员充分了解自己的计算机和网络，从而找到真正的瓶颈所在。在预算短缺的今天，理解如何优化系统性能比以往任何时候都重要。一味地硬件投资并不是能够让人们接受的办法，并且也不一定生效。</font>
										</span>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/lantin/aggbug/88521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:54 <a href="http://www.blogjava.net/lantin/articles/88521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache服务器配置全攻略（一）(转)</title><link>http://www.blogjava.net/lantin/articles/88515.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88515.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88515.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88515.html</trackback:ping><description><![CDATA[
		<p>Apache服务器配置全攻略（一）</p>
		<p>作者：王波/OSO</p>
		<p>　　Apache服务器的设置文件位于/usr/local/apache/conf/目录下，传统上使用三个配置文件httpd.conf,access.conf和srm.conf，来配置Apache服务器的行为。 </p>
		<p>httpd.conf提供了最基本的服务器配置，是对守护程序httpd如何运行的技术描述；srm.conf是服务器的资源映射文件，告诉服务器各种文件的MIME类型，以及如何支持这些文件；access.conf用于配置服务器的访问权限，控制不同用户和计算机的访问限制；这三个配置文件控制着服务器的各个方面的特性，因此为了正常运行服务器便需要设置好这三个文件。 </p>
		<p>　　除了这三个设置文件之外，Apache还使用mime.types文件用于标识不同文件对应的MIME类型， magic文件设置不同MIME类型文件的一些特殊标识，使得Apache 服务器从文档后缀不能判断出文件的MIME 类型时，能通过文件内容中的这些特殊标记来判断文档的MIME类型。 </p>
		<p>bash-2.02$ ls -l /usr/local/apache/conf </p>
		<p>total 100 </p>
		<p>-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf </p>
		<p>-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default </p>
		<p>-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf </p>
		<p>-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default </p>
		<p>-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic </p>
		<p>-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default </p>
		<p>-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types </p>
		<p>-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf </p>
		<p>-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default </p>
		<p>　　事实上当前版本的Apache将原来httpd.conf、srm.conf与access.conf中的所有配置参数均放在了一个配置文件httpd.conf中，只是为了与以前的版本兼容的原因（使用这三个设置文件的方式来源于NCSA-httpd），才使用三个配置文件。而提供的access.conf和srm.conf文件中没有具体的设置。 </p>
		<p>　　由于在新版本的Apache中，所有的设置都被放在了httpd.conf中，因此只需要调整这个文件中的设置。以下使用缺省提供的httpd.conf为例，解释Apache服务器的各个设置选项。然而不必因为它提供设置的参数太多而烦恼，基本上这些参数都很明确，也可以不加改动运行Apache服务器。但如果需要调整Apache服务器的性能，以及增加对某种特性的支持，就需要了解这些设置参数的含义。 </p>
		<p>　　关于Apache服务器的性能，在Internet上存在很大的争议，基本上使用Apache的使用者几乎都不怀疑它的优秀性能，Apache也支撑了很多著名的高负载的网站，但是在商业机构的评测中，Apache往往得分不高。很多人指出，在这些评测中，商业Web服务器及其操作系统往往由其专业公司的工程师进行过性能调整，而Free 的操作系统和Web服务器往往就使用其缺省配置或仅仅作很小的更改。需要指出的是，除了操作系统的性能调整之外，Apache 服务器本身的缺省配置绝不是最优化和最高效的，而是要适应几乎所有种类操作系统、所有种类硬件下的设置，多平台的软件不可能为特定平台和特定硬件提供最优化的缺省配置。因此要使用Apache的时候，性能调整是必不可少的。 </p>
		<p>　　在商业评测中忽略了的另一个事实是，评测时往往对不同种类的功能进行比较，例如使用Apache的标准CGI 的性能与ISAPI，NSAPI等服务器端API比较，事实上Apache服务器与此可以比较的功能为modperl ，FastCGI，与ASP类似的功能为PHP等等，只不过由于Apache的开放模式，这些功能是由独立的开发组，作为独立的模块来实现的。但是在评测中，测试人员没有加入相应的模块评测其性能。 </p>
		<p>HTTP守护进程的运行参数 </p>
		<p>　　httpd.conf中首先定义了一些httpd守护进程运行时需要的参数，来决定其运行方式和运行环境。 </p>
		<p>　　ServerType standalone </p>
		<p>　　ServerType定义服务器的启动方式，缺省值为独立方式standalone，httpd </p>
		<p>服务器将由其本身启动，并驻留在主机中监视连接请求。在Linux下将在启动文件 /etc/rc.d/rc.local/init.d/apache中自动启动Web服务器，这种方式是推荐设置。 </p>
		<p>　　启动Apache服务器的另一种方式是inet方式，使用超级服务器inetd监视连接请求并启动服务器。当需要使用inetd启动方式时，便需要更改为这个设置，并屏蔽/etc/rc.d/rc.local/init.d/apache文件，以及更改/etc/inetd.conf并重起inetd，那么Apache就能从inetd中启动了。 </p>
		<p>　　两种方式的区别是独立方式是由服务器自身管理自己的启动进程，这样在启动时能立即启动服务器的多个副本，每个副本都驻留在内存中，一有连接请求不需要生成子进程就可以立即进行处理，对于客户浏览器的请求反应更快，性能较高。而 inetd方式要由inetd发现有连接请求后才去启动http服务器，由于inetd 要监听太多的端口，因此反应较慢、效率较低，但节约了没有连接请求时Web服务器占用的资源。因此inetd方式只用于偶尔被访问并且不要求访问速度的服务器上。事实上inetd方式不适合http的突发和多连接的特性，因为一个页面可能包含多个图象，而每个图象都会引起一个连接请求，即使虽然访问人数造成教少，但瞬间的连接请求并不少，这就受到inetd性能的限制，甚至会影响由inetd启动的其他服务器程序。 </p>
		<p>　　ServerRoot "/usr/local" </p>
		<p>　　ServerRoot用于指定守护进程httpd的运行目录，httpd在启动之后将自动将进程的当前目录改变为这个目录，因此如果设置文件中指定的文件或目录是相对路径，那么真实路径就位于这个ServerRoot定义的路径之下。 </p>
		<p>　　由于httpd会经常进行并发的文件操作，就需要使用加锁的方式来保证文件操作不冲突，由于NFS文件系统在文件加锁方面能力有限，因此这个目录应该是本地磁盘文件系统，而不应该使用NFS文件系统。 </p>
		<p>　　#LockFile /var/run/httpd.lock </p>
		<p>　　LockFile参数指定了httpd守护进程的加锁文件，一般不需要设置这个参数， Apache服务器将自动在ServerRoot下面的路径中进行操作。但如果ServerRoot为NFS文件系统，便需要使用这个参数指定本地文件系统中的路径。 </p>
		<p>　　PidFile /var/run/httpd.pid </p>
		<p>　　PidFile指定的文件将记录httpd守护进程的进程号，由于httpd能自动复制其自身，因此系统中有多个httpd进程，但只有一个进程为最初启动的进程，它为其他进程的父进程，对这个进程发送信号将影响所有的httpd进程。PidFILE定义的文件中就记录httpd父进程的进程号。 </p>
		<p>　　ScoreBoardFile /var/run/httpd.scoreboard </p>
		<p>　　httpd使用ScoreBoardFile来维护进程的内部数据，因此通常不需要改变这个参数，除非管理员想在一台计算机上运行几个Apache服务器，这时每个Apache服务器都需要独立的设置文件htt pd.conf，并使用不同的ScoreBoardFile。 </p>
		<p>　　#ResourceConfig conf/srm.conf </p>
		<p>　　#AccessConfig conf/access.conf </p>
		<p>　　这两个参数ResourceConfig和AccessConfig，就用于和使用 srm.conf 和 access.conf 设置文件的老版本Apache兼容。如果没有兼容的需要，可以将对应的设置文件指定为/dev/null，这将表示不存在其他设置文件，而仅使用httpd.conf 一个文件来保存所有的设置选项。 </p>
		<p>　　Timeout 300 </p>
		<p>　　Timeout定义客户程序和服务器连接的超时间隔，超过这个时间间隔（秒）后服务器将断开与客户机的连接。 </p>
		<p>　　KeepAlive On </p>
		<p>　　在HTTP 1.0中，一次连接只能作传输一次HTTP请求，而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能，这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能，但还是打开使用这个选项。 </p>
		<p>　　MaxKeepAliveRequests 100 </p>
		<p>　　MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面，通常达不到这个上限就完成连接了。 </p>
		<p>　　KeepAliveTimeout 15 </p>
		<p>　　KeepAliveTimeout测试一次连接中的多次请求传输之间的时间，如果服务器已经完成了一次请求，但一直没有接收到客户程序的下一次请求，在间隔超过了这个参数设置的值之后，服务器就断开连接。 </p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/lantin/aggbug/88515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:38 <a href="http://www.blogjava.net/lantin/articles/88515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速查找某个程序运行中的PID号/关机</title><link>http://www.blogjava.net/lantin/articles/88514.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88514.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88514.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88514.html</trackback:ping><description><![CDATA[快速查找某个程序运行中的PID号/关机 <br />   例如想查找inetd: ps aux | grep inetd <br />   又如想找到最吃内存的进程： ps aux | sort +4n <br />   找到进程的PID之后就可以用kill给它发信号,或者强制杀死它如：kill -9 xxx(某个进程的PID) <br />   在Linux下还提供了一个killall，可以直接使用进程的名字而不是PID号，如killall -HUP inetd <br />   又如killall xdm。killall会把信号发给以指定名字的程序运行的所有进程。 <br />   用killall -l列出所有可用的信号。 <br />   提到ps忍不住给大家介绍一下qps,用qt写的图形界面，综合了free,top,ps及kill的特点，还可以看到 <br />   进程的Socket/Memory Map/Files信息。还有为KDE写的ktop，优点是列出了父子进程的关系。 <br />   shutdown -r now 杀掉所有进程立即重新启动 <br />   shutdown -h now 杀掉所有进程立即停机 <br />   shutdown -h +5 "Warning: After 5 minutes I'll shutdown" 给用户发消息并在5分钟后停机。 <br />   相关命令有reboot,halt,poweroff,init等。 <br />   要想实现软件关掉电源，则你的PC机必须是ATX结构的，然后去配置编译内核，打开 <br />   charactor device/Advanced Power Management support/Power off on shutdown这一项。<br /> <br />1.ps -aux|grep httpd|wc -l|&gt;count.txt        --将数量存在count.txt文件中<img src ="http://www.blogjava.net/lantin/aggbug/88514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:37 <a href="http://www.blogjava.net/lantin/articles/88514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用软盘光盘等移动介质</title><link>http://www.blogjava.net/lantin/articles/88512.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88512.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88512.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88512.html</trackback:ping><description><![CDATA[   概念.我自己刚开始学习Linux时也是这样(以前从来就没有做过root  :-)。如果你手头有讲Linux <br />   的书，仔细去看设备及文件系统的相关章节。简单地说，你需要把软盘/光盘设备上的文件系统安 <br />   装到Linux目录树上的一个点上，称之为安装点(mount point)，通常是一个目录。安装Linux后会 <br />   有个缺省的安装点/mnt，在它下面还有/mnt/floppy和/mnt/cdrom。你可以用 <br />       mount -t ext2 /dev/fd0 /mnt/floppy  &lt;--把linux文件系统格式的软盘安装上来 <br />       mount -t msdos /dev/fd0 /mnt/floppy &lt;--把dos文件系统格式的软盘安装上来 <br />       mount -t vfat /dev/fd0  /mnt/floppy &lt;--vfat支持瘟95/98的长文件名 <br />       mount /dev/hdb /mnt/cdrom  &lt;--把以从盘方式接在第一个IDE口上的光驱上的光盘安装上来 <br />       mount /dev/cdrom /mnt/cdrom  &lt;-- /dev/cdrom是指向光驱设备的一个连接 <br />       mount /mnt/cdrom    &lt;--可以这么用是因为在/etc/fstab里已经定义了 <br />       umount /mnt/floppy  &lt;--在拿出软盘之前先要把它卸载 <br />       umount /mnt/cdrom   &lt;--不卸载就拿不出光盘 <br />   当然你也可以自己建一些安装点，比如"mkdir /mnt/smb","mkdir /scd"然后 <br />       mount -t iso9660 /dev/scd0 /scd  &lt;--/dev/scd0: SCSI光驱 <br />       smbmount //fjj/download /mnt/smb <br />   等等，熟悉之后就可以灵活运用。 <br />   单用mount而不跟任何参数可以显示已经安装的文件系统，或者查看/etc/mtab文件 <br />   初学者还经常问到如何格式化磁盘，在Linux里概念有些不同，称之为制作文件系统(make filesystem) <br />   应该用mkfs命令，由于现在的Linux都使用ext2格式，最好直接使用mke2fs,比如mke2fs /dev/fd0 <br />   mke2fs /dev/hdb2等等。如果要对软盘低级格式化，则可以用fdformat，而硬盘在出厂时已经格式化， <br />   无须低级格式化(那是危险的)。检查文件系统则用e2fsck，如e2fsck -av /dev/fd0。 <br />   哈，这个根本算不上Tips,不过有些初学者总是不喜欢看书思考，甚至还问如何添加/删除用户。<img src ="http://www.blogjava.net/lantin/aggbug/88512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:36 <a href="http://www.blogjava.net/lantin/articles/88512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>添加/删除用户</title><link>http://www.blogjava.net/lantin/articles/88513.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88513.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88513.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88513.html</trackback:ping><description><![CDATA[添加/删除用户 <br />   用useradd username(或者adduser username)添加一个名为username的用户，然后用passwd username <br />   指定口令。用户的信息记录在/etc/passwd文件里，由于每个用户都可以(而且必须能)读出这个文件然 <br />   后就可以crack出其它用户的密码，为安全考虑现在都使用shadow。在/etc/passwd下用户的口令变为x <br />   真正的口令密文记录在/etc/shadow里，而这个文件只有以root权限才能读出。Redhat 5.1以下版本没 <br />   有直接使用shadow，需要用pwconv转换一下，如果要变回来，可以用pwunconv。提示：在/etc/skel目 <br />   录记录了一个用户应该有的基本文件(ls -a /etc/skel/看看都有什么),useradd会自动把这些文件复 <br />   制到用户的家目录下并置上适当的权限(除非添加用户时用了-m参数: useradd -m xxx)。如果你在这个 <br />   目录下键一个public_html的目录，则以后添加的用户在它的家目录下都会自动有个同名的目录，这样 <br />   每个用户都有了“个人主页”。 <br />   删除用户可以用userdel usrname或userdel -r username(有些发行版可能是deluser)，-r参数会删除 <br />   这个用户的家目录，但是在系统里别的地方还可能有此用户的信息，所以在删除用户之前最好还要 <br />   用find / -user username等方式去找一找相关信息。 <br />   如果要临时禁止一个用户，可以在/etc/passwd文件中此用户的密码这一项第一个字符前添加一个*号。 <br />   如果把密码域改为空，则此用户不需要密码就可以进入系统，当你忘记root口令时，可以用软盘启动 <br />   把原来的root安装上来，直接去改passwd文件。我记得以单用户方式启动时不需要密码可以进去。 <br />   长用户名的问题，在Redhat发行版中已经做得很好了，也允许用户名中有空格。如果你手上的发行版 <br />   不支持，到/usr/include/utmpbits.h里把UT_NAMEDSIZE改为32,重新编译相关程序。 <br />   另一个直观的配置工具是linuxconf，比如用它来配置pppuser等等。 <br />   这里只能给一些线索,自己多看"man useradd","man shadow","man group","man userdel"...... <br />   再一次建议新来者多看书多思考多看看man page，否则不大容易找到/etc/skel是干什么的。<img src ="http://www.blogjava.net/lantin/aggbug/88513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:36 <a href="http://www.blogjava.net/lantin/articles/88513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让grep搜寻文件及所有子目录下的文件里的内容</title><link>http://www.blogjava.net/lantin/articles/88509.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88509.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88509.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88509.html</trackback:ping><description><![CDATA[让grep搜寻文件及所有子目录下的文件里的内容 <br />   例如搜寻ZhXwin下所有C原代码中的"Chinput"(试试取消下行的-q参数): <br />   find /download/ZhXwin -name *.c -exec grep -q -s Chinput {} \; -print <br />   查找所有文件则可以用： <br />   find . -type f -exec grep -s chinese {} \; -print <br />   如果喜欢图形界面，KDE带的kfind很不错。<br /><br />列出目录下的文件个数<br />ls -l |grep  "-" |wc -l   count files<br />ls -l  |grep  "d"|wc -l  count diretcory<img src ="http://www.blogjava.net/lantin/aggbug/88509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:35 <a href="http://www.blogjava.net/lantin/articles/88509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看启动日志和apache日志</title><link>http://www.blogjava.net/lantin/articles/88507.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88507.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88507.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88507.html</trackback:ping><description><![CDATA[首先去查看/etc/syslog.conf文件，找到对应的文件。 <br />   (更详细的信息去看"man syslogd" "man syslog.conf" 以及"man klogd") <br />   通常在SlackWare下为/var/adm/messages，在Redhat下为/var/log/messages。 <br />   这些文件可能会很大，要注意备份和删除。 <br />   前面已经提到用tail(tail -f)查看这些文件的方法，另外还有个logscanner工具，挺不错的。 <br />  <br />查看系统登陆用户的信息用 cat /var/logs/messages<br />查看 apache的访问日志：   cat /home/apache/logs/access_log 或者error_log<br /><img src ="http://www.blogjava.net/lantin/aggbug/88507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:34 <a href="http://www.blogjava.net/lantin/articles/88507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于rpm的小技巧 </title><link>http://www.blogjava.net/lantin/articles/88508.html</link><dc:creator>花之剑</dc:creator><author>花之剑</author><pubDate>Mon, 18 Dec 2006 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/lantin/articles/88508.html</guid><wfw:comment>http://www.blogjava.net/lantin/comments/88508.html</wfw:comment><comments>http://www.blogjava.net/lantin/articles/88508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lantin/comments/commentRss/88508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lantin/services/trackbacks/88508.html</trackback:ping><description><![CDATA[关于rpm的小技巧 <br />   1)安装rpm包时显示进度 <br />     用-vh参数，如rpm -ivh ipchains-1.3.6-1.i386.rpm <br />     如果用glint或xrpm则不必。 <br />   2)直接通过ftp来安装rpm包 <br />     如rpm -i <a href="ftp://ftp.xxx.xxx">ftp://ftp.xxx.xxx</a><br />   3)校验所有的rpm包，查找丢失的文件 <br />     rpm -Va <br />   4)查找一个文件属于哪个rpm包 <br />     例如：rpm -qf /usr/bin/who <br />   5)列出一个rpm包的描述信息 <br />     例如：rpm -qpi mon-0.37j-1.i386.rpm <br />   6)列出一个rpm包的文件信息 <br />     例如：rpm -qpl mon-0.37j-1.i386.rpm <img src ="http://www.blogjava.net/lantin/aggbug/88508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lantin/" target="_blank">花之剑</a> 2006-12-18 13:34 <a href="http://www.blogjava.net/lantin/articles/88508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>