<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>开源小站 &#187; Unix</title>
	<atom:link href="http://www.litrin.net/category/unix/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.litrin.net</link>
	<description>It is Cool to OpenSource</description>
	<lastBuildDate>Fri, 03 Feb 2012 04:33:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>posix的特性——fork</title>
		<link>http://www.litrin.net/2011/08/31/posix%e7%9a%84%e7%89%b9%e6%80%a7%e2%80%94%e2%80%94fork/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=posix%25e7%259a%2584%25e7%2589%25b9%25e6%2580%25a7%25e2%2580%2594%25e2%2580%2594fork</link>
		<comments>http://www.litrin.net/2011/08/31/posix%e7%9a%84%e7%89%b9%e6%80%a7%e2%80%94%e2%80%94fork/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 05:28:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1541</guid>
		<description><![CDATA[记得之前曾经在一段Python中介绍过python的mulitprocess模块在windows的不兼容。其中提及了linux/Unix特有的fork方式，而windows无法实现导致的死循环。当时只是提到了一下，重点不同的关系，没有深究。 fork，顾名思义就是一把叉子，或者专业一点叫做复制叉。作为sys/type.h的一个函数，系统在每次调用fork()之后，将会以此为分叉，对进程本身进行复制，新的进程和旧进程有近乎完全一致的cpu时间和内存寄存器。 这本身并不重要，重要的是对于fork()函数的返回而言，父进程返回的是子进程的pid，而子进程返回的是0，当然还有一个-1的返回表示fork()的失败。对与C大致如此： #include &#60;unistd.h&#62;; #include &#60;sys/types.h&#62;; main () { pid_t pid; pid=fork(); if (pid &#60; 0) printf("error in fork!"); else { if (pid == 0) { printf("i am the child process, my process id is %d\n",getpid()); exit(); } else { printf("i am the parent process, my process id is %d\n",getpid()); exit(); } } } [...]]]></description>
			<content:encoded><![CDATA[<p>记得之前曾经在一段Python中介绍过<a title="python multiprocessing的问题" href="http://www.litrin.net/2010/06/23/python-multiprocessing%e7%9a%84%e9%97%ae%e9%a2%98/">python的mulitprocess模块在windows的不兼容</a>。其中提及了linux/Unix特有的fork方式，而windows无法实现导致的死循环。当时只是提到了一下，重点不同的关系，没有深究。</p>
<p>fork，顾名思义就是一把叉子，或者专业一点叫做复制叉。作为sys/type.h的一个函数，系统在每次调用fork()之后，将会以此为分叉，对进程本身进行复制，新的进程和旧进程有近乎完全一致的cpu时间和内存寄存器。</p>
<p><span id="more-1541"></span></p>
<p><img src="http://www.litrin.net/wp-content/uploads/2011/08/linux_fork.gif" alt="fork模型" title="fork模型" width="246" height="152" class="aligncenter size-full wp-image-1545" /></p>
<p>这本身并不重要，重要的是对于fork()函数的返回而言，父进程返回的是子进程的pid，而子进程返回的是0，当然还有一个-1的返回表示fork()的失败。对与C大致如此：</p>
<pre>#include &lt;unistd.h&gt;;
#include &lt;sys/types.h&gt;;

main ()
{
        pid_t pid;
        pid=fork();

        if (pid &lt; 0)
                printf("error in fork!");
        else
        {
			if (pid == 0)
                        {
                                 printf("i am the child process, my process id is %d\n",getpid());
		                 exit();
                        }
			else
                        {
                                printf("i am the parent process, my process id is %d\n",getpid());
				exit();
                         }
         }
}</pre>
<p>执行后，父进程和子进程分别将自己的Pid打印出来。</p>
<p>既然如此，对于我常用的php来说，可以同样做到后端执刑一些耗时的操作，从而达到异步的效果：</p>
<pre name=code class="php">function mulitProcess()/*{{{*/
{
        if (function_exists(pcntl_fork))
        {
            $pid = pcntl_fork();

		    if ( $pid === -1 )
		    {
		    	return false;
		    }
		    elseif ( $pid )
		    {
                        usleep(10);
                        exit();
                    }
                    else
                    {
                         doBackground();
                    }
        }
        // windows system or php not support PCNTL libs
        else
        {
			doBackground();
        }
}</pre>
<p>对于很多守护进程来说，脱离shell（即“脱壳”）正是利用了这种方式进行进程复制。对与PHP来说需要进行2次fork之后配合一个死循环即可,当然为了防止死循环真的“死掉”需要sleep()函数来进行休眠：</p>
<pre name=code class="php">function daemonize() /*{{{*/
{
    $pid    =   pcntl_fork();

    if (-1 == $pid)
    {
        return false;
    }
    elseif ($pid)  //parent process
    {
        usleep(500);
        exit();
    }
    $sid    =   posix_setsid();

    if (!$sid)
    {
        return false;
    }

    $pid    =   pcntl_fork();

    if ( -1 == $pid )
    {
        return false;
    }
    elseif ($pid)
    {
        usleep(500);
        exit(0);
    }

    // deny process display and io
    if (defined('STDIN'))
            fclose(STDIN);

    if (defined('STDOUT'))
            fclose(STDOUT);

    if (defined('STDERR'))
            fclose(STDERR);
    while(true)
            doSomeThing();

}/*}}}*/</pre>
<p>需要注意的是，windows没有fork()，php直接屏蔽了PCNL函数库，而python相对没有一棒子打死。Python采用的方式等于在命令行重新调用一次脚本，如果直接将没有考虑到这个问题的python脚本直接移植windows的话进程数量将会爆炸式增长，很快就会导致资源耗尽。由于我在windows上大多只是进行测试而已，多进程带来的性能优势不重要，习惯上我的方法就是使用threading模块替换掉mulitprocessing模块。写个示例：</p>
<pre name=code class="python">
try: #if os.name == 'posix':
    from multiprocessing import Process, Queue
except: #else:
    from threading import Thread as Process
    from Queue import Queue
</pre>
<p><img src="http://www.litrin.net/wp-content/uploads/2011/08/windows_fork_sim-300x125.gif" alt="windows模拟fork模型" title="悲催的windows模拟fork模型" width="300" height="125" class="aligncenter size-medium wp-image-1546" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/08/31/posix%e7%9a%84%e7%89%b9%e6%80%a7%e2%80%94%e2%80%94fork/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分布式文件系统Moose FS的部署</title>
		<link>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%2586%25e5%25b8%2583%25e5%25bc%258f%25e6%2596%2587%25e4%25bb%25b6%25e7%25b3%25bb%25e7%25bb%259fmoose-fs%25e7%259a%2584%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 03:22:46 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1500</guid>
		<description><![CDATA[近期随着云概念的热炒，什么都分布式。所谓分布式的文件系统就是把若干机器上的磁盘空间统一维护，成为一个逻辑上的独立空间，当然，还有对应的容错和压力分散解决方案。 这些天在研究分布式存储的东西，测试了比较出名的几个分布式文件系统。首先是淘宝的tfs，国人出品应该支持了，谁知TFS的支持库实在不敢恭维，换了几种操作系统，最终才在suse上安装成功。可作为一个绑死操作系统的应用，风险太大。接着是MogileFS，MogileFS是基于perl的，在安装了一系列的perl依赖包之后，MogileFS安装的很顺利，性能也能达到要求，问题就是在于我们实在不愿意去维护一个perl环境。最后剩下了MooseFS。 凡是分布式系统一般都会有中心和节点的概念，对应到mfs上就是master server和chunk servers。其中master 是运算消耗型，chunk是磁盘消耗型。整个系统是网络带宽消耗型。建议生产环境中使用千兆网络，并可以根据本站提供的信息建立bond。 mfs还有自己的Backup server被称为metalogger在master出现故障时能够及时替换掉master的地位。硬件相同于master一致，至少拥有同样大小的内存。 MooseFS环境准备 作为测试环境，我准备了两台服务器，仅搭建Master和chunk各一台。没有metakogger。 192.168.1.1 master #Ubuntu 11.04 192.168.1.101 chunk #Ubuntu 11.04 192.168.1.201 客户端 #Ubuntu 11.04 由于需要编译，build-essential, pkg-config,  zlib1g-dev是必须的。 下载源码包 http://sourceforge.net/projects/moosefs/ MooseFS Master的安装 #groupadd mfs  #准备组/用户 #useradd -g mfs mfs #tar -zxvf mfs-1.6.15.tar.gz #cd mfs-1.6.15 #./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs &#8211;disable-mfschunkserver &#8211;disable-mfsmount #make #make install 需要注意的是，这次所有的./configure都是类似的，不要搞错！安装结束后/etc/mfs下会有几个dist结尾的配置文件，去掉.dist结尾。 其中 mfsmaster.cfg 文件是允许访问的主机权限，做过nfs的应该很清楚了。 cd /var/lib/mfs cp [...]]]></description>
			<content:encoded><![CDATA[<p>近期随着云概念的热炒，什么都分布式。所谓分布式的文件系统就是把若干机器上的磁盘空间统一维护，成为一个逻辑上的独立空间，当然，还有对应的容错和压力分散解决方案。</p>
<p>这些天在研究分布式存储的东西，测试了比较出名的几个分布式文件系统。首先是淘宝的tfs，国人出品应该支持了，谁知TFS的支持库实在不敢恭维，换了几种操作系统，最终才在suse上安装成功。可作为一个绑死操作系统的应用，风险太大。接着是MogileFS，MogileFS是基于perl的，在安装了一系列的perl依赖包之后，MogileFS安装的很顺利，性能也能达到要求，问题就是在于我们实在不愿意去维护一个perl环境。最后剩下了MooseFS。</p>
<p><span id="more-1500"></span></p>
<p>凡是分布式系统一般都会有中心和节点的概念，对应到mfs上就是master server和chunk servers。其中master 是运算消耗型，chunk是磁盘消耗型。整个系统是网络带宽消耗型。建议生产环境中使用千兆网络，并可以根据<a title="Linux下多网卡负载的实现" href="http://www.litrin.net/2006/05/21/linux%e4%b8%8b%e5%a4%9a%e7%bd%91%e5%8d%a1%e8%b4%9f%e8%bd%bd%e7%9a%84%e5%ae%9e%e7%8e%b0/" target="_blank">本站提供的信息建立bond</a>。</p>
<p>mfs还有自己的Backup server被称为metalogger在master出现故障时能够及时替换掉master的地位。硬件相同于master一致，至少拥有同样大小的内存。</p>
<h2>MooseFS环境准备</h2>
<p>作为测试环境，我准备了两台服务器，仅搭建Master和chunk各一台。没有metakogger。</p>
<p>192.168.1.1 master #Ubuntu 11.04</p>
<p>192.168.1.101 chunk #Ubuntu 11.04</p>
<p>192.168.1.201 客户端 #Ubuntu 11.04</p>
<p>由于需要编译，build-essential, pkg-config,  zlib1g-dev是必须的。</p>
<p>下载源码包 http://sourceforge.net/projects/moosefs/</p>
<h2><strong>MooseFS Master的安装</strong></h2>
<p>#groupadd mfs  #准备组/用户<br />
#useradd -g mfs mfs</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15</p>
<p>#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfschunkserver &#8211;disable-mfsmount</span><br />
#make<br />
#make install</p>
<p>需要注意的是，这次所有的./configure都是类似的，不要搞错！安装结束后/etc/mfs下会有几个dist结尾的配置文件，去掉.dist结尾。</p>
<p>其中 mfsmaster.cfg 文件是允许访问的主机权限，做过nfs的应该很清楚了。</p>
<p>cd /var/lib/mfs<br />
cp metadata.mfs.empty metadata.mfs</p>
<p>mfsmaster start #启动服务器</p>
<p>mfscgiserv #启动webbase管理界面，通过http://192.168.1.1:9425可以看到一个相当不错的界面。</p>
<p>借此，master段配置完成</p>
<h2><strong>MooseFS Chunk的安装</strong></h2>
<p>与master差不多的过程，我直接贴了：</p>
<p>#groupadd mfs  #准备组/用户<br />
#useradd -g mfs mfs</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15</p>
<p>#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfsmaster</span></p>
<p>make &amp;&amp; make install</p>
<p>同样，将/etc/mfs下的.dist文件改名，文件不大，我是直接新建的。</p>
<p>mfshdd.cfg 里面记录了你想要共享（事实上是存放文件信息的）的路径，我习惯上用了/data</p>
<p>mfschunckserver.cfg 加上两行：</p>
<pre>MASTER_HOST = 192.168.1.1</pre>
<pre>MASTER_PORT = 9420</pre>
<p>/data目录的权限要注意，mfs可写。</p>
<p>mfschunkserver start #启动chunk server。回头去看http://192.168.1.1:9425的disks选项卡，应该会多出一个记录。</p>
<h2><strong>MooseFS Client的安装</strong></h2>
<p>moosefs支持fuse的直接挂装，客户端先安装fuse.</p>
<p>apt-get install fuse-util</p>
<p>总算不用添加mfs用户组了！</p>
<p>#tar -zxvf mfs-1.6.15.tar.gz<br />
#cd mfs-1.6.15<br />
#./configure &#8211;prefix=/usr &#8211;sysconfdir=/etc/mfs &#8211;localstatedir=/var/lib &#8211;with-default-user=mfs&#8211;with-default-group=mfs <span style="text-decoration: underline;">&#8211;disable-mfsmaster&#8211;disable-mfschunkserver </span> #3个disable!</p>
<p>#make &amp;&amp; make install</p>
<p>mfsmount /mnt -H 192.168.1.1 #Master 的IP</p>
<p>df -h | grep mnt结果</p>
<p>192.168.1.1:9421    4.6G     0  46G   0% /mnt</p>
<p>挂装成功！写个大文件看看：dd if=/dev/zero of=/mnt/bigfile bs=1024 count=1seek=$((20*1024*1024-1))</p>
<p>去http://192.168.1.1:9425，应该会有变化，但由于mfs是支持动态压缩的，磁盘占用不会像上面那条命令那么变态的20G。</p>
<p>当chunk写满后可以很方便的再添加一台chunk，这就是分布式的方便之处！</p>
<h2><strong>MooseFS 安装问题</strong></h2>
<p>在Ubuntu下异常的顺利，在redhat系下出了几个问题。</p>
<ol>
<li>安装fuse后启动fuse系统提示error in fuse_mount<br />
出现在fuse2.8.x 的安装过程中，这是因为fuse2.8要求linux内核版本较高，使用2.7.6即可。不要忘记安装kernel-devel库</li>
<li>出现fuse library is too old or not installed &#8211; mfsmount needs version 2.6 or higher<br />
可以在fuse的./configure中prefix=/usr，或者 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH更改默认路径即可！</li>
</ol>
<h2><strong>MooseFS 的常用维护</strong></h2>
<ol>
<li>察看文件保存状态：<br />
client：  mfsgetgoal -r FILENAME　或　mfsgetgoal -r FILENAME</li>
<li>备份meta状态：<br />
master: /var/lib/mfs下的metadata.mfs文件是当前的metadata，默认每小时都会更新，旧文件将会添加.back后缀备份即可，并同时增加changelog.*.log。当然，推荐使用moosefs metalogger</li>
<li>强行数据回写：<br />
master: mfsmetarestore -a</li>
<li>数据回滚：<br />
master: mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog.?.mfs</li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/06/20/%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fmoose-fs%e7%9a%84%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LAMP的常用扩展安装</title>
		<link>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lamp%25e7%259a%2584%25e5%25b8%25b8%25e7%2594%25a8%25e6%2589%25a9%25e5%25b1%2595%25e5%25ae%2589%25e8%25a3%2585</link>
		<comments>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/#comments</comments>
		<pubDate>Mon, 16 May 2011 01:57:56 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1467</guid>
		<description><![CDATA[之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装： FreeBSD + Apache + PHP + Mysql (恶搞版) FreeBSD + Apache + PHP + Mysql + Oracle Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP Ubuntu + nginx + php Ubuntu + php + Oracle Memcache 说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。 For Ubuntu apt-get install memcached php5-memcache /etc/init.d/memcached start For FreeBSD cd /usr/ports/databases/memcached make install clean cd /usr/ports/databases/pecl-memcache make [...]]]></description>
			<content:encoded><![CDATA[<p>之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装：</p>
<ul>
<li><a title="用FreeBSD的ports安装apache+php+mysql" href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/" target="_blank">FreeBSD + Apache + PHP + Mysql</a> (<a title="用FreeBSD的ports安装apache+php+mysql·改" href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">恶搞版</a>)</li>
<li><a title="FreeBSD+apache+PHP+OCI支持Oracle" href="http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/" target="_blank">FreeBSD + Apache + PHP + Mysql + Oracle</a></li>
<li>Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP</li>
<li><a title="Ubuntu下安装Nginx+php(FastCGI)" href="http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/" target="_blank">Ubuntu + nginx + php</a></li>
<li><a title="配置Ubuntu的php支持OCI8" href="http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/" target="_blank">Ubuntu + php + Oracle</a></li>
</ul>
<p><span id="more-1467"></span></p>
<p><strong>Memcache</strong></p>
<p>说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。</p>
<ul>
<li>For Ubuntu<br />
apt-get install memcached php5-memcache<br />
/etc/init.d/memcached start</li>
<li>For FreeBSD<br />
cd /usr/ports/databases/memcached<br />
make install clean<br />
cd /usr/ports/databases/pecl-memcache<br />
make install clean<br />
echo”memcached_enable=YES” &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/memcached start</li>
</ul>
<p><strong>Redis</strong></p>
<p>也是一个Key-value数据库，比起Memcache速度慢一点，但会回写硬盘，数据不丢失。处理Feed之类SQL吃上劲的应用必备。</p>
<ul>
<li>For Ubuntu //11.04可行，8.04不行，官方似乎从904以后才加入的。之前的版本不妨用<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/r/redis/" target="_blank">debian包<br />
</a>apt-get install redis-server php-redis //同样的<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/p/php-radius/" target="_blank">debian包下载</a><br />
/etc/init.d/redis-server start</li>
<li>For Freebsd<br />
cd /usr/ports/databases/redis<br />
make install clean<br />
echo &#8216;redis_enable=”YES”&#8216; &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/redis restart<br />
cd /usr/ports/databases/php5-redis<br />
make install clean //敲的条件反射了</li>
</ul>
<p>说起redis的PHP支持类，由于redis是明文的传输，所以很多人会选择<a rel="nofollow" target="_blank" href="https://github.com/jdp/redisent" target="_blank">redisend</a>这类基于socket连接方式的php类——说白了就是模拟telnet 6379。根据实际测试的结果，C扩展至少有40%以上的提升，而且内存更少，加包和拆包的过程更迅速。更何况redisend的前一个版本一堆问题，后一个版本又是php5.3 only的天上一脚，地上一脚的维护也是麻烦。不是万不得已还是少用为妙。</p>
<p><strong>PHP-FPM</strong></p>
<p>这个是给Nginx做fastcgi扩展的，相比php-cgi, spawn-cgi不但性能上有提升，配置上也灵活的多，但FreeBSD不支持，Ubuntu也不官方推荐。这里使用了ubuntu的非官方库。</p>
<p>echo “deb <a rel="nofollow" target="_blank" href="http://php53.dotdeb.org">http://php53.dotdeb.org</a> stable all” &gt;&gt; /etc/apt/sources.list<br />
apt-get update; apt-get upgrade<br />
apt-get install php5-fpm</p>
<p>会直接覆盖之前官方支持的PHP包，请慎重考虑。</p>
<p>/etc/init.d/php5-fpm start</p>
<p><strong>PHP-GD</strong></p>
<p>最常见的缺失，但很容易。</p>
<ul>
<li>For Ubuntu<br />
apt-get install php5-gd</li>
<li>For FreeBSD<br />
cd /usr/ports/graphics/php5-gd<br />
make install clean</li>
</ul>
<p><strong>Minify</strong></p>
<p>Minify是一个基于PHP5的CSS/JS优化包，其实这不属于Php的扩展。</p>
<ol>
<li><a rel="nofollow" target="_blank" href="http://code.google.com/p/minify/">http://code.google.com/p/minify/</a> 下载最新的minify，解压后，将min目录拷贝至网站根目录下。</li>
<li>确认是否开启了apache 的mod_rewrite，Ubuntu默认不开启，需要a2enmod,选择rewrite后,/etc/init.d/apache2 restart 重起apache</li>
<li>网站根目录下编辑.htaccess内容如下：
<pre>RewriteEngine On
        RewriteBase /
         RewriteRule ^(.*\.(css|js))\S?$ min/index.php?f=$1 [L]</pre>
</li>
<li>如果系统已经安装了memcache包，不妨用MC替代文件方式存储优化后的信息，编辑min/config.php，末尾添加
<pre class="php">require 'lib/Minify/Cache/Memcache.php';
$memcache = new Memcache;
$memcache-&gt;connect('localhost', 11211); //根据本地配置调整
$min_cachePath = new Minify_Cache_Memcache($memcache);</pre>
</li>
</ol>
<p><strong>TokyoTyrant (ttServer)</strong></p>
<p>TykyoTyrant想必web game, social game的公司用的很多，大概是由于某家企鹅公司的框架所限吧。这东西就是一个“支持lua扩展并可持续化”的key-value。个人觉得完全可以通过memcache + redis两者取代。</p>
<ul>
<li>for Ubuntu (natty ok, hardy not support)<br />
apt-get install tokyotyrant<br />
/etc/init.d/tokyotyrant 52~53行稍作修改：<br />
52 #SERVERHOST=”$RUNDIR/$NAME.sock”<br />
53 SERVERPORT=1978<br />
即可通过/etc/init.d/tokyotyrant start命令启动1978端口的监听</li>
</ul>
<ul>
<li>for Freebsd<br />
cd /usr/ports/databases/tokyotyrant/<br />
make install clean</li>
</ul>
<div>tokyotyrant有自己的php模块，但习惯上都是通过memcache模块进行操作的，命令等价于memcahce的操作。</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装Subversion服务器</title>
		<link>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%25ae%2589%25e8%25a3%2585subversion%25e6%259c%258d%25e5%258a%25a1%25e5%2599%25a8</link>
		<comments>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 02:53:19 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1380</guid>
		<description><![CDATA[SVN虽说已经老了，可能逐步要被Git这类的新型版本控制服务软件代替了。但就单单兼容性和整合度来说，唯一与之媲美的只有更加古老的CVS了。 总之，没什么可以解释的，直接切入正题吧。服务器又是我近期一贯使用的Ubuntu Server。版本是1004 LTS。 $sudo apt-get update #迟早会像我一样条件反射的打这条命令的 $ sudo apt-get install subversion subversion-tools $cd /data/subversion   $ svnadmin create ExampleProject #建立SVN项目ExampleProject 修改ExampleProject下的passwd 建立用户名，authz建立工作组和权限。 如果您仅仅只是在内网中使用SVN的话，到这一步其实已经结束了，直接执行 $sudo  svnserve -d -r /data/subversion   之后就netstat -an可以看到3690的监听就说明svn的服务已经起来了，可以通过TortroseSVN这类的工具连接server://IP/ExampleProject的方式进行访问。 如果你需要通过http方式访问的话，那么继续。 $ sudo apt-get install mod_svn apache2 编辑/etc/apache2/mods-available/dav_svn.conf，在末尾加上： &#60;Location /svn/&#62;         DAV svn         SVNParentPath /data/subversion         AuthType Basic         AuthName "SVN repository"         AuthUserFile /data/subversion/.htpasswd [...]]]></description>
			<content:encoded><![CDATA[<p>SVN虽说已经老了，可能逐步要被Git这类的新型版本控制服务软件代替了。但就单单兼容性和整合度来说，唯一与之媲美的只有更加古老的CVS了。</p>
<p>总之，没什么可以解释的，直接切入正题吧。服务器又是我近期一贯使用的Ubuntu Server。版本是1004 LTS。</p>
<p>$sudo apt-get update #迟早会像我一样条件反射的打这条命令的<br />
$ sudo apt-get install subversion subversion-tools</p>
<p><span id="more-1380"></span></p>
<p>$cd /data/subversion  <br />
$ svnadmin create ExampleProject #建立SVN项目ExampleProject<br />
修改ExampleProject下的passwd 建立用户名，authz建立工作组和权限。</p>
<p>如果您仅仅只是在内网中使用SVN的话，到这一步其实已经结束了，直接执行<br />
$sudo  svnserve -d -r /data/subversion  <br />
之后就netstat -an可以看到3690的监听就说明svn的服务已经起来了，可以通过<a rel="nofollow" target="_blank" href="http://tortoisesvn.net/downloads.html" target="_blank">TortroseSVN</a>这类的工具连接server://IP/ExampleProject的方式进行访问。</p>
<p>如果你需要通过http方式访问的话，那么继续。</p>
<p>$ sudo apt-get install mod_svn apache2</p>
<p>编辑/etc/apache2/mods-available/dav_svn.conf，在末尾加上：</p>
<pre>&lt;Location /svn/&gt;
        DAV svn
        SVNParentPath /data/subversion

        AuthType Basic
        AuthName "SVN repository"

        AuthUserFile /data/subversion/.htpasswd
        require valid-user

        &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
                Require valid-user
        &lt;/LimitExcept&gt;
&lt;/Location&gt;</pre>
<p>重启apache2<br />
$sudo apache2ctl restart</p>
<p>$htpasswd -c /data/subversion/.htpasswd UserName1</p>
<p>$htpasswd -m /data/subversion/.htpasswd UserName2 注意，参数变了！</p>
<p>之前编辑的passwd文件可以不要理会了，直接编辑authz文件的工作组和权限就好了。</p>
<p>如果之前一直都没有问题的话，直接连接server://IP/svn/ExampleProject就可以访问了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/01/05/%e5%ae%89%e8%a3%85subversion%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD ZFS版本升级的问题</title>
		<link>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freebsd-zfs%25e7%2589%2588%25e6%259c%25ac%25e5%258d%2587%25e7%25ba%25a7%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 09:32:34 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[网络和安全]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1308</guid>
		<description><![CDATA[之前的文章,介绍FreeBSD下的ZFS。 FreeBSD 8.1比较吸引我的一个重要更新就是将ZFS从测试模块升级到了正式模块。这意味着Zfs已经足够的成熟和稳定了。 闲话不说，我这台主机是用zfs来做nfs服务器。刚升级到了FreeBSD 8.1 stable的版本。 首先，升级zpool的版本 #zpool upgrade -a 接着，升级zfs版本 #zfs upgrade -a 正常情况下zfs的升级就完成了。中间几乎没有延时。 由于zfs需要使用nfs，而且随着zfs成为了正式版本，原本有一个垃圾设置（设不设没效果）sharenfs 已经正式实现了。不去修改的话就会出现nfs被挂装但是无法访问文件的问题。 # zfs set sharenfs=yes  /YOURPATCH 由于默认i386默认没有为zfs开启prefetch（预读），需要在/boot/load.conf中加入vfs.zfs.prefetch_disable=0。 同时，系统vm.kmem_size_max和vm.kmem_size两个设置如果过大的话可能会在系统拷贝大文件时吃光所有内存，设置请慎重。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.litrin.net/2008/11/19/freebsd%e7%9a%84zfs/" target="_blank">之前的文章,介绍FreeBSD下的ZFS。</a></p>
<p>FreeBSD 8.1比较吸引我的一个重要更新就是将ZFS从测试模块升级到了正式模块。这意味着Zfs已经足够的成熟和稳定了。</p>
<p>闲话不说，我这台主机是用zfs来做nfs服务器。刚升级到了FreeBSD 8.1 stable的版本。</p>
<p><span id="more-1308"></span></p>
<p>首先，升级zpool的版本</p>
<p>#zpool upgrade -a</p>
<p>接着，升级zfs版本</p>
<p>#zfs upgrade -a</p>
<p>正常情况下zfs的升级就完成了。中间几乎没有延时。</p>
<p>由于zfs需要使用nfs，而且随着zfs成为了正式版本，原本有一个垃圾设置（设不设没效果）sharenfs 已经正式实现了。不去修改的话就会出现nfs被挂装但是无法访问文件的问题。</p>
<p># zfs set sharenfs=yes  /YOURPATCH</p>
<p>由于默认i386默认没有为zfs开启prefetch（预读），需要在/boot/load.conf中加入vfs.zfs.prefetch_disable=0。</p>
<p>同时，系统vm.kmem_size_max和vm.kmem_size两个设置如果过大的话可能会在系统拷贝大文件时吃光所有内存，设置请慎重。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/09/10/freebsd-zfs%e7%89%88%e6%9c%ac%e5%8d%87%e7%ba%a7%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过motd信息简化巡检操作</title>
		<link>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%2580%259a%25e8%25bf%2587motd%25e4%25bf%25a1%25e6%2581%25af%25e7%25ae%2580%25e5%258c%2596%25e5%25b7%25a1%25e6%25a3%2580%25e6%2593%258d%25e4%25bd%259c</link>
		<comments>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 01:57:41 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1300</guid>
		<description><![CDATA[作为一个Unix系统的管理员，手工巡检几乎成了工作中一个重要的部分。这里不放使用Linux的motd通告信息实现简单的信息通告，至少能省去了不少手工命令的时间。 motd即Message Of ToDay，每天的信息。大部分的固定文本信息放置在/etc/motd下，如果没有你可以直接创建一个，然后修改其中的内容制作一个主机登录Banner以便于区分多台主机。对于Ubuntu来说，特别是启用了server中“landscope管理系统”后，这里没有效果，你需要修改的文件为/etc/motd.tail。 对于部分相对比较保守的Unix版本而言剩下可供修改的并不多，只有通过/etc/issue的方法，除了使用现有的字符，issue还支持参数如下： /l 显示终端机接口号 /m 显示内核的硬件版本 /n 显示主机名 /o 显示 域名 /r 显示操作系统的版本，类似于uname -r  /t 显示本地端时间 /s 操作系统的名称 /v 操作系统的版本 对于比较激进的操作系统（ubuntu就曾经因为motd爆出安全漏洞）那就更灵活了。 Ubuntu： 修改/etc/init.d/bootmisc.sh脚本，其中： uname -snrvm &#62; /var/run/motd         [ -f /etc/motd.tail ] &#38;&#38; cat /etc/motd.tail &#62;&#62; /var/run/motd 我要加入uptime和df -h的信息就修改为： uname -snrvm &#62; /var/run/motd         [ -f /etc/motd.tail ] &#38;&#38; cat /etc/motd.tail &#62;&#62; /var/run/motd [...]]]></description>
			<content:encoded><![CDATA[<p>作为一个Unix系统的管理员，手工巡检几乎成了工作中一个重要的部分。这里不放使用Linux的motd通告信息实现简单的信息通告，至少能省去了不少手工命令的时间。</p>
<p>motd即Message Of ToDay，每天的信息。大部分的固定文本信息放置在/etc/motd下，如果没有你可以直接创建一个，然后修改其中的内容制作一个主机登录Banner以便于区分多台主机。对于Ubuntu来说，特别是启用了server中“landscope管理系统”后，这里没有效果，你需要修改的文件为/etc/motd.tail。</p>
<p><span id="more-1300"></span></p>
<p>对于部分相对比较保守的Unix版本而言剩下可供修改的并不多，只有通过/etc/issue的方法，除了使用现有的字符，issue还支持参数如下：</p>
<p>/l 显示终端机接口号<br />
/m 显示内核的硬件版本<br />
/n 显示主机名<br />
/o 显示 域名<br />
/r 显示操作系统的版本，类似于uname -r <br />
/t 显示本地端时间<br />
/s 操作系统的名称<br />
/v 操作系统的版本</p>
<p>对于比较激进的操作系统（ubuntu就曾经因为motd爆出安全漏洞）那就更灵活了。</p>
<p>Ubuntu：</p>
<p>修改/etc/init.d/bootmisc.sh脚本，其中：</p>
<pre class="bash" name='code'>        uname -snrvm &gt; /var/run/motd
        [ -f /etc/motd.tail ] &amp;&amp; cat /etc/motd.tail &gt;&gt; /var/run/motd</pre>
<p>我要加入uptime和df -h的信息就修改为：</p>
<pre class="bash" name='code'>        uname -snrvm &gt; /var/run/motd
        [ -f /etc/motd.tail ] &amp;&amp; cat /etc/motd.tail &gt;&gt; /var/run/motd
        uptime &gt;&gt; /var/run/motd
        df -h &gt;&gt; /var/run/motd</pre>
<p>重启服务：</p>
<p>/etc/init.d/bootmisc.sh stop<br />
/etc/init.d/bootmisc.sh start // 不支持restart reload等操作</p>
<p>登录查看，成功！</p>
<p>FreeBSD：</p>
<p>其实是一个原理，方式类似：</p>
<p>ee /etc/rc.d/motd</p>
<pre class="bash" name='code'>        uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' &gt; ${T}
        awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' &lt; /etc/motd &gt;&gt; ${T}</pre>
<p>改为：</p>
<pre class="bash" name='code'>        uname -v | sed -e 's,^\([^#]*\) #\(.* [1-2][0-9][0-9][0-9]\).*/\([^\]*\) $,\1 (\3) #\2,' &gt; ${T}
        awk '{if (NR == 1) {if ($1 == "FreeBSD") {next} else {print "\n"$0}} else {print}}' &lt; /etc/motd &gt;&gt; ${T}

        uptime &gt;&gt; ${T}
        df -h &gt;&gt; ${T} </pre>
<p>重启</p>
<p> /etc/rc.d/motd stop;  /etc/rc.d/motd start</p>
<p>成功！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/17/%e9%80%9a%e8%bf%87motd%e4%bf%a1%e6%81%af%e7%ae%80%e5%8c%96%e5%b7%a1%e6%a3%80%e6%93%8d%e4%bd%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个怪异的Cron问题</title>
		<link>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25b8%2580%25e4%25b8%25aa%25e6%2580%25aa%25e5%25bc%2582%25e7%259a%2584cron%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 03:24:22 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1297</guid>
		<description><![CDATA[一个朋友向我咨询他遇到的一个问题。 Centos的操作系统，自然是主流应用的WWW。近期无缘无故的Cron失效，所有的任务都无法执行。多次重启主机，重启Cron服务均是如此。 起先我由于没有拿到控制台，怀疑是Cron经典的环境变量问题，修改了半天也是白忙。总算此兄开恩，将root的权限给了我。:) 登入主机，crontab -l，所有命令都正常，单独执行也都OK。跑到/var/spool/cron下也没有发现有什么文件权限之类的问题。 每天都被cron mail挤爆信箱的我觉的从邮件入手吧。谁知那位兄弟没有配置邮件系统，而且直接disable了sendmail服务。 这里需要说明的是，Crontab 默认会将定时执行的结果通过mail返回给用户。如果没有启动Sendmail服务，系统（确切的应该是sendmail程序）将会把每一个结果保存为一个文件，放置在/var/spool/clientmqueue下。 cd /var/spool/clientmqueue 呵呵，果然！等了半个多小时愣是没有给list出来。du -sh 也是个费时费力的操作了。 mv * 太慢，直接 ls &#124; xargs rm 操作，清空了所有的文件，重试了一下，搞定！ 解决此类方法的建议： 开启sendmail服务，这是最佳途径。 每条命令使用 &#8216;&#62;&#62;&#8217;  指向一个日志文件，如果觉得返回没有必要，就直接  &#62;&#62; /dev/null 2&#62;&#38;1 丢弃掉。 更加变态的方式就是再加一条cron，定期清空 /var/spool/clientmqueue PS： 之前没有弄过，完成测试的时候才理清的一个Cron问题： 30 3 * * 1 dosomething ,是每周一3点半执行是确信无疑的了。 30 3 1 * 1 dosomething, 是当1号是周一的时候执行吗？不是！是1号，或者周一的时候执行。crontab中的星期是一个“或”的概念，而非其他的“和”的概念。]]></description>
			<content:encoded><![CDATA[<p>一个朋友向我咨询他遇到的一个问题。</p>
<p>Centos的操作系统，自然是主流应用的WWW。近期无缘无故的Cron失效，所有的任务都无法执行。多次重启主机，重启Cron服务均是如此。</p>
<p>起先我由于没有拿到控制台，怀疑是Cron经典的环境变量问题，修改了半天也是白忙。总算此兄开恩，将root的权限给了我。:)</p>
<p><span id="more-1297"></span></p>
<p>登入主机，crontab -l，所有命令都正常，单独执行也都OK。跑到/var/spool/cron下也没有发现有什么文件权限之类的问题。</p>
<p>每天都被cron mail挤爆信箱的我觉的从邮件入手吧。谁知那位兄弟没有配置邮件系统，而且直接disable了sendmail服务。</p>
<p>这里需要说明的是，Crontab 默认会将定时执行的结果通过mail返回给用户。如果没有启动Sendmail服务，系统（确切的应该是sendmail程序）将会把每一个结果保存为一个文件，放置在/var/spool/clientmqueue下。</p>
<p>cd /var/spool/clientmqueue 呵呵，果然！等了半个多小时愣是没有给list出来。du -sh 也是个费时费力的操作了。</p>
<p>mv * 太慢，直接 ls | xargs rm 操作，清空了所有的文件，重试了一下，搞定！</p>
<p>解决此类方法的建议：</p>
<ol>
<li>开启sendmail服务，这是最佳途径。</li>
<li>每条命令使用 &#8216;&gt;&gt;&#8217;  指向一个日志文件，如果觉得返回没有必要，就直接  &gt;&gt; /dev/null 2&gt;&amp;1 丢弃掉。</li>
<li>更加变态的方式就是再加一条cron，定期清空 /var/spool/clientmqueue</li>
</ol>
<p>PS：</p>
<p>之前没有弄过，完成测试的时候才理清的一个Cron问题：</p>
<p>30 3 * * 1 dosomething ,是每周一3点半执行是确信无疑的了。<br />
30 3 1 * 1 dosomething, 是当1号是周一的时候执行吗？不是！是1号，或者周一的时候执行。crontab中的星期是一个“或”的概念，而非其他的“和”的概念。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/13/%e4%b8%80%e4%b8%aa%e6%80%aa%e5%bc%82%e7%9a%84cron%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>重新封包的python smtplib</title>
		<link>http://www.litrin.net/2010/06/30/%e9%87%8d%e6%96%b0%e5%b0%81%e5%8c%85%e7%9a%84python-smtplib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%2587%258d%25e6%2596%25b0%25e5%25b0%2581%25e5%258c%2585%25e7%259a%2584python-smtplib</link>
		<comments>http://www.litrin.net/2010/06/30/%e9%87%8d%e6%96%b0%e5%b0%81%e5%8c%85%e7%9a%84python-smtplib/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 02:25:01 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1269</guid>
		<description><![CDATA[这些天做了一个小的系统：将Oracle中的数据导出然后通过邮件直接发送给用户。 oracle部分主要通过sqlplus的报表格式导出成csv。邮件部分主要通过python读取csv然后再转译成html格式发送。 原理上很简单，到头来python的smtplib调试了半天才ok，为了方便，重新封了一下包，基本上的用途都在里面了。分享给各位！ 提醒各位：不要用它来收发垃圾邮件！ ## ##****************************************************************************** ##   NAME:       SendMail ##   PURPOSE:    ## ##   REVISIONS: ##   Ver        Date        Author           Description ##   ---------  ----------  ---------------  ------------------------------------ ##   1.0        2010/06/28  Litrin J.        1. Created this Script. ## ##   NOTES: ## ##      Object Name:     SendMail.py ##      Sysdate:         2010/06/28 ##      ##      Username:         Litrin Jiang ##      Website:          litrin.net ## ##****************************************************************************** ## [...]]]></description>
			<content:encoded><![CDATA[<p>这些天做了一个小的系统：将Oracle中的数据导出然后通过邮件直接发送给用户。<br />
oracle部分主要通过sqlplus的报表格式导出成csv。邮件部分主要通过python读取csv然后再转译成html格式发送。</p>
<p>原理上很简单，到头来python的smtplib调试了半天才ok，为了方便，重新封了一下包，基本上的用途都在里面了。分享给各位！<br />
<span style="color: #ff0000;">提醒各位：不要用它来收发垃圾邮件！</span></p>
<p><span id="more-1269"></span></p>
<pre name=code class=python>
##
##******************************************************************************
##   NAME:       SendMail
##   PURPOSE:   
##
##   REVISIONS:
##   Ver        Date        Author           Description
##   ---------  ----------  ---------------  ------------------------------------
##   1.0        2010/06/28  Litrin J.        1. Created this Script.
##
##   NOTES:
##
##      Object Name:     SendMail.py
##      Sysdate:         2010/06/28
##     
##      Username:         Litrin Jiang
##      Website:          litrin.net
##
##******************************************************************************
##

import sys
import smtplib
import email
import re

class SendMail:
   
    MailServer = {}
    MailServer['UserName'] = ''            
    MailServer['Password'] = ''                 #SMTP密码
    MailServer['Host'] = ''
    MailServer['SSL'] = False
    MailServer['Port'] = 0

    Subtype = 'html'
    Charset = 'gb2312'

    SenderName = ''
    ReciverName = ''   
    Notification = False

    __aRealAddressList = []
   
    def __init__ (self, From = '', Address='', Subject='', Body='', CCAddress = '', BCCAddress = ''):

        if ((From + Address + Subject + Body) != ''):

            self.Send(self, From, Address, Subject, Body, CCAddress = '')
       

    def Send(self, From, Address, Subject, Body, CCAddress = '', BCCAddress = ''):

        self.Email = email.MIMEText.MIMEText (Body,_subtype=self.Subtype, _charset=self.Charset)

        self.Email['From'] = self.AddressList(From, self.SenderName, False)
                   
        self.Email['To'] = self.AddressList(Address)

        if CCAddress != '':
            self.Email['Cc'] = self.AddressList(CCAddress)

        if BCCAddress != '':
            self.AddressList(BCCAddress)
           
        self.Email['Subject'] = self.StrEncode(Subject)
       
        self.Email['X-Maile'] = 'Python Script by Litrin.net'
        self.Email['X-Python-Version'] = str(sys.platform) + str(sys.version_info)
       
        if (self.Notification) :
            self.Email['Disposition-Notification-To'] = From

 
        self.__ServerSending()

    def StrEncode(self, String, Charset = ''):
        if Charset == '':
            Charset = self.Charset
           
        return str(email.Header.Header (String, Charset))

    def AddressList(self, oAddress, ReciverName = '', SendingList = True):

        if isinstance(oAddress, dict):
            To = ''
            for dAddress in oAddress :
                To += self.AddressList(oAddress[dAddress],dAddress )  + ','
            return To
       
        elif isinstance(oAddress, list):
            To = ''
            for sAddress in oAddress :
                To += self.AddressList (sAddress, '') + ','
            return To
       
        else:
           
            try :
                self.CheckEmail(oAddress)
            except:
                print oAddress + 'is not a Email address!'
                exit()
               
            if ReciverName == '':
                ReciverName = self.ReciverName     
           
            if ReciverName != '':
                To = self.StrEncode(ReciverName) + '&lt;' + oAddress + '&gt;'
            else:
                To = oAddress
               
            if SendingList :
                self.__aRealAddressList.append(oAddress)               

            return To
   

    def CheckEmail(self, sEmailAddress):
        sRegex = r'^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$'
        return re.match(sRegex, sEmailAddress)
   
    def __ServerSending(self):

        if (self.MailServer['SSL'] == False):
          
            server = smtplib.SMTP(self.MailServer['Host'],port = self.MailServer['Port'])
        else:
            server = smtplib.SMTP_SSL(self.MailServer['Host'], port = self.MailServer['Port'])

          
        server.login(self.MailServer['UserName'], self.MailServer['Password'])
       
        for sAddress in self.__aRealAddressList:           
           
            server.sendmail(self.Email['From'], sAddress, self.Email.as_string())
           
        server.quit()

if __name__ == '__main__':
    mail = SendMail()
    mail.MailServer['UserName'] = ''            
    mail.MailServer['Password'] = ''                 #SMTP密码
    mail.MailServer['Host'] = ''
    #mail.MailServer['SSL'] = True
    mail.SenderName = 'Litrin J.'
   

    mail.Send(From = <a rel="nofollow" target="_blank" href="mailto:'abc@123.com'">'abc@123.com'</a>,
              Address = <a rel="nofollow" target="_blank" href="mailto:'abc@71inc.com'">'abc@71inc.com'</a>,
              Subject = 'Subject:test',
              Body = '&lt;b&gt;This is a test mail!&lt;/b&gt;')
 </pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/06/30/%e9%87%8d%e6%96%b0%e5%b0%81%e5%8c%85%e7%9a%84python-smtplib/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>python multiprocessing的问题</title>
		<link>http://www.litrin.net/2010/06/23/python-multiprocessing%e7%9a%84%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=python-multiprocessing%25e7%259a%2584%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/06/23/python-multiprocessing%e7%9a%84%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 09:30:55 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1260</guid>
		<description><![CDATA[multiprocessing的是Python2.6中新加入的模块，旨在用类似threading调用tread(线程)的方式使用process(进程)。 服务器中经常需要对大规模的数据进行压缩，传统使用单进程操作不足以体现8核CPU并发的威力。于是写了一个脚本用于多进程压缩。然而在windows的主机上进行调试，全都是死循环，以至于机器都无法进行响应。导入Linux主机，测试却通过。对脚本进行了精简如下： 出错的代码： from multiprocessing import Process #from threading import Thread def work(a): print "This is : " + str(a) + '\n' exit x = 2 while(x&#62;1): p = Process(target=work, args=(x,)) p.start() x -= 1 类似的调用方法，换成threading库是正确的 #from multiprocessing import Process from threading import Thread def work(a): print "This is : " + str(a) + '\n' [...]]]></description>
			<content:encoded><![CDATA[<p>multiprocessing的是Python2.6中新加入的模块，旨在用类似threading调用tread(线程)的方式使用process(进程)。</p>
<p>服务器中经常需要对大规模的数据进行压缩，传统使用单进程操作不足以体现8核CPU并发的威力。于是写了一个脚本用于多进程压缩。然而在windows的主机上进行调试，全都是死循环，以至于机器都无法进行响应。导入Linux主机，测试却通过。对脚本进行了精简如下：</p>
<p><span id="more-1260"></span><br />
出错的代码：</p>
<pre name=code class="python">
from multiprocessing  import Process
#from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

x = 2

while(x&gt;1):
    p = Process(target=work, args=(x,))
    p.start()
    x -= 1</pre>
<p>类似的调用方法，换成threading库是正确的</p>
<pre name=code class="python">
#from multiprocessing  import Process
from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

x = 2

while(x&gt;1):
    thread = Thread(target=work, args=(x,))
    thread.start()
    x -= 1</pre>
<p>翻阅了<a rel="nofollow" target="_blank" href="http://docs.python.org/library/multiprocessing.html#windows">官方文档</a>，找到了问题所在：</p>
<p>*Nix平台对于multiprocessing 的实现是基于C库中的fork()，所有子进程与父进程的数据是完全相同，可以说是父进程的完全克隆。<br />
而对于windows，由于windows对于进程的实现方式不同，没有fork()函数，multiprocessing 的调用只能是对于该脚本的重新调用，难怪会出现死循环的问题。</p>
<p>改良后的代码：</p>
<pre name=code class="python">
from multiprocessing  import Process
#from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

if __name__ == '__main__' :
    x = 2

    while (x&gt;1):
        p= Process(target=work, args=(x,))
        p.start()
        x -= 1</pre>
<p>对于multiprocessing 和 Threading的区别：</p>
<p>Threading的操作只能和父进程在同一个物理CPU上执行。但由于不需要底层的调用，大多数简单的操作效率很高。<br />
multiprocessing的操作可以在多个CPU上执行，但耗费的内存资源也远高于thread方式，适合于集中运算或大并发的状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/06/23/python-multiprocessing%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>再谈谈 Oracle+Sun=?</title>
		<link>http://www.litrin.net/2010/03/31/%e5%86%8d%e8%b0%88%e8%b0%88-oraclesun/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2586%258d%25e8%25b0%2588%25e8%25b0%2588-oraclesun</link>
		<comments>http://www.litrin.net/2010/03/31/%e5%86%8d%e8%b0%88%e8%b0%88-oraclesun/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 08:06:56 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[开源7788]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[业界话题]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1208</guid>
		<description><![CDATA[上次写过几篇东西，关于Oracle收购Sun的。Oracle+Sun=? , Sun的身前身后事。 如今尘埃落定，www.sun.com 也已经被重定向到了www.oracle.com 。至少局外人看来，两家公司已经合并，而且至少不是失败的。 也就是在今天，得知oracle放出消息：今后Solaris不再免费提供，下载版本只提供90天的试用。如果使用，请买授权！ 从个人角度上来说，我当然希望是提前一天庆祝了明天的节日。但事实上这并非是空穴来风。 Sun是一家技术公司，需要推广自己的产品。免费派送操作系统提升Sun硬件产品、Java，这种方式是明智的选择。但相对比较商业化一点的Oracle则认为Solaris只是一个众多产品线上其中的一环，并没有Sun之前认为的那种“中心化”地位——他们的中心是Oracle数据库。而且Oracle已经在用类似的方式进行了推广。或者至少说明Oracle认为没有必要同时免费派发这么多软件。 接下去，可能Solaris会被逐步边缘化，代码逐步合并到了Oracle Linux中——由于Linux遵循GPL，这样有可能出现Solaris和Linux的大混血。原本仅属于Sun Solaris的种种优势将会完全移植到Linux，这会Linux社区的幸运。或者出现完全相反的状况，Oracle Linux被边缘化，Solaris取代了它的地位。这样反而成为Linux的不幸，这是又一家大的商业公司的倒戈。 不管出现什么状况，最不幸的永远是opensolaris项目。要么会尾随Solaris退去光环，要么完全沦为小白鼠，一蹶不振，就如同Redhat之fedora。 那Mysql呢？后果已经“不容乐观”了，提起来伤心，不提也罢。]]></description>
			<content:encoded><![CDATA[<p>上次写过几篇东西，关于Oracle收购Sun的。<a href="http://www.litrin.net/2009/04/21/oraclesun/">Oracle+Sun=?</a> , <a href="http://www.litrin.net/2009/03/29/sun%e7%9a%84%e8%ba%ab%e5%89%8d%e8%ba%ab%e5%90%8e%e4%ba%8b/">Sun的身前身后事</a>。</p>
<p>如今尘埃落定，<a rel="nofollow" target="_blank" href="http://www.sun.com/">www.sun.com</a> 也已经被重定向到了<a rel="nofollow" target="_blank" href="http://www.oracle.com">www.oracle.com</a> 。至少局外人看来，两家公司已经合并，而且至少不是失败的。</p>
<p>也就是在今天，得知oracle放出消息：今后Solaris不再免费提供，下载版本只提供90天的试用。如果使用，请买授权！</p>
<p>从个人角度上来说，我当然希望是提前一天庆祝了明天的节日。但事实上这并非是空穴来风。</p>
<p><span id="more-1208"></span></p>
<p>Sun是一家技术公司，需要推广自己的产品。免费派送操作系统提升Sun硬件产品、Java，这种方式是明智的选择。但相对比较商业化一点的Oracle则认为Solaris只是一个众多产品线上其中的一环，并没有Sun之前认为的那种“中心化”地位——他们的中心是Oracle数据库。而且Oracle已经在用类似的方式进行了推广。或者至少说明Oracle认为没有必要同时免费派发这么多软件。</p>
<p style="text-align: center;"><a href="http://www.litrin.net/wp-content/uploads/2010/03/oracle_solaris_download_page.gif"><img class="size-medium wp-image-1209  aligncenter" title="oracle_solaris_download_page" src="http://www.litrin.net/wp-content/uploads/2010/03/oracle_solaris_download_page-300x286.gif" alt="" width="300" height="286" /></a></p>
<p>接下去，可能Solaris会被逐步边缘化，代码逐步合并到了Oracle Linux中——由于Linux遵循GPL，这样有可能出现Solaris和Linux的大混血。原本仅属于Sun Solaris的种种优势将会完全移植到Linux，这会Linux社区的幸运。或者出现完全相反的状况，Oracle Linux被边缘化，Solaris取代了它的地位。这样反而成为Linux的不幸，这是又一家大的商业公司的倒戈。</p>
<p>不管出现什么状况，最不幸的永远是opensolaris项目。要么会尾随Solaris退去光环，要么完全沦为小白鼠，一蹶不振，就如同Redhat之fedora。</p>
<p>那Mysql呢？后果已经“不容乐观”了，提起来伤心，不提也罢。</p>
<p><a href="http://www.litrin.net/wp-content/uploads/2010/03/oracle_solaris_download_page.gif"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/03/31/%e5%86%8d%e8%b0%88%e8%b0%88-oraclesun/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solaris连锁故障</title>
		<link>http://www.litrin.net/2010/02/22/solaris%e8%bf%9e%e9%94%81%e6%95%85%e9%9a%9c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solaris%25e8%25bf%259e%25e9%2594%2581%25e6%2595%2585%25e9%259a%259c</link>
		<comments>http://www.litrin.net/2010/02/22/solaris%e8%bf%9e%e9%94%81%e6%95%85%e9%9a%9c/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 06:19:29 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[solaris]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1172</guid>
		<description><![CDATA[公司有一台服务器，属于经常被冷落的那种。SunV245 + solaris 10 + Oracle 10G 。自从装好机之后uptime至少有2年了。 且说这天需要重启，重启后无法通过ssh连接，通过串口终端连上之后发觉由于之前习惯于ssh key登录，一直没有root密码。郁闷中。 这台机器，一没有显卡，二没有光驱。实在让人头疼。七手八脚的把自己本本的光驱拆下来装在机器上，又发觉是自动硬盘启动的那种，无法光驱启动。 获得OK提示符 获得OK，相对比较容易，只是一般的键盘不是sun专用，没有那一堆控制键。 进入串口终端，启动机器并载入操作系统之后，在终端输入 #. 进入SC，运气不错，SC没有密码。输入break，再console回来就获得了Ok提示符。 获取root密码 进入OK后，放入solaris for sparc的盘，输入boot cdrom -s 进入修复系统。中间有一段比较漫长的等待。 进入系统后将硬盘 /dev/dsk/c1t0d0s0 挂装好之后找到硬盘上的etc/shadow。 将第一行的root:xxxxxxxxxxxx:14302:::::: 修改为root::14302:::::: 重新启动后用空密码就可以直接登系统。 SVCS问题 进入系统后，发现一大堆SVC服务无法启动，所有的问题都来自于一个关键应用 system-filesystem-local:default 无法正常启动。 tail /var/svc/log/system-filesystem-local:default.log 发觉有如下报错：WARNING: /sbin/mountall -l failed: exit status 1 不解，但既然是mount的问题，肯定和/etc/vfstab有关。打开这个文件，顿时就傻了——最后一行： /dev/dsk/c1t0d0s0       /dev/rdsk/c1t0d0s0      /       ufs     1       no &#8230;&#8230;. /dev/dsk/c1t3d0s0  /dev/rdsk/c1t3d0s0  /backup  ufs  0  yes  [...]]]></description>
			<content:encoded><![CDATA[<p>公司有一台服务器，属于经常被冷落的那种。SunV245 + solaris 10 + Oracle 10G 。自从装好机之后uptime至少有2年了。</p>
<p>且说这天需要重启，重启后无法通过ssh连接，通过串口终端连上之后发觉由于之前习惯于ssh key登录，一直没有root密码。郁闷中。</p>
<p><span id="more-1172"></span></p>
<p>这台机器，一没有显卡，二没有光驱。实在让人头疼。七手八脚的把自己本本的光驱拆下来装在机器上，又发觉是自动硬盘启动的那种，无法光驱启动。</p>
<p><strong>获得OK提示符</strong></p>
<p>获得OK，相对比较容易，只是一般的键盘不是sun专用，没有那一堆控制键。<br />
进入串口终端，启动机器并载入操作系统之后，在终端输入 #. 进入SC，运气不错，SC没有密码。输入break，再console回来就获得了Ok提示符。</p>
<p><strong>获取root密码</strong></p>
<p>进入OK后，放入solaris for sparc的盘，输入boot cdrom -s 进入修复系统。中间有一段比较漫长的等待。<br />
进入系统后将硬盘 /dev/dsk/c1t0d0s0 挂装好之后找到硬盘上的etc/shadow。<br />
将第一行的root:xxxxxxxxxxxx:14302:::::: 修改为root::14302::::::<br />
重新启动后用空密码就可以直接登系统。</p>
<p><strong>SVCS问题</strong></p>
<p>进入系统后，发现一大堆SVC服务无法启动，所有的问题都来自于一个关键应用 system-filesystem-local:default 无法正常启动。<br />
tail /var/svc/log/system-filesystem-local:default.log 发觉有如下报错：<span style="color: #ff0000;">WARNING: /sbin/mountall -l failed: exit status 1</span></p>
<p><span style="color: #000000;">不解，但既然是mount的问题，肯定和/etc/vfstab有关。打开这个文件，顿时就傻了——最后一行：<br />
</span><span style="color: #000000;">/dev/dsk/c1t0d0s0       /dev/rdsk/c1t0d0s0      /       ufs     <span style="text-decoration: underline;">1 </span>      no<br />
&#8230;&#8230;.</span><span style="color: #000000;"><br />
/dev/dsk/c1t3d0s0  /dev/rdsk/c1t3d0s0  /backup  ufs <span style="text-decoration: underline;"> 0</span>  yes  rw<br />
系统将/backup的挂装顺序设置为了0，/为1。这意味着系统默认会先挂/backup，后挂/。摆明了肯定会错。注释掉/backup这一行，问题解决！</span></p>
<p><span style="color: #000000;"><strong>分析</strong></span></p>
<p><span style="color: #000000;">问题出的无厘头。<br />
原来之前曾经对这个机器添加过硬盘，当时通过webmin直接修改的vfstab，webmin的一个bug导致了vfstab的错误。只是之前从未重启，也没暴露出来。<br />
没有root密码也是因为一直没有暴露出这个交接不清的问题。</span></p>
<p><span style="color: #000000;"><br />
<strong>Webmin BUG -&gt;硬盘挂装出错-&gt;fs关键服务不能启动-&gt;网络不启动-&gt;ssh不启动-&gt;无密码不能登入-&gt;需要OK提示符</strong></span><span style="color: #000000;">纠结~~~~</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/22/solaris%e8%bf%9e%e9%94%81%e6%95%85%e9%9a%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用SSH Tunnel穿越防火墙</title>
		<link>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e7%2594%25a8ssh-tunnel%25e7%25a9%25bf%25e8%25b6%258a%25e9%2598%25b2%25e7%2581%25ab%25e5%25a2%2599</link>
		<comments>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 02:17:06 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1164</guid>
		<description><![CDATA[这次接上篇。 很多企业对互联网的访问进行了限制，如何突破防火墙的限制成了一个问题。本文就是利用了SSH tunnel搭建了socket5代理。 首先，申请一个外网的ssh帐户，个人建议使用http://www.unix-center.net/提供的免费资源，该网站还提供多种平台主机可供测试之用，非常不错！当然，如果可以使用密钥方式登录那就完美了。 申请好账户之后，依然在本地安装ssh的客户端，windows推荐putty。 安装好后执行putty，在hostname里面输入主机名，或者用户名@主机名。我选了FreeBSD的那台，有兴趣的话还有ubuntu，Sun，甚至龙芯一系列主机可供挑选 选择ssh-&#62;tunnels，在source栏里添加你要提供的端口号，一般随便填一个未使用的端口就可，我用了8080端口。选择Dynamic，点击add。这里需要说明的是，如果你的主机允许别人使用的话，请勾选最上面的Local ports accept connection from other hosts。 点击Open确认连接，在接下来的窗口中输入用户名和密码。最小化窗口，不要关闭。 打开命令行，输入命令netstat -an，如果出现了你刚才输入的那个端口号的侦听，说明搭建成功！socket服务已经完成。 浏览器设置，IE:internet选项，连接，局域网设置，勾选“为LAN使用代理服务器”，高级，套接字选择127.0.0.1并填写端口号。完成设置。 对应的命令行： plink : plink -C -N -f -D 端口号 用户名@主机名 ssh: ssh  -C -N -f -D 端口号 用户名@主机名 PS: 话两头说，如果你负责一个企业局域网的话，稍大点的企业如果要限网，SSH端口是绝对要加以限制使用的。伟大的防火墙亦是如此。]]></description>
			<content:encoded><![CDATA[<p>这次接<a href="http://www.litrin.net/2010/02/03/%e7%94%a8ssh-tunnel%e6%89%93%e9%80%a0%e5%ae%89%e5%85%a8%e9%82%ae%e4%bb%b6%e7%b3%bb%e7%bb%9f/" target="_blank">上篇</a>。</p>
<p>很多企业对互联网的访问进行了限制，如何突破防火墙的限制成了一个问题。本文就是利用了SSH tunnel搭建了socket5代理。</p>
<p>首先，申请一个外网的ssh帐户，个人建议使用<a rel="nofollow" target="_blank" href="http://www.unix-center.net/">http://www.unix-center.net/</a>提供的免费资源，该网站还提供多种平台主机可供测试之用，非常不错！当然，如果可以使用密钥方式登录那就完美了。</p>
<p><span id="more-1164"></span></p>
<p>申请好账户之后，依然在本地安装ssh的客户端，windows推荐<a rel="nofollow" target="_blank" href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">putty</a>。</p>
<p>安装好后执行putty，在hostname里面输入主机名，或者用户名@主机名。我选了FreeBSD的那台，有兴趣的话还有ubuntu，Sun，甚至龙芯一系列主机可供挑选</p>
<div id="attachment_1166" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_main.png"><img class="size-medium wp-image-1166" title="ssh_proxy_putty_main" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_main-300x288.png" alt="Putty 主界面" width="300" height="288" /></a><p class="wp-caption-text">Putty 主界面</p></div>
<p>选择ssh-&gt;tunnels，在source栏里添加你要提供的端口号，一般随便填一个未使用的端口就可，我用了8080端口。选择Dynamic，点击add。这里需要说明的是，如果你的主机允许别人使用的话，请勾选最上面的Local ports accept connection from other hosts。</p>
<div id="attachment_1167" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_tunnel_setting.png"><img class="size-medium wp-image-1167" title="ssh_proxy_putty_tunnel_setting" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_putty_tunnel_setting-300x288.png" alt="Putty ssh tunnel界面" width="300" height="288" /></a><p class="wp-caption-text">Putty ssh tunnel界面</p></div>
<p>点击Open确认连接，在接下来的窗口中输入用户名和密码。最小化窗口，不要关闭。</p>
<p>打开命令行，输入命令netstat -an，如果出现了你刚才输入的那个端口号的侦听，说明搭建成功！socket服务已经完成。</p>
<div id="attachment_1165" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_netstat.png"><img class="size-medium wp-image-1165" title="ssh_proxy_netstat" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_netstat-300x195.png" alt="netstat -an " width="300" height="195" /></a><p class="wp-caption-text">netstat -an </p></div>
<p>浏览器设置，IE:internet选项，连接，局域网设置，勾选“为LAN使用代理服务器”，高级，套接字选择127.0.0.1并填写端口号。完成设置。</p>
<div id="attachment_1168" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_IE.png"><img class="size-medium wp-image-1168" title="ssh_proxy_IE" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_proxy_IE-300x300.png" alt="IE 设置" width="300" height="300" /></a><p class="wp-caption-text">IE 设置</p></div>
<p>对应的命令行：</p>
<ol>
<li>plink : plink -C -N -f -D 端口号 用户名@主机名</li>
<li>ssh: ssh  -C -N -f -D 端口号 用户名@主机名</li>
</ol>
<p>PS:<br />
话两头说，如果你负责一个企业局域网的话，稍大点的企业如果要限网，SSH端口是绝对要加以限制使用的。伟大的防火墙亦是如此。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/09/%e7%94%a8ssh-tunnel%e7%a9%bf%e8%b6%8a%e9%98%b2%e7%81%ab%e5%a2%99/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>用ssh tunnel打造安全邮件系统</title>
		<link>http://www.litrin.net/2010/02/03/%e7%94%a8ssh-tunnel%e6%89%93%e9%80%a0%e5%ae%89%e5%85%a8%e9%82%ae%e4%bb%b6%e7%b3%bb%e7%bb%9f/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e7%2594%25a8ssh-tunnel%25e6%2589%2593%25e9%2580%25a0%25e5%25ae%2589%25e5%2585%25a8%25e9%2582%25ae%25e4%25bb%25b6%25e7%25b3%25bb%25e7%25bb%259f</link>
		<comments>http://www.litrin.net/2010/02/03/%e7%94%a8ssh-tunnel%e6%89%93%e9%80%a0%e5%ae%89%e5%85%a8%e9%82%ae%e4%bb%b6%e7%b3%bb%e7%bb%9f/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 14:33:01 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[桌面应用]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1156</guid>
		<description><![CDATA[近期，甚至于连Google这样的企业也感觉到了邮件系统的安全问题。这里采用了相对实现成本较低的方式，通过ssh的tunnel达到邮件在传输的过程中不会受到中间人攻击造成数据泄露。 故名思义，tunnel就是在邮件服务器和企业防火墙之后设置一条逻辑上的隧道。这条隧道一方面为了数据安全，另一方面，由于ssh的压缩功能也能在一定程度上减少邮件这类纯文本传输的网络需求。 先决条件： Unix like的邮件系统，并安装了ssh-server，本例中假定邮件服务器ip为1.2.3.4 企业路由器和内网：路由最好有vpn和防火墙功能。 内网的 一台主机，配置不必太高（我用了虚拟机，64M内存已经足够近百人使用），安装有ssh-client，如果是win主机，推荐使用putty的安装版本。经过测试，个人觉得FreeBSD下的性能较好。考虑到安全，这台主机尽量不要安装远程控制台并尽可能上锁。本例假定ip 192.168.1.1。 注意整个系统的安全策略，账户策略等，相比中间人攻击这样的“高级”黑客行为，破解密码，利用漏洞永远是成本最低的方法。 第一步：设置公钥方式登录： 内网主机上运行mkdir -p ~/.ssh;cd ~/.ssh;ssh-keygen –d，如果变态一点可以使用ssh-keygen -b 4096 -d增加强度，之后 不要输入任何信息，一律回车带过，很多人不能实现ssh的无验证通过，大多是因为这里没有弄好。这样~/.ssh目录下将会出现id_dsa 和id_dsa.pub两个文件。 将内网主机的id_dsa.pub文件拷贝邮件服务器，并在邮件服务器上执行cat id_dsa.pub &#62;&#62; ~/.ssh/authorized_keys 。尝试在内网主机上执行 ssh A主机的IP ，成功地话应该没有提示密码（即直接得到A主机的控制台）。 如果经常来小站做客的朋友会觉得这段很熟，没错它贴自这里，如果你用了windows作为内网主机，请参考这里的内容。 第二步：配置管道： 写个脚本 vi /usr/sbin/ssh_tunnel #!/bin/sh localIP='192.168.1.1' removteIP='1.2.3.4' ports='25 80 110' #3个端口，smtp http pop3 for port in $ports do /usr/bin/ssh -C -N -f -L $localIP:$port:$removteIP:$port root@$removteIP [...]]]></description>
			<content:encoded><![CDATA[<p>近期，甚至于连Google这样的企业也感觉到了邮件系统的安全问题。这里采用了相对实现成本较低的方式，通过ssh的tunnel达到邮件在传输的过程中不会受到中间人攻击造成数据泄露。</p>
<p>故名思义，tunnel就是在邮件服务器和企业防火墙之后设置一条逻辑上的隧道。这条隧道一方面为了数据安全，另一方面，由于ssh的压缩功能也能在一定程度上减少邮件这类纯文本传输的网络需求。</p>
<p>先决条件：</p>
<ol>
<li>Unix like的邮件系统，并安装了ssh-server，本例中假定邮件服务器ip为1.2.3.4</li>
<li>企业路由器和内网：路由最好有vpn和防火墙功能。</li>
<li>内网的 一台主机，配置不必太高（我用了虚拟机，64M内存已经足够近百人使用），安装有ssh-client，如果是win主机，推荐使用putty的安装版本。经过测试，个人觉得FreeBSD下的性能较好。考虑到安全，这台主机尽量不要安装远程控制台并尽可能上锁。本例假定ip 192.168.1.1。</li>
<li>注意整个系统的安全策略，账户策略等，相比中间人攻击这样的“高级”黑客行为，破解密码，利用漏洞永远是成本最低的方法。</li>
</ol>
<p><span id="more-1156"></span></p>
<div id="attachment_1161" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2010/02/ssh_tunnel.gif"><img class="size-medium wp-image-1161" title="ssh_tunnel" src="http://www.litrin.net/wp-content/uploads/2010/02/ssh_tunnel-300x115.gif" alt="SSH隧道实现安全mail" width="300" height="115" /></a><p class="wp-caption-text">SSH隧道实现安全Mail系统示意</p></div>
<p>第一步：设置公钥方式登录：</p>
<p>内网主机上运行mkdir -p ~/.ssh;cd ~/.ssh;<em>ssh-keygen –d，</em>如果变态一点可以使用ssh-keygen -b 4096 -d增加强度，之后<em> </em>不要输入任何信息，<strong>一律回车带过</strong>，很多人不能实现ssh的无验证通过，大多是因为这里没有弄好。这样~/.ssh目录下将会出现id_dsa 和id_dsa.pub两个文件。</p>
<p>将内网主机的id_dsa.pub文件拷贝邮件服务器，<strong>并在邮件服务器</strong><strong>上执行</strong><em>cat id_dsa.pub &gt;&gt; ~/.ssh/authorized_keys 。</em><strong>尝试在内网主机</strong><strong>上执行</strong> <em>ssh A</em><em>主机的IP </em>，成功地话应该没有提示密码（即直接得到A主机的控制台）。</p>
<p>如果经常来小站做客的朋友会觉得这段很熟，没错它贴自<a href="http://www.litrin.net/2007/09/29/%E6%90%AD%E5%BB%BA%E9%80%9A%E8%BF%87ssh%E5%8A%A0%E5%AF%86%E9%AA%8C%E8%AF%81%E7%9A%84rsync/" target="_blank">这里</a>，如果你用了windows作为内网主机，请参考<a href="http://www.litrin.net/2006/04/10/%E7%94%A8publickey%E9%AA%8C%E8%AF%81%E7%99%BB%E5%BD%95ssh%E6%9C%8D%E5%8A%A1%E5%99%A8/" target="_blank">这里的内容</a>。</p>
<p>第二步：配置管道：</p>
<div id="_mcePaste">写个脚本 vi /usr/sbin/ssh_tunnel</div>
<pre name=code class=bash>
#!/bin/sh
localIP='192.168.1.1'
removteIP='1.2.3.4'
ports='25 80 110' #3个端口，smtp http pop3
for port in $ports
do
    /usr/bin/ssh -C -N -f -L $localIP:$port:$removteIP:$port root@$removteIP  &#038;
done
chmod 755 /usr/sbin/ssh_tunnel
</pre>
<p>修改rc.local文件，在其中加入 /usr/sbin/ssh_tunnel，当然要放在exit那条之前。</p>
<p>windows不是很熟，写个笨蛋批处理吧ssh_tunnel.cmd</p>
<pre name=code class=bash>
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:25:1.2.3.4:25 root@1.2.3.4
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:80:1.2.3.4:80 root@1.2.3.4
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:110:1.2.3.4:110 root@1.2.3.4
</pre>
<p>其实putty的那个plink效果完全等同于ssh，当然，win下面主要是用里面的窗口程序，大多数人不怎么用而已。win下比较烦的是每次重起后都要手工加载key，执行这个批处理。希望对win熟的朋友可以提供自动解决方法。</p>
<p>第三步：设置邮件服务器防火墙</p>
<p>通过邮件服务的防火墙关闭除25和22之外的所有端口。这样做是最安全的，但这样的后果是在企业局域网之外只能发不能收邮件。VPN是比较好的折中方案。当然，如果你的邮件系统只需要内部收发邮件（那还要什么邮件系统？），你尽可以连25号也封上。</p>
<p>第四步：设置本地邮件客户端</p>
<p>将局域网内所有邮件客户端的smtp和pop都设置为192.168.1.1即可。我这里由于用了webmail，webmail同样也通过192.168.1.1访问<br />
如果企业有自己的DNS服务器，甚至整个公司都在域管理模式之下。不妨通过本地的DNS服务器用本地IP覆盖掉外网真实IP。这样即便没有vpn，只要不封邮件服务器的110端口，在邮件客户端中设置域名，对用户来说在任何地方都是透明的。</p>
<p>总结：</p>
<ul>
<li>这种模式，从邮件服务器到企业局域网内的传输是加密透明的，外部很难窃取，如果定期为两边的ssh更换强化的秘钥，效果几乎可以达到变态的要求。据说4096位的秘钥的破解成本已经到了天文数字。</li>
<li>这种方式相对成本较低，不需要太多的投入，特别是在多个分支机构之间成本优势更加突出。本想通过smtp的tls和pop的SSL进行加密，可outlook下对没有根秘证书签名的秘钥会弹出讨厌的警告框，反而增加了用户的不安。申请根证书的签名价格也不菲。</li>
<li>由于企业的邮件系统最多的邮件往往来自于内部，这种方式可以减少差不多一半以上的互联网带宽。把带宽留给更重要的应用。</li>
<li>同理，利用此种方式可以实现其他多种安全方案，达到双宿主机或者多机虚拟的效果，进而可以为企业节约宝贵的外网IP资源。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/03/%e7%94%a8ssh-tunnel%e6%89%93%e9%80%a0%e5%ae%89%e5%85%a8%e9%82%ae%e4%bb%b6%e7%b3%bb%e7%bb%9f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FreeBSD+apache+PHP+OCI支持Oracle</title>
		<link>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freebsdapachephpoci%25e6%2594%25af%25e6%258c%2581oracle</link>
		<comments>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 10:08:54 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/</guid>
		<description><![CDATA[由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。 首先，确定你已经安装好apache + php，没有安装的可以参考这里或者文学化的这里 安装php5-oci8 cd /usr/ports/database/php5-oci8 make install clean 安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。 将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下 内容大致如下： ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) 由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接 ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG 易出现的问题就是乱码了，这里要设置一下。 killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况 ee /usr/local/sbin/apachectl 在第二行加入： setenv american_america.UTF8 setenv ORACLE_HOME [...]]]></description>
			<content:encoded><![CDATA[<p>由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。</p>
<p>首先，确定你已经安装好apache + php，没有安装的可以参考<a href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/comment-page-1/#comment-1345" target="_blank">这里</a>或者文学化的<a href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">这里</a></p>
<p>安装php5-oci8</p>
<p>cd /usr/ports/database/php5-oci8<br />
make install clean</p>
<p>安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。</p>
<p>将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下<br />
内容大致如下：<span id="more-1026"></span></p>
<p>ORCL =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = ORCL)<br />
)<br />
)<br />
<!--break--><br />
由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接<br />
ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora</p>
<p>tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG<br />
易出现的问题就是乱码了，这里要设置一下。<br />
killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况<br />
ee /usr/local/sbin/apachectl<br />
在第二行加入：<br />
setenv american_america.UTF8<br />
setenv ORACLE_HOME /usr/local/oracle8-client</p>
<p>开启apache<br />
apachectl start</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于vmstat</title>
		<link>http://www.litrin.net/2009/06/04/%e5%85%b3%e4%ba%8evmstat/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2585%25b3%25e4%25ba%258evmstat</link>
		<comments>http://www.litrin.net/2009/06/04/%e5%85%b3%e4%ba%8evmstat/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 09:13:52 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1023</guid>
		<description><![CDATA[上次谈了load average ，这是一个反应CPU资源利用状况的命令。现实情况下，特别是现在CPU疯狂便宜的时代，对于一个服务器往往不见得是CPU吃紧，这次就来讲讲相对反应整体状况的vmstat命令。 以本人的Freebsd为例，其余的系统类似，直接套用就Ok了。 WWW# vmstat procs      memory      page                    disks     faults         cpu r b w     avm    fre   flt  re  pi  po    fr  sr da0 pa0   in   sy   cs us sy id 0 0 0    738M   108M   957  30  38   0  1226  72   0   0 1782  983  922  2  6 92 Procs 进程 r : 在等待执行的进程，若该项经常大于CPU线程数，说明CPU吃紧。正常情况下应该很快就能恢复为0 [...]]]></description>
			<content:encoded><![CDATA[<p>上次谈了<a rel="nofollow" target="_blank" title="Permanent Link: 关于 load average" rel="bookmark" href="../2009/03/27/%e5%85%b3%e4%ba%8e-load-average/">load average </a>，这是一个反应CPU资源利用状况的命令。现实情况下，特别是现在CPU疯狂便宜的时代，对于一个服务器往往不见得是CPU吃紧，这次就来讲讲相对反应整体状况的vmstat命令。</p>
<p>以本人的Freebsd为例，其余的系统类似，直接套用就Ok了。</p>
<p>WWW# vmstat<br />
procs      memory      page                    disks     faults         cpu<br />
r b w     avm    fre   flt  re  pi  po    fr  sr da0 pa0   in   sy   cs us sy id<br />
0 0 0    738M   108M   957  30  38   0  1226  72   0   0 1782  983  922  2  6 92<span id="more-1023"></span></p>
<p><strong>Procs 进程</strong></p>
<ul>
<li>r : 在等待执行的进程，若该项经常大于CPU线程数，说明CPU吃紧。正常情况下应该很快就能恢复为0</li>
<li>b:等待io的进程数，若经常不为0，恭喜！貌似这个问题只能迂回解决了。</li>
<li>w：可以进入运行队列但被替换的进程（强占？）</li>
</ul>
<p><strong>Memory 内存</strong></p>
<ul>
<li>avm：已用内存</li>
<li>fre:可用内存</li>
</ul>
<p><strong>page （linux表示为swap）页面文件</strong></p>
<ul>
<li>re:回收的页面</li>
<li>pi:进入页面数</li>
<li>po：出页面数，如果进出页面经常性大于0，OK买内存吧。</li>
</ul>
<p><strong>disk / io 磁盘</strong></p>
<p>没有什么复杂的，每个硬盘的读写状况</p>
<p>如果该值从未等于0，且结合proc中b较大，可以判断是哪块盘的读写问题<strong><br />
</strong></p>
<p><strong>faults / system 系统</strong></p>
<ul>
<li>in:设备中断占用的资源</li>
<li>sy：系统中断</li>
<li>cs: CPU交换<strong><br />
</strong></li>
</ul>
<p><strong>cpu</strong></p>
<ul>
<li>cs:用户进程时间</li>
<li>sy:系统进程使用的时间</li>
<li>id: idleCPU空闲时间</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/06/04/%e5%85%b3%e4%ba%8evmstat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH的x-forwarding</title>
		<link>http://www.litrin.net/2009/06/01/ssh%e7%9a%84x%ef%bc%8dforwarding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ssh%25e7%259a%2584x%25ef%25bc%258dforwarding</link>
		<comments>http://www.litrin.net/2009/06/01/ssh%e7%9a%84x%ef%bc%8dforwarding/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 06:47:23 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1013</guid>
		<description><![CDATA[记得N年前写过一篇东西，讲的是SSH的秘钥验证登录。这次就跳出命令行，讲讲X桌面的X-forwarding。 其实*nix下的桌面也是一个网络服务，可以通过SSH来远程执行。如果您使用的是Linux的桌面版，可以通过ssh的-X 或 -Y参数： litrin@litrin-laptop:~$ ssh -Y root@192.168.1.7 Last login: Mon Jun  1 14:04:47 2009 from 192.168.103.1 Sun Microsystems Inc.   SunOS 5.10      Generic January 2005 ================================================================================ 192.168.1.7       Oracle Server ================================================================================ You have new mail. # env DISPLAY=localhost:10.0 HOME=/ LANG=zh_CN.UTF-8 LOGNAME=root MAIL=/var/mail//root PATH=/usr/sbin:/usr/bin SHELL=/sbin/sh SSH_CLIENT=192.168.103.1 60802 22 SSH_CONNECTION=192.168.103.1 60802 192.168.1.7 22 SSH_TTY=/dev/pts/1 TERM=xterm TZ=PRC USER=root 如果出现了DISPLAY变量则说明配置OK，随便可以执行一个桌面程序了。 [...]]]></description>
			<content:encoded><![CDATA[<p>记得N年前写过<a href="http://www.litrin.net/2006/04/10/%e7%94%a8publickey%e9%aa%8c%e8%af%81%e7%99%bb%e5%bd%95ssh%e6%9c%8d%e5%8a%a1%e5%99%a8/" target="_blank">一篇东西</a>，讲的是SSH的秘钥验证登录。这次就跳出命令行，讲讲X桌面的X-forwarding。</p>
<p>其实*nix下的桌面也是一个网络服务，可以通过SSH来远程执行。如果您使用的是Linux的桌面版，可以通过ssh的-X 或 -Y参数：</p>
<p><span id="more-1013"></span>litrin@litrin-laptop:~$ ssh -Y root@192.168.1.7<br />
Last login: Mon Jun  1 14:04:47 2009 from 192.168.103.1<br />
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005<br />
================================================================================</p>
<p>192.168.1.7       Oracle Server</p>
<p>================================================================================<br />
You have new mail.<br />
# env<br />
<span style="text-decoration: underline;">DISPLAY=localhost:10.0</span><br />
HOME=/<br />
LANG=zh_CN.UTF-8<br />
LOGNAME=root<br />
MAIL=/var/mail//root<br />
PATH=/usr/sbin:/usr/bin<br />
SHELL=/sbin/sh<br />
SSH_CLIENT=192.168.103.1 60802 22<br />
SSH_CONNECTION=192.168.103.1 60802 192.168.1.7 22<br />
SSH_TTY=/dev/pts/1<br />
TERM=xterm<br />
TZ=PRC<br />
USER=root</p>
<p>如果出现了DISPLAY变量则说明配置OK，随便可以执行一个桌面程序了。</p>
<p style="text-align: center;">
<div id="attachment_1015" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2009/06/x-forwarding.png"><img class="size-medium wp-image-1015" title="Ubuntu下x-forwarding Solaris 的 prodreg" src="http://www.litrin.net/wp-content/uploads/2009/06/x-forwarding-300x187.png" alt="Ubuntu下x-forwarding Solaris 的 prodreg" width="300" height="187" /></a><p class="wp-caption-text">Ubuntu下x-forwarding Solaris 的 prodreg</p></div>
<p>同样的在win+putty下，可以参照如下设置：</p>
<p style="text-align: center;">
<div id="attachment_1014" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.litrin.net/wp-content/uploads/2009/06/putty_x-forward.png"><img class="size-medium wp-image-1014" title="putty x-forwarding" src="http://www.litrin.net/wp-content/uploads/2009/06/putty_x-forward-300x288.png" alt="putty x-forward" width="300" height="288" />.</a><p class="wp-caption-text">putty x-forwarding</p></div>
<p>同时，在使用putty登录之前请开启本地的X server客户端，推荐 <a rel="nofollow" target="_blank" href="http://sourceforge.net/projects/xming" target="_blank">Xming<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/06/01/ssh%e7%9a%84x%ef%bc%8dforwarding/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>搭建oracle双机热备系统</title>
		<link>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%2590%25ad%25e5%25bb%25baoracle%25e5%258f%258c%25e6%259c%25ba%25e7%2583%25ad%25e5%25a4%2587%25e7%25b3%25bb%25e7%25bb%259f</link>
		<comments>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 09:09:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=977</guid>
		<description><![CDATA[系统环境： 安装相同版本的Oracle软件，企业版而非标准版。 SUN V245 x 2; Solaris Sparc 10 up 5; Oracle 10G up 2 。 建议在之前建立两台机器间Oralce用户的ssh互信认证机制。 Oralce官方建议使用交换机连接两台主机，原因是“网卡直连容易因为网卡故障出现问题”。个人认为一根超5类或者干脆6类线直连两台主机的可以避免交换机的使用，省钱的同时也会提升传输速度。由于原本服务器还有空闲的网口，这里采用了双机直连的方式做心跳。 主数据库操作 强制数据库执行日志切换，并启动数据库归档模式 Alter database force logging; Shutdown abort; &#60;!&#8211; @page { margin: 2cm } P { margin-bottom: 0.21cm } &#8211;&#62; Startup mount; Alter database archivelog; 数据库密码文件创建 Orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** entries=5; # for WIN       orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;"><span style="font-size: small;"><strong>系统环境：</strong></span></span></p>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;">安装相同版本的<span style="font-family: AR PL UMing CN,serif;">Oracle</span>软件，企业版而非标准版。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;">SUN V245 x 2; Solaris Sparc 10 up 5; Oracle 10G up 2 </span>。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;">建议在之前建立两台机器间<span style="font-family: AR PL UMing CN,serif;">Oralce</span>用户的<span style="font-family: AR PL UMing CN,serif;">ssh</span>互信认证机制。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;">Oralce</span>官方建议使用交换机连接两台主机，原因是“网卡直连容易因为网卡故障出现问题”。个人认为一根超<span style="font-family: AR PL UMing CN,serif;">5</span>类或者干脆<span style="font-family: AR PL UMing CN,serif;">6</span>类线直连两台主机的可以避免交换机的使用，省钱的同时也会提升传输速度。由于原本服务器还有空闲的网口，这里采用了双机直连的方式做心跳。</p>
</li>
</ol>
</li>
<p><span id="more-977"></span></p>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;"><span style="font-size: small;"><strong>主数据库操作</strong></span></span></p>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">强制数据库执行日志切换，并启动数据库归档模式</span></p>
</li>
</ol>
</li>
</ol>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database force logging;</span></span></span></p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Shutdown abort;</span></span></span></p>
<p>&lt;!&#8211; @page { margin: 2cm } P { margin-bottom: 0.21cm } &#8211;&gt;</p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Startup mount;</span></span></span></p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database archivelog;</span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">数据库密码文件创建</span></p>
</li>
</ol>
</li>
</ol>
<p style="text-indent: 0.64cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** entries=5; # for WIN<br />
      <span style="color: #0000ff;">orapwd file=$ORACLE_HOME/dbs/<strong>orapw</strong>$ORACLE_SID password=****** #for Unix, 官方手册竟然没有区分</span></span></span></span></p>
<p style="text-indent: 0.64cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;"> </span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">增加<span style="font-family: Tahoma,serif;">Standby Redo Logfile</span>，建议添加</span></p>
</li>
</ol>
</li>
</ol>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database add standby logfile group 6 ‘/oradata/db/orcl/redo06.log’ size 100M;</span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改主数据库初始化参数：</span></p>
<ol type="i">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">create pfile = ””old_setting.ora”” from spfile;</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">$ORACLE_HOME/dbs/old_setting.ora</span></span></span><span style="color: #000000;">文件，增加如下内容：</span></p>
</li>
</ol>
</li>
</ol>
</li>
</ol>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.db_unique_name=””primary”” </strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_config=””DG_CONFIG=(primary,standby)””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_dest_1=””LOCATION=/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=primary””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_dest_2=””service=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES) db_unique_name=standby””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.FAL_SERVER=standby</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.FAL_CLIENT=primary</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.STANDBY_FILE_MANAGEMENT=AUTO</strong></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改主数据库<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">listener.ora</span></span></span><span style="color: #000000;">、<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">tnsnames.ora</span></span></span><span style="color: #000000;">，增加两个数据库连接设置，一个为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">primary,</span></span></span><span style="color: #000000;">一个为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Standby</span></span></span><span style="color: #000000;">，其中主数据库为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Primary</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">create spfile from pfile = ””old_setting.ora””</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">备份数据库文件</span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">创建<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Standby</span></span></span><span style="color: #000000;">数据库的控制文件<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;"><br />
startup mount;</span></span></span></p>
</li>
</ol>
</li>
</ol>
<p style="margin-left: 0.64cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database create standby controlfile as ‘standby01.ctl’;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle+Sun=?</title>
		<link>http://www.litrin.net/2009/04/21/oraclesun/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oraclesun</link>
		<comments>http://www.litrin.net/2009/04/21/oraclesun/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 00:58:52 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[开源7788]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=973</guid>
		<description><![CDATA[刚刚得到的消息，Oracle以每股$9.50的价格，总计74亿美元收购了Sun。具体官方报道 上回说到IBM的收购案，被IBM收购可以看作对SUN的一种讽刺甚至于侮辱。在一次次的谈判无果之后，忽然间传出了这么一条冷门消息。MS说明与IBM谈判是假，Oracle是真啊。 Oracle收购Sun之后，Java的悖论总算不会发生了，Oracle一直梦想的“进军操作系统”也得以实现。Sun呢？有了Oracle作为摇钱树，系统整合中又多了数据库这一块的业务。看来，我们又一次见证了另外一个IBM的诞生。 整合以后的Mysql如何？mysql作为独立的一部分业务，本身就有oracle的股份存在。同时,mysql和oracle也不存在市场竞争（最终用户是不同的） 对于此次收购本人认为对于mysql的影响不大。即便Oracle不需要Mysql，Mysql最有可能也不过就是交由社区维护，无非由一个.com变成了.org而已。 IBM在短短的一周内从玩了Sun，直到被Oracle玩；从差点消灭了一个对手，到培养起来了一个更可怕的对手。其中滋味，只有他们自己清楚。到底是风水轮流转啊。 总之，祝今后的新Oracle一路走好！]]></description>
			<content:encoded><![CDATA[<p>刚刚得到的消息，Oracle以每股$9.50的价格，总计74亿美元收购了Sun。具体<a rel="nofollow" target="_blank" href="http://www.oracle.com/sun/index.html">官方报道</a></p>
<p>上回说到<a href="http://www.litrin.net/2009/03/29/sun%e7%9a%84%e8%ba%ab%e5%89%8d%e8%ba%ab%e5%90%8e%e4%ba%8b/">IBM的收购案</a>，被IBM收购可以看作对SUN的一种讽刺甚至于侮辱。在一次次的谈判无果之后，忽然间传出了这么一条冷门消息。MS说明与IBM谈判是假，Oracle是真啊。</p>
<p><span id="more-973"></span>Oracle收购Sun之后，Java的悖论总算不会发生了，Oracle一直梦想的“进军操作系统”也得以实现。Sun呢？有了Oracle作为摇钱树，系统整合中又多了数据库这一块的业务。看来，我们又一次见证了另外一个IBM的诞生。</p>
<p>整合以后的Mysql如何？mysql作为独立的一部分业务，本身就有oracle的股份存在。同时,mysql和oracle也不存在市场竞争（最终用户是不同的） 对于此次收购本人认为对于mysql的影响不大。即便Oracle不需要Mysql，Mysql最有可能也不过就是交由社区维护，无非由一个.com变成了.org而已。</p>
<p>IBM在短短的一周内从玩了Sun，直到被Oracle玩；从差点消灭了一个对手，到培养起来了一个更可怕的对手。其中滋味，只有他们自己清楚。到底是风水轮流转啊。</p>
<p>总之，祝今后的新Oracle一路走好！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/04/21/oraclesun/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sun的身前身后事</title>
		<link>http://www.litrin.net/2009/03/29/sun%e7%9a%84%e8%ba%ab%e5%89%8d%e8%ba%ab%e5%90%8e%e4%ba%8b/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sun%25e7%259a%2584%25e8%25ba%25ab%25e5%2589%258d%25e8%25ba%25ab%25e5%2590%258e%25e4%25ba%258b</link>
		<comments>http://www.litrin.net/2009/03/29/sun%e7%9a%84%e8%ba%ab%e5%89%8d%e8%ba%ab%e5%90%8e%e4%ba%8b/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 07:28:36 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[开源7788]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=940</guid>
		<description><![CDATA[最近业界的有个传闻很引人注意，那就是IBM正在与Sun进行收购谈判。最终结果如何都是大家期待的。一代枭雄的Sun再也支撑不住，似乎大厦将倾了&#8230;&#8230; 当大家都在关注Sparc平台，Java中间件，Solaris操作系统以及一大堆应用的何去何从时，业界的另一个比较有趣的话题逐渐的浮出水面&#8211;作为Java下的应用，同时又是IBM竞争对手的Oracle和SAP是否还会继续支持Java？选择继续无疑于与虎谋皮；选择放弃Java，拜托，这么多的客户岂不是要倒戈？ 这些只是作为一些题外话，不管今后Sun怎样，不妨总结下Sun的贡献吧。 首先，在开源领域中，Sun的地位可以说是无可撼动的领头羊。目前最大的3个开源项目，分别是Sun主导的opensolaris，Sun主导的Openoffice，以及Sun主导的OpenJava。是不是感觉到了点什么？除此之外，还有Sun支持的mysql也可以说是最为常用的开源系统之一了。 系统集成上，Sun同时拥有了硬件平台，到操作系统再到桌面生产力工具和IDE。可以说目前连微软也是做不到的高度（至少MS没有自己的CPU）。唯一可以与之匹配唯独IBM这个蓝色巨人。然而一旦IBM==SUN，这又意味着什么？ Java的出现也是一大创举。过去企业要做开发，需要BS,CS,甚至于OA等多个开发团队来实现。Java的很空出世，加上Oracle和SAP的协助，对于企业平台而言，数据库之需要一个，平台只要一个，开发团队只要一个，空前的统一！ 最后，OpenSparc的标准也成为开源硬件的一大创新性尝试。 IBM方面呢？ 蓝色巨人的最大竞争对手倒下了。白捡了客户，减少了竞争对手。这世界顿时清静了。 控制了JAVA，间接的抑制了Oracle对于DB2，SAP对于Domino的市场冲击。 拿到了SPARC的研发团队，弥补了自己power平台的技术缺失。 &#8230;&#8230;&#8230;&#8230; 难道PowerPC版本的Solaris就是对于现状的预兆？ 所谓现代的经济，就是在定期和不定期的执行”破坏性创造”。输赢只在乎破坏力来自何方，来自自己，你是赢家；来自竞争对手，很遗憾，You Lose!]]></description>
			<content:encoded><![CDATA[<p>最近业界的有个传闻很引人注意，那就是IBM正在与Sun进行收购谈判。最终结果如何都是大家期待的。一代枭雄的Sun再也支撑不住，似乎大厦将倾了&#8230;&#8230;</p>
<p>当大家都在关注Sparc平台，Java中间件，Solaris操作系统以及一大堆应用的何去何从时，业界的另一个比较有趣的话题逐渐的浮出水面&#8211;作为Java下的应用，同时又是IBM竞争对手的Oracle和SAP是否还会继续支持Java？选择继续无疑于与虎谋皮；选择放弃Java，拜托，这么多的客户岂不是要倒戈？</p>
<p><span id="more-940"></span></p>
<p>这些只是作为一些题外话，不管今后Sun怎样，不妨总结下Sun的贡献吧。</p>
<p>首先，在开源领域中，Sun的地位可以说是无可撼动的领头羊。目前最大的3个开源项目，分别是Sun主导的opensolaris，Sun主导的Openoffice，以及Sun主导的OpenJava。是不是感觉到了点什么？除此之外，还有Sun支持的mysql也可以说是最为常用的开源系统之一了。</p>
<p>系统集成上，Sun同时拥有了硬件平台，到操作系统再到桌面生产力工具和IDE。可以说目前连微软也是做不到的高度（至少MS没有自己的CPU）。唯一可以与之匹配唯独IBM这个蓝色巨人。然而一旦IBM==SUN，这又意味着什么？</p>
<p>Java的出现也是一大创举。过去企业要做开发，需要BS,CS,甚至于OA等多个开发团队来实现。Java的很空出世，加上Oracle和SAP的协助，对于企业平台而言，数据库之需要一个，平台只要一个，开发团队只要一个，空前的统一！</p>
<p>最后，OpenSparc的标准也成为开源硬件的一大创新性尝试。</p>
<p>IBM方面呢？</p>
<p>蓝色巨人的最大竞争对手倒下了。白捡了客户，减少了竞争对手。这世界顿时清静了。</p>
<p>控制了JAVA，间接的抑制了Oracle对于DB2，SAP对于Domino的市场冲击。</p>
<p>拿到了SPARC的研发团队，弥补了自己power平台的技术缺失。</p>
<p>&#8230;&#8230;&#8230;&#8230;</p>
<p>难道<a href="http://www.litrin.net/2006/02/27/%e6%8b%93%e5%b1%95solaris%e7%9a%84%e4%bd%bf%e7%94%a8%e7%8e%87-sun-%e6%8a%95%e6%80%80ibm/" target="_blank">PowerPC版本的Solaris</a>就是对于现状的预兆？</p>
<p>所谓现代的经济，就是在定期和不定期的执行”破坏性创造”。输赢只在乎破坏力来自何方，来自自己，你是赢家；来自竞争对手，很遗憾，You Lose!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/03/29/sun%e7%9a%84%e8%ba%ab%e5%89%8d%e8%ba%ab%e5%90%8e%e4%ba%8b/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于 load average</title>
		<link>http://www.litrin.net/2009/03/27/%e5%85%b3%e4%ba%8e-load-average/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2585%25b3%25e4%25ba%258e-load-average</link>
		<comments>http://www.litrin.net/2009/03/27/%e5%85%b3%e4%ba%8e-load-average/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 04:43:11 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[硬件相关]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=936</guid>
		<description><![CDATA[很多人都知道uptime命令会得到如下的返回： 12:00:59 up 20:24,  1 user,  load average: 0.49, 1.40, 1.61 其中的load average根的3个数字，分别表示系统在1分钟，5分钟和15分钟的平均负载情况。这个数字是系统每5秒钟会自动检测一下活跃的进程数量（即top命令看到的n running），然后得出结果。具体感兴趣的话可以研究下Linux内核中include/linux/sched.h， kernel/timer.c，fs/proc/proc_misc.c 所谓活跃的进程，需要满足： 没有被终止或者正在调用wait。 不是正在等待I/O操作。 很多网上说这个数字除上CPU的数量如果得到的结果大于5就说明系统在超负荷运转。对于这个结论本人持保留意见。 对于双核或者多核的CPU，如果按照1个CPU来计算，那么明显的状况就是对于多核心的不公。如果按照多个CPU来计算，那又是对于多路CPU，甚至是独享内存总线多CPU的不公。对于基于HT技术的“假多核”更是如此。 对于不同平台的CPU而言，目前公认的是X86架构“不耐压”，特别在于高并发的情况下。本人明显觉得SPARC的架构相比X86在压缩同一个文件的时间更长；但是同时进行多个压缩的时候Sparc的平台占有绝对优势。 与IO关系不够紧密，很多情况下，最容易制约系统的是IO，特别是现在正处在“运算不值钱，储存值钱”的时代。 超负荷的界定：有的系统，在1.5的情况下已经能够感到明显的延时；同样有的系统在10以上还能迅速响应。]]></description>
			<content:encoded><![CDATA[<p>很多人都知道uptime命令会得到如下的返回：<br />
12:00:59 up 20:24,  1 user,  load average: 0.49, 1.40, 1.61</p>
<p>其中的load average根的3个数字，分别表示系统在1分钟，5分钟和15分钟的平均负载情况。这个数字是系统每5秒钟会自动检测一下活跃的进程数量（即top命令看到的n running），然后得出结果。具体感兴趣的话可以研究下Linux内核中include/linux/sched.h， kernel/timer.c，fs/proc/proc_misc.c</p>
<p>所谓活跃的进程，需要满足：</p>
<ul>
<li>没有被终止或者正在调用wait。</li>
<li>不是正在等待I/O操作。</li>
</ul>
<p>很多网上说这个数字除上CPU的数量如果得到的结果大于5就说明系统在超负荷运转。对于这个结论本人持保留意见。</p>
<ol>
<li>对于双核或者多核的CPU，如果按照1个CPU来计算，那么明显的状况就是对于多核心的不公。如果按照多个CPU来计算，那又是对于多路CPU，甚至是独享内存总线多CPU的不公。对于基于HT技术的“假多核”更是如此。</li>
<li>对于不同平台的CPU而言，目前公认的是X86架构“不耐压”，特别在于高并发的情况下。本人明显觉得SPARC的架构相比X86在压缩同一个文件的时间更长；但是同时进行多个压缩的时候Sparc的平台占有绝对优势。</li>
<li>与IO关系不够紧密，很多情况下，最容易制约系统的是IO，特别是现在正处在“运算不值钱，储存值钱”的时代。</li>
<li>超负荷的界定：有的系统，在1.5的情况下已经能够感到明显的延时；同样有的系统在10以上还能迅速响应。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/03/27/%e5%85%b3%e4%ba%8e-load-average/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

