<?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; Linux</title>
	<atom:link href="http://www.litrin.net/category/linux/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>Ubuntu上KVM虚拟化的部署</title>
		<link>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258akvm%25e8%2599%259a%25e6%258b%259f%25e5%258c%2596%25e7%259a%2584%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 08:38:44 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[硬件相关]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1649</guid>
		<description><![CDATA[这个KVM跟控制台切换器之类的东西一点关系没有，KVM全称Kernel-based Virtual Machine，是基于Linux核心的虚拟机。之前曾经写过基于XEN的虚拟化，最终linux世界还是没有选择XEN。KVM被正式导入Linux是在2007年的2.6.20核心上，以替代XEN，不过相对XEN来说，KVM要求CPU硬件上支持虚拟化技术，即Intel-vt或者AMD-v的支持。这对于2008年之后的机器来说几乎是标配的。对于这一个时期的CPU都一个劲的堆核心，内存也空前的便宜，硬盘也逐步到了320G起板的水平，可以大胆的玩虚拟机了！ 再此之前，还是先确认系统的CPU是否支持虚拟化： #egrep &#8216;(vmx&#124;svm)&#8217; /proc/cpuinfo 应该有返回，如果没有返回，且确认您的CPU支持虚拟化的话，建议去看看BIOS设置，大多数的主板都支持关闭此技术的。 还是以最常用的Ubuntu Server 做例子，desktop的可以直接apt-get install ubuntu-server之后，用server的核心启动。如果你全程参考本文，个人建议还是通过后一种方式来做，因为本文的过程需要X环境。 首先，设置好桥接，由于我使用的机器在远程，操作全部通过ssh，桥接的过程断开过网络。让机房重起数次之后，找到了最稳妥的方法，虽然也要断网，但好在会自己恢复。 #sudo apt-get install bridge-utils uml-utilities #vi /etc/network/intefaces auto lo iface lo inet loopback auto tap0 iface tap0 inet manual up ifconfig $IFACE 0.0.0.0 up down ifconfig $IFACE down tunctl_user root auto br0 iface br0 inet static bridge_ports eth0 tap0 address 192.168.1.3 [...]]]></description>
			<content:encoded><![CDATA[<p>这个KVM跟控制台切换器之类的东西一点关系没有，KVM全称Kernel-based Virtual Machine，是基于Linux核心的虚拟机。之前曾经写过<a title="Ubuntu上Xen的快速部署" href="http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/">基于XEN的虚拟化</a>，最终linux世界还是没有选择XEN。KVM被正式导入Linux是在2007年的2.6.20核心上，以替代XEN，不过相对XEN来说，KVM要求CPU硬件上支持虚拟化技术，即Intel-vt或者AMD-v的支持。这对于2008年之后的机器来说几乎是标配的。对于这一个时期的CPU都一个劲的堆核心，内存也空前的便宜，硬盘也逐步到了320G起板的水平，可以大胆的玩虚拟机了！</p>
<p>再此之前，还是先确认系统的CPU是否支持虚拟化：<br />
#egrep &#8216;(vmx|svm)&#8217; /proc/cpuinfo</p>
<p>应该有返回，如果没有返回，且确认您的CPU支持虚拟化的话，建议去看看BIOS设置，大多数的主板都支持关闭此技术的。</p>
<p><span id="more-1649"></span></p>
<p>还是以最常用的Ubuntu Server 做例子，desktop的可以直接apt-get install ubuntu-server之后，用server的核心启动。如果你全程参考本文，个人建议还是通过后一种方式来做，因为本文的过程需要X环境。</p>
<p>首先，设置好桥接，由于我使用的机器在远程，操作全部通过ssh，桥接的过程断开过网络。让机房重起数次之后，找到了最稳妥的方法，虽然也要断网，但好在会自己恢复。</p>
<p>#sudo apt-get install bridge-utils uml-utilities</p>
<p>#vi /etc/network/intefaces</p>
<p>auto lo<br />
iface lo inet loopback</p>
<p>auto tap0<br />
iface tap0 inet manual<br />
up ifconfig $IFACE 0.0.0.0 up<br />
down ifconfig $IFACE down<br />
tunctl_user root</p>
<p>auto br0<br />
iface br0 inet static<br />
bridge_ports eth0 tap0<br />
address 192.168.1.3<br />
netmask 255.255.255.0<br />
network 192.168.1.0<br />
broadcast 192.168.1.255<br />
gateway 192.168.1.254</p>
<p>注意这个br0，我通过前端防火墙做的DMZ通道，所以设置了内网地址。主机通过这个ip访问。所有的虚拟主机也直接设置到192.168.1.0/24网段。</p>
<p>#/etc/init.d/network restart</p>
<p>断网了，等待几分钟后网络恢复，直接ifconfig</p>
<p>br0       Link encap:Ethernet  HWaddr 02:0b:b1:f7:79:01<br />
inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0<br />
inet6 addr: fe80::b:b1ff:fef7:7901/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
RX packets:506941 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:733910 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:0<br />
RX bytes:45469237 (45.4 MB)  TX bytes:654152049 (654.1 MB)</p>
<p>eth0      Link encap:Ethernet  HWaddr e4:1f:13:95:82:cf<br />
inet6 addr: fe80::e61f:13ff:fe95:82cf/64 Scope:Link<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
RX packets:1367878 errors:0 dropped:0 overruns:0 frame:0<br />
TX packets:1541493 errors:0 dropped:0 overruns:0 carrier:0<br />
collisions:0 txqueuelen:100<br />
RX bytes:689206805 (689.2 MB)  TX bytes:1062795975 (1.0 GB)<br />
Memory:81a80000-81aa0000</p>
<p>eth0:0    Link encap:Ethernet  HWaddr e4:1f:13:95:82:cf<br />
inet addr:192.168.1.2  Bcast:0.0.0.0  Mask:0.0.0.0<br />
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />
Memory:81a80000-81aa0000</p>
<p>桥接成功！</p>
<p>相对来说，我还是比较喜欢图形化的管理工具，命令行实在太痛苦</p>
<p>#apt-get install virt-manager libvirtd kvm libvirt-bin</p>
<p>看看是否安装成功</p>
<p># ls /dev | grep kvm</p>
<p>直接用ssh通道执行gnome-session就可以连到远程桌面，执行系统工具里的“虚拟系统管理器”。添加连接中选择本地，QEMU/KVM。</p>
<p><a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/kvm-conn/" rel="attachment wp-att-1650"><img class="aligncenter size-medium wp-image-1650" title="kvm-conn" src="http://www.litrin.net/wp-content/uploads/2012/01/kvm-conn-229x300.png" alt="" width="229" height="300" /></a><a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/virt-manager/" rel="attachment wp-att-1651"><img class="aligncenter size-medium wp-image-1651" title="virt-manager" src="http://www.litrin.net/wp-content/uploads/2012/01/virt-manager-292x300.png" alt="" width="292" height="300" /></a>然后建立新的虚拟主机，个人觉得这块跟用VM之类的工具没有什么区别了，直接跳过了。不过在第五步的时候，请将网卡设置为桥接设备，除非仅仅用于NAT方式联网。<a href="http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/kvm-net/" rel="attachment wp-att-1652"><img class="aligncenter size-medium wp-image-1652" title="kvm-net" src="http://www.litrin.net/wp-content/uploads/2012/01/kvm-net-199x300.png" alt="" width="199" height="300" /></a></p>
<p>需要注意的是，如果你跟我一样通过远程连接，直接打开主机的控制台的时候，键盘会不听使唤。这不是切换键盘设置可以搞定的问题，我尝试过不同的X客户端和操作系统，涵盖了windows mac linux，全都如此。只能认为是一个bug。我的最终解决方法是通过ssh通道，将远程主机的5900 VNC端口转接回本地，然后再通过vnc客户端连接本地才得以通过，键盘的问题得以解决。很傻，如果你有更好的方式，敬请赐教了！</p>
<p>照旧建立一个虚拟主机，我还是选择了Ubuntu Server 1110 64bit，也没有什么好说的。安装好之后，配置好了ssh。从此就可以直接抛弃vnc和宿主主机的X访问了。</p>
<p>在虚拟主机上安装定制的内核:</p>
<p>#apt-get install kernel-virtual</p>
<p>重起的速度那是嗖嗖的！直接lsmod发觉真的是定制内核，和标准的server内核比起来一点多余的没有：</p>
<p>root@www:~# lsmod<br />
Module                  Size  Used by<br />
psmouse                73882  0<br />
serio_raw              13166  0<br />
lp                     17799  0<br />
parport                46562  1 lp<br />
8139too                32177  0<br />
8139cp                 27412  0</p>
<p>对比一下性能吧，还是<a title="Ctypes实现“C重构”" href="http://www.litrin.net/2012/01/04/ctypes%e5%ae%9e%e7%8e%b0c%e9%87%8d%e6%9e%84/">那道题目</a>的python原版，稍作优化：</p>
<p>虚拟机：</p>
<p>root@www:/home/litrin# python TimeCost.py<br />
10240<br />
Cost: 0.508388996124<br />
root@www:/home/litrin# python TimeCost.py<br />
10240<br />
Cost: 0.507208108902<br />
root@www:/home/litrin#</p>
<p>宿主机：</p>
<p>root@vserver:~# python TimeCost.py<br />
10240<br />
Cost: 4.35039806366<br />
root@vserver:~# python TimeCost.py<br />
10240<br />
Cost: 4.35194683075</p>
<p>我开始真的不知道该如何解释。虚拟机的性能竟然强于宿主机。后来检查了python的版本才明白，宿主是py2.6而客户机是2.7，版本不同，性能有差距，但可以肯定的是，从这一点上来说虚拟化的性能损失不大。</p>
<p>最后一步，去掉虚拟机上不需要的东西，精简主义者！</p>
<p>这次就直接用宿主的命令行操作吧：</p>
<p>#virsh</p>
<p>virsh # list<br />
Id Name                 State<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
30 www.litrin.net       running //我的虚拟主机名为www.litrin.net，请注意！</p>
<p>virsh # edit www.litrin.net</p>
<p>删掉vnc, pty, mouse, graphic</p>
<p>virsh # destroy www.litrin.net</p>
<p>virsh # start www.litrin.net</p>
<p>这里有一个问题也凸现，就是无法使用宿主机的reboot和halt命令，只能强行的destroy。</p>
<p>你同时还可以配合DHCP和主机克隆，大规模快速甚至自动化的架设多个虚拟机，本文不再探讨。</p>
<p>尽管现在“云”已经被用滥了，搞个虚拟机就敢号称云托管的大有人在。个人觉得其实对于少数几台主机的虚拟化来说，更多的是节约机房的托管费用和主机成本，这对于稍微大一点的项目并没有什么太多的优势。如果配合上open stack之类的故障平滑迁移技术才是虚拟化方案的终极利器。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2012/01/20/ubuntu%e4%b8%8akvm%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从Redis的数据丢失说起</title>
		<link>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bb%258eredis%25e7%259a%2584%25e6%2595%25b0%25e6%258d%25ae%25e4%25b8%25a2%25e5%25a4%25b1%25e8%25af%25b4%25e8%25b5%25b7</link>
		<comments>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 02:35:21 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[Redis]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1611</guid>
		<description><![CDATA[碰到一个悲催的事情：一台Redis服务器，4核，16G内存且没有任何硬件上的问题。持续高压运行了大约3个月，保存了大约14G的数据，设置了比较完备的Save参数。而就是这台主机，在一次重起之后，丢失了大量的数据，14G的数据最终只恢复了几百兆而已。 正常情况下，像Redis这样定期回写磁盘的内存数据库，丢失几个数据也是在情理之中，可超过80%数据丢失率实在太离谱。排除了误操作的可能性之后，开始寻找原因。 &#160; 重启动时的日志： [26641] 21 Dec 09:46:34 * Slave ask for synchronization [26641] 21 Dec 09:46:34 * Starting BGSAVE for SYNC [26641] 21 Dec 09:46:34 # Can&#8217;t save in background: fork: Cannot allocate memory [26641] 21 Dec 09:46:34 * Replication failed, can&#8217;t BGSAVE [26641] 21 Dec 09:46:34 # Received SIGTERM, scheduling shutdown&#8230; [26641] 21 [...]]]></description>
			<content:encoded><![CDATA[<p>碰到一个悲催的事情：一台Redis服务器，4核，16G内存且没有任何硬件上的问题。持续高压运行了大约3个月，保存了大约14G的数据，设置了比较完备的Save参数。而就是这台主机，在一次重起之后，丢失了大量的数据，14G的数据最终只恢复了几百兆而已。</p>
<p>正常情况下，像Redis这样定期回写磁盘的内存数据库，丢失几个数据也是在情理之中，可超过80%数据丢失率实在太离谱。排除了误操作的可能性之后，开始寻找原因。</p>
<p><span id="more-1611"></span></p>
<p>&nbsp;</p>
<p>重启动时的日志：</p>
<p><strong>[26641] 21 Dec 09:46:34 * Slave ask for synchronization</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 * Starting BGSAVE for SYNC</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # <span style="color: #ff0000;">Can&#8217;t save in background: fork: Cannot allocate memory</span></strong></p>
<p><strong>[26641] 21 Dec 09:46:34 * Replication failed, can&#8217;t BGSAVE</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # Received SIGTERM, scheduling shutdown&#8230;</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # User requested shutdown&#8230;</strong></p>
<p>很明显的一个问题，系统不能在后台保存，fork进程失败。</p>
<p>翻查了几个月的日志，发觉系统在频繁报错：</p>
<p><strong>[26641] 18 Dec 04:02:14 * 1 changes in 900 seconds. Saving&#8230;</strong></p>
<p><strong>[26641] 18 Dec 04:02:14 #<span style="color: #ff0000;"> Can&#8217;t save in background: fork: Cannot allocate memory</span></strong></p>
<p>系统不能在后台保存，fork进程时无法指定内存。</p>
<p>对源码进行跟踪，在src/rdb.c中定位了这个报错：</p>
<pre class="cpp">int rdbSaveBackground(char *filename) {
    pid_t childpid;
    long long start;

    if (server.bgsavechildpid != -1) return REDIS_ERR;
    if (server.vm_enabled) waitEmptyIOJobsQueue();
    server.dirty_before_bgsave = server.dirty;
    start = ustime();
    if ((childpid = fork()) == 0) {
        /* Child */
        if (server.vm_enabled) vmReopenSwapFile();
        if (server.ipfd &gt; 0) close(server.ipfd);
        if (server.sofd &gt; 0) close(server.sofd);
        if (rdbSave(filename) == REDIS_OK) {
            _exit(0);
        } else {
            _exit(1);
        }
    } else {
        /* Parent */
        server.stat_fork_time = ustime()-start;
        if (childpid == -1) {
            redisLog(REDIS_WARNING,"Can't save in background: fork: %s",
                strerror(errno));
            return REDIS_ERR;
        }
        redisLog(REDIS_NOTICE,"Background saving started by pid %d",childpid);
        server.bgsavechildpid = childpid;
        updateDictResizePolicy();
        return REDIS_OK;
    }
    return REDIS_OK; /* unreached */
}</pre>
<p>数据丢失的问题总算搞清楚了！</p>
<p>Redis的数据回写机制分同步和异步两种，</p>
<ol>
<li>同步回写即SAVE命令，主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间，所以一般不是推荐的。</li>
<li>异步回写即BGSAVE命令，主进程fork后，复制自身并通过这个新的进程回写磁盘，回写结束后新进程自行关闭。由于这样做不需要主进程阻塞，系统不会假死，一般默认会采用这个方法。</li>
</ol>
<p>个人感觉方法２采用fork主进程的方式很拙劣，但似乎是唯一的方法。内存中的热数据随时可能修改，要在磁盘上保存某个时间的内存镜像必须要冻结。冻结就会导致假死。fork一个新的进程之后等于复制了当时的一个内存镜像，这样主进程上就不需要冻结，只要子进程上操作就可以了。</p>
<p>在小内存的进程上做一个fork,不需要太多资源，但当这个进程的内存空间以Ｇ为单位时，fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢？肯定会报内存无法分配的。更可气的是，越是改动频繁的主机上fork也越频繁，fork操作本身的代价恐怕也不会比假死好多少。</p>
<p>找到原因之后，直接修改内核参数vm.overcommit_memory = 1</p>
<p>Linux内核会根据参数vm.overcommit_memory参数的设置决定是否放行。</p>
<ol>
<li> 如果 vm.overcommit_memory = 1，直接放行</li>
<li>vm.overcommit_memory = 0：则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap，决定是否放行。</li>
<li>vm.overcommit_memory = 2：则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap，决定是否放行。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;xterm-256color&#8217;: unknown terminal type.</title>
		<link>http://www.litrin.net/2011/10/06/xterm-256color-unknown-terminal-type/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=xterm-256color-unknown-terminal-type</link>
		<comments>http://www.litrin.net/2011/10/06/xterm-256color-unknown-terminal-type/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 07:53:22 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1573</guid>
		<description><![CDATA[把我的Mac pro升级到Lion之后，照旧通过终端ssh连接到了Ubuntu Server。其他的命令操作均无异常，只是在习惯性的输入了top命令之后，系统没有正常启动top界面，反而出现如下的提示： root@www:~# top &#8216;xterm-256color&#8217;: unknown terminal type. 然而在Centos的主机下却不会出现问题。 说起终端的类型，尽管现在的终端大多都是一个PC而已，事实上在N多年前，终端类型可能仅仅只是体现了厂商的品牌而已，不同的终端类型多如牛毛。他们对于光标、控制字符以及颜色的定义相互都不兼容，历史遗留的问题了。包括之前也发觉很多主机商“backspace”键无效，必须使用ctrl+h进行退格的问题。 在Mac的终端下操作： LitrindeMacBook-Pro:~ litrin$ echo $TERM vt100 LitrindeMacBook-Pro:~ litrin$ infocmp vt100 # Reconstructed via infocmp from file: /usr/share/terminfo/76/vt100 vt100&#124;vt100-am&#124;dec vt100 (w/advanced video), am, mc5i, msgr, xenl, xon, cols#80, it#8, lines#24, vt#3, acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{&#124;&#124;}}~~, bel=^G, blink=\E[5m$&#60;2&#62;, bold=\E[1m$&#60;2&#62;, clear=\E[H\E[J$&#60;50&#62;, cr=^M, csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C$&#60;2&#62;, cup=\E[%i%p1%d;%p2%dH$&#60;5&#62;, [...]]]></description>
			<content:encoded><![CDATA[<p>把我的Mac pro升级到Lion之后，照旧通过终端ssh连接到了Ubuntu Server。其他的命令操作均无异常，只是在习惯性的输入了top命令之后，系统没有正常启动top界面，反而出现如下的提示：<br />
root@www:~# top<br />
&#8216;xterm-256color&#8217;: unknown terminal type.<br />
然而在Centos的主机下却不会出现问题。</p>
<p><span id="more-1573"></span></p>
<p>说起终端的类型，尽管现在的终端大多都是一个PC而已，事实上在N多年前，终端类型可能仅仅只是体现了厂商的品牌而已，不同的终端类型多如牛毛。他们对于光标、控制字符以及颜色的定义相互都不兼容，历史遗留的问题了。包括之前也发觉很多主机商“backspace”键无效，必须使用ctrl+h进行退格的问题。</p>
<p>在Mac的终端下操作：</p>
<pre>LitrindeMacBook-Pro:~ litrin$ echo $TERM
vt100</pre>
<pre>LitrindeMacBook-Pro:~ litrin$ infocmp vt100
#	Reconstructed via infocmp from file: /usr/share/terminfo/76/vt100
vt100|vt100-am|dec vt100 (w/advanced video),
	am, mc5i, msgr, xenl, xon,
	cols#80, it#8, lines#24, vt#3,
	acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
	bel=^G, blink=\E[5m$&lt;2&gt;, bold=\E[1m$&lt;2&gt;,
	clear=\E[H\E[J$&lt;50&gt;, cr=^M, csr=\E[%i%p1%d;%p2%dr,
	cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
	cuf=\E[%p1%dC, cuf1=\E[C$&lt;2&gt;,
	cup=\E[%i%p1%d;%p2%dH$&lt;5&gt;, cuu=\E[%p1%dA,
	cuu1=\E[A$&lt;2&gt;, ed=\E[J$&lt;50&gt;, el=\E[K$&lt;3&gt;, el1=\E[1K$&lt;3&gt;,
	enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=^J, ka1=\EOq,
	ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
	kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
	kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
	kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, lf1=pf1, lf2=pf2,
	lf3=pf3, lf4=pf4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8,
	rev=\E[7m$&lt;2&gt;, ri=\EM$&lt;5&gt;, rmacs=^O, rmam=\E[?7l,
	rmkx=\E[?1l\E&gt;, rmso=\E[m$&lt;2&gt;, rmul=\E[m$&lt;2&gt;,
	rs2=\E&gt;\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
	sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$&lt;2&gt;,
	sgr0=\E[m\017$&lt;2&gt;, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
	smso=\E[7m$&lt;2&gt;, smul=\E[4m$&lt;2&gt;, tbc=\E[3g,</pre>
<p>说明了主机的默认终端类型正是导致出现问题的“xterm-256color”，对于每一种终端的定义，需要在terminfo文件中定义，Mac下这个文件保存在/usr/share/terminfo/目录下，而这个故障出现的最终原因是Ubuntu或者说Debian系的Linux默认没有xterm-256color终端的定义，而Lion操作系统升级之后，默认的终端类型从之前的vt100变成了xterm-color。</p>
<p>扯了这么多，解决方案有两种，都很简单：</p>
<ol>
<li>让server端支持xterm-256color：apt-get install ncurses-term，安装终端支持。</li>
<li>在Mac下终端的“偏好设置”，“设置”选项卡，“高级”选项，“声明终端为：”修改为“xterm-color”或者其他的类型，看个人喜好了。</li>
</ol>
<p>个人推荐还是采用方法2解决，此外，你也可以通过定义其他类型的终端，解决其他类似的问题。</p>
<p>&nbsp;</p>
<p><span style="font-family: Arial, Helvetica, sans-serif; color: #ffffff; background-color: #000000;">2011－10－05（<strong>PST</strong>）来自：<a rel="nofollow" target="_blank" style="color: #ffffff;" href="http://zh.wikipedia.org/wiki/史蒂夫·乔布斯">乔布斯</a>的MacBook Pro</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/10/06/xterm-256color-unknown-terminal-type/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用linux的/dev/shm</title>
		<link>http://www.litrin.net/2011/09/30/%e4%bd%bf%e7%94%a8linux%e7%9a%84devshm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bd%25bf%25e7%2594%25a8linux%25e7%259a%2584devshm</link>
		<comments>http://www.litrin.net/2011/09/30/%e4%bd%bf%e7%94%a8linux%e7%9a%84devshm/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 07:30:34 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1570</guid>
		<description><![CDATA[挖掘一个很久之前的设想，06年的，之前的想法是用tmpfs，tmpfs是RAM和磁盘swap的混杂机制，大部分的情况是优先使用内存空间，尽管本质上是非持久存储，但性能上远不是磁盘甚至固态硬盘所能企及的。而且现在是内存空前便宜的时代，类似的方案例如memcache等，变得更有价值了。 默认的Linux发行版中的内核配置都会开启tmpfs，映射到了/dev/下的shm目录。可以通过df 命令查看结果如下： Filesystem Size Used Avail Use% Mounted on /dev/sda1 146G 14G 125G 10% / varrun 501M 84K 501M 1% /var/run varlock 501M 0 501M 0% /var/lock udev 501M 32K 501M 1% /dev devshm 501M 0 501M 0% /dev/shm 默认配置的shm分区正好是内存的一半。 可以重新调整大小： vi /etc/fstab tmpfs /dev/shm tmpfs defaults,size=4096M 0 0 umount /dev/shm; mount /dev/shm 不同于文件系统/dev/shm不是一个文件，是一个目录，完全可以通过文件链接的方式挂装到指定目录，还是推荐采用mount方式： [...]]]></description>
			<content:encoded><![CDATA[<p>挖掘一个<a title="关于使用tmpfs优化的设想" href="http://www.litrin.net/2006/06/21/%e5%85%b3%e4%ba%8e%e4%bd%bf%e7%94%a8tmpfs%e4%bc%98%e5%8c%96%e7%9a%84%e8%ae%be%e6%83%b3/">很久之前的设想</a>，06年的，之前的想法是用tmpfs，tmpfs是RAM和磁盘swap的混杂机制，大部分的情况是优先使用内存空间，尽管本质上是非持久存储，但性能上远不是磁盘甚至固态硬盘所能企及的。而且现在是内存空前便宜的时代，类似的方案例如memcache等，变得更有价值了。</p>
<p>默认的Linux发行版中的内核配置都会开启tmpfs，映射到了/dev/下的shm目录。可以通过df 命令查看结果如下：</p>
<pre>Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             146G   14G  125G  10% /
varrun                501M   84K  501M   1% /var/run
varlock               501M     0  501M   0% /var/lock
udev                  501M   32K  501M   1% /dev
devshm                501M     0  501M   0% /dev/shm</pre>
<p><span id="more-1570"></span></p>
<p>默认配置的shm分区正好是内存的一半。</p>
<p>可以重新调整大小：</p>
<p>vi /etc/fstab<br />
tmpfs /dev/shm tmpfs defaults,size=4096M 0 0</p>
<p>umount /dev/shm; mount /dev/shm</p>
<p>不同于文件系统/dev/shm不是一个文件，是一个目录，完全可以通过文件链接的方式挂装到指定目录，还是推荐采用mount方式：</p>
<p>mount &#8211;bind /dev/shm /data</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/09/30/%e4%bd%bf%e7%94%a8linux%e7%9a%84devshm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Hadoop的单机部署</title>
		<link>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hadoop%25e7%259a%2584%25e5%258d%2595%25e6%259c%25ba%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 13:23:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1528</guid>
		<description><![CDATA[&#160; 要说最近最热的云计算，不得不提Hadoop。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。 这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。 既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下： echo “deb http://archive.canonical.com/ natty partner” &#62;&#62; /etc/apt/sources.list #添加源 apt-get update apt-get install sun-java-jdk 文件多而大，耐心等待。 基础环境 默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后， echo "/usr/lib/jvm/java-6-sun"  &#62; /etc/jvm 官方建议关闭ipv6，尽管我不清楚有什么影响 echo "blacklist ipv6" &#62;&#62; /etc/modprobe.d/blacklist 建立用户/组，没什么要解释的 addgroup hadoop adduser --ingroup hadoop hadoop 修改环境变量，vi /etc/bash.bashrc，在末尾添加： export JAVA_HOME=/usr/lib/jvm/java-6-sun export JDK_HOME=$JAVA_HOME export PATH=$PATH:$JAVA_HOME/bin 切换用户到hadoop, su &#8211; hadoop 调通ssh，具体参见这里之前的东西。 mkdir [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>要说最近最热的云计算，不得不提<a rel="nofollow" target="_blank" href="http://hadoop.apache.org" target="_blank">Hadoop</a>。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。</p>
<p>这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。</p>
<p>既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下：</p>
<p><span id="more-1528"></span><br />
echo “deb http://archive.canonical.com/ natty partner” &gt;&gt; /etc/apt/sources.list #添加源<br />
apt-get update<br />
apt-get install sun-java-jdk</p>
<p>文件多而大，耐心等待。</p>
<p><strong>基础环境</strong></p>
<p><strong></strong>默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后，</p>
<pre>echo "/usr/lib/jvm/java-6-sun"  &gt; /etc/jvm</pre>
<p>官方建议关闭ipv6，尽管我不清楚有什么影响</p>
<pre>echo "blacklist ipv6" &gt;&gt; /etc/modprobe.d/blacklist</pre>
<p>建立用户/组，没什么要解释的</p>
<pre>addgroup hadoop
adduser --ingroup hadoop hadoop</pre>
<p>修改环境变量，vi /etc/bash.bashrc，在末尾添加：</p>
<pre>export JAVA_HOME=/usr/lib/jvm/java-6-sun
export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin</pre>
<p>切换用户到hadoop, su &#8211; hadoop</p>
<p>调通ssh，具体参见<a title="用publickey验证登录SSH服务器" 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>
<pre>mkdir .ssh
cd .ssh
ssh-keygen -t rsa
cat id_rsa.pub &gt;&gt; authorized_keys
ssh localhost</pre>
<p><strong>配置Hadoop</strong></p>
<p>我默认已经使用hadoop用户进行操作，root权限可以不用了。</p>
<p>将下载后的hadoop保存在适当的目录下，我选择了/opt/hadoop目录。</p>
<p>修改/opt/hadoop/conf/hadoop-env.sh文件中，添加 export JAVA_HOME=/usr/lib/jvm/java-6-sun</p>
<p>cd /opt/hadoop/conf 一堆的配置文件要改。</p>
<p>conf/core-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;fs.default.name&lt;/name&gt;&lt;!--文件系统名称--&gt;
        &lt;!--&lt;value&gt;hdfs://localhost:9000&lt;/value&gt;单机，不使用集群文件系统 --&gt;&lt;value&gt;/date/hadoop&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/hdfs-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;dfs.replication&lt;/name&gt;
         &lt;value&gt;1&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/mapred-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;mapred.job.tracker&lt;/name&gt;
         &lt;value&gt;localhost:9001&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>需要注意的是，不同的版本号之间，配置方式有细微的不同。</p>
<p>配置OK!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux 3</title>
		<link>http://www.litrin.net/2011/08/17/linux-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux-3</link>
		<comments>http://www.litrin.net/2011/08/17/linux-3/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 09:15:24 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1523</guid>
		<description><![CDATA[最近Linux更新到了3.x的版本，彻底抛弃了2.x。赶着这波热乎劲，把系统内核升级到了3.0.2。贴个uname -a炫耀下： Linux www 3.0.13.0.1 #2 SMP Wed Aug 17 16:05:25 CST 2011 x86_64 x86_64 x86_64 GNU/Linux 作为debian系的Ubuntu，相对制作kernel包还是比较容易的。 wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.2.tar.bz2 apt-get install build-essential kernel-package tar vzxf  linux-3.0.2.tar.bz2 cd linux-3.0.2 make menuconfig make-kpkg &#8211;initrd  kernel_image kernel-headers 漫长的编译之后上层目录会出现 linux-headers-* 和linux-image-*连个包，直接dpkg -i 就OK了，很方便。 话说回来，这次2-&#62;3的升级有点不知所云，没有什么较大的新特性的引入，仅仅是Linus大神认为的2.6.39的版本号太大了。也不知道今后linux是否还延续“单数不稳定的传统”。相比2.2-&#62;2.4, 2.4-&#62;2.6的跨越，反而成了讽刺。]]></description>
			<content:encoded><![CDATA[<p>最近Linux更新到了3.x的版本，彻底抛弃了2.x。赶着这波热乎劲，把系统内核升级到了3.0.2。贴个uname -a炫耀下：</p>
<pre>Linux www 3.0.13.0.1 #2 SMP Wed Aug 17 16:05:25 CST 2011 x86_64 x86_64 x86_64 GNU/Linux</pre>
<p><span id="more-1523"></span>作为debian系的Ubuntu，相对制作kernel包还是比较容易的。</p>
<p>wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.2.tar.bz2</p>
<p>apt-get install build-essential kernel-package</p>
<p>tar vzxf  linux-3.0.2.tar.bz2</p>
<p>cd linux-3.0.2</p>
<p>make menuconfig</p>
<p>make-kpkg &#8211;initrd  kernel_image kernel-headers</p>
<p>漫长的编译之后上层目录会出现 linux-headers-* 和linux-image-*连个包，直接dpkg -i 就OK了，很方便。</p>
<p>话说回来，这次2-&gt;3的升级有点不知所云，没有什么较大的新特性的引入，仅仅是Linus大神认为的2.6.39的版本号太大了。也不知道今后linux是否还延续“单数不稳定的传统”。相比2.2-&gt;2.4, 2.4-&gt;2.6的跨越，反而成了讽刺。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/08/17/linux-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>定制deb安装包</title>
		<link>http://www.litrin.net/2011/06/11/%e5%ae%9a%e5%88%b6deb%e5%ae%89%e8%a3%85%e5%8c%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%25ae%259a%25e5%2588%25b6deb%25e5%25ae%2589%25e8%25a3%2585%25e5%258c%2585</link>
		<comments>http://www.litrin.net/2011/06/11/%e5%ae%9a%e5%88%b6deb%e5%ae%89%e8%a3%85%e5%8c%85/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 06:44:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1486</guid>
		<description><![CDATA[选择一个合适的Linux发行版的重要因素就是是否有足够丰富的软件以及软件的维护是否方便。对于正常情况下的使用，Ubuntu继承自Debian系的deb已经可以满足，部分情况下还是无法摆脱需要编译安装的情况。对于有点洁癖的管理员，或者需要大规模部署的情况，每台机器的编译显然不现实，于是就需要定制deb包。 本文以Ubuntu下的操作为例，同样适用于Debian。 修改现有deb包 这种情况往往是现有的deb包已经满足使用，只是需要修改部分文件，例如批量部署apache服务器而不希望每台主机上去修改配置。 下载现有的deb包：可以直接从安装源中找到需要的deb文件，或者通过网易的镜像站 http://mirrors.163.com/ubuntu/pool/ 解包： dpkg -X apache2-common_2.0.55-4ubuntu2.13_i386.deb apache2 ＃将apache2的包解压 修改配置 cd apache2 这样，你会看到apache2目录下的文件结构很眼熟，跟安装后的文件存放路径完全一致。你可以根据需要修改对应的文件。 提取配置文件 dpkg -e ../dpkg -X apache2-common_2.0.55-4ubuntu2.13_i386.deb 会多出一个DEBIAN目录，决定了部分安装参数，同样也可以定制修改。 重新封包 cd .. dpkg -b apache2 myApache2.deb 安装测试 dpkg -i myApache2.deb 通过deb-source制作deb包 这种方式往往是需要为原有的包进行小幅度优化，例如修改nginx软件的header识别信息，并适用-O3参数重新编译。 获取source包 mkdir nginx cd nginx apt-get source nginx  ＃等待下载 修改代码 下载完成后会出现一个nginx*的目录，既是nginx的源码，如果需要修改，则直接进入该目录下修改源码。例如我修改src/core/nginx.h，定制了nginx的头部信息。 修改编译信息 源码目录下，相比直接在nginx官网下载的会增加几个目录，其中debian目录下就是deb包特有的配置。修改方式可以参考上种方式。 debian/rules是一个可执行文件，直接编辑可以修改。例如我直接将头部的CFLAGS += -O2 变态的修改为 CFLAGS += -O3 -msse3 -mmmx -maccumulate-outgoing-args（没有经过测试，仅作为示例） [...]]]></description>
			<content:encoded><![CDATA[<p>选择一个合适的Linux发行版的重要因素就是是否有足够丰富的软件以及软件的维护是否方便。对于正常情况下的使用，Ubuntu继承自Debian系的deb已经可以满足，部分情况下还是无法摆脱需要编译安装的情况。对于有点洁癖的管理员，或者需要大规模部署的情况，每台机器的编译显然不现实，于是就需要定制deb包。</p>
<p>本文以Ubuntu下的操作为例，同样适用于Debian。</p>
<p><span id="more-1486"></span></p>
<p><strong>修改现有deb包</strong></p>
<p>这种情况往往是现有的deb包已经满足使用，只是需要修改部分文件，例如批量部署apache服务器而不希望每台主机上去修改配置。</p>
<ol>
<li>下载现有的deb包：可以直接从安装源中找到需要的deb文件，或者通过网易的镜像站 <a rel="nofollow" target="_blank" href="http://mirrors.163.com/ubuntu/pool/">http://mirrors.163.com/ubuntu/pool/<br />
</a></li>
<li>解包：<br />
dpkg -X <a rel="nofollow" target="_blank" href="http://mirrors.163.com/ubuntu/pool/main/a/apache2/apache2-common_2.0.55-4ubuntu2.13_i386.deb">apache2-common_2.0.55-4ubuntu2.13_i386.deb</a> apache2 ＃将apache2的包解压</li>
<li>修改配置<br />
cd apache2<br />
这样，你会看到apache2目录下的文件结构很眼熟，跟安装后的文件存放路径完全一致。你可以根据需要修改对应的文件。</li>
<li>提取配置文件<br />
dpkg -e ../dpkg -X <a rel="nofollow" target="_blank" href="http://mirrors.163.com/ubuntu/pool/main/a/apache2/apache2-common_2.0.55-4ubuntu2.13_i386.deb">apache2-common_2.0.55-4ubuntu2.13_i386.deb</a><br />
会多出一个DEBIAN目录，决定了部分安装参数，同样也可以定制修改。</li>
<li>重新封包<br />
cd ..<br />
dpkg -b apache2 myApache2.deb</li>
<li>安装测试<br />
dpkg -i myApache2.deb</li>
</ol>
<p><strong>通过deb-source制作deb包</strong></p>
<p>这种方式往往是需要为原有的包进行小幅度优化，例如修改nginx软件的header识别信息，并适用-O3参数重新编译。</p>
<ol>
<li>获取source包<br />
mkdir nginx<br />
cd nginx<br />
apt-get source nginx  ＃等待下载</li>
<li>修改代码<br />
下载完成后会出现一个nginx*的目录，既是nginx的源码，如果需要修改，则直接进入该目录下修改源码。例如我修改src/core/nginx.h，定制了nginx的头部信息。</li>
<li>修改编译信息<br />
源码目录下，相比直接在nginx官网下载的会增加几个目录，其中debian目录下就是deb包特有的配置。修改方式可以参考上种方式。<br />
debian/rules是一个可执行文件，直接编辑可以修改。例如我直接将头部的CFLAGS += -O2 变态的修改为 CFLAGS += -O3 -msse3 -mmmx -maccumulate-outgoing-args（没有经过测试，仅作为示例）</li>
<li>准备编译环境和依赖包<br />
apt-get install dpkg-buildpackage<br />
下载打包工具<br />
apt-get build-dep nginx<br />
很多情况下不能完成编译就是因为没有执行这一步</li>
<li>重新打包<br />
dpkg-buildpackage -uc -d<br />
完成后上一级目录将会出现一个或多个deb文件，视情况而定安装测试。</li>
</ol>
<p><strong>源码制作deb</strong></p>
<p>这种方法相对比较少见了，事实上前两种方法几乎已经解决了80％的应用，即便没有对应的Ubuntu包，也可以从丰富的Debian库中找到合适的deb，这种情况只有少数项目才会需要，例如安装 支持中文分词的索引服务器<a rel="nofollow" target="_blank" href="http://www.coreseek.com/">coreseek</a>。</p>
<ol>
<li>下载，解压源码<br />
wget http://&#8230;<br />
tar &#8230;.<br />
这一步没什么说的，下载，解压而已。</li>
<li>预编译<br />
./configure &#8230;<br />
make<br />
也没什么特殊的，参考官方安装手册的操作</li>
<li>打包<br />
apt-get install checkinstall #下载打包工具<br />
checkinstall -D -y -install=no -default make install<br />
一定记得要测试一下，相比前两种方法出错概率较高。</li>
</ol>
<p>&nbsp;</p>
<p>看到网上很多安装教程都是编译安装的，抱着“没有必要重新发明轮子”的原则，我还是建议尽量使用deb的方式安装。同时建议社区尽可能的提供rpm和deb等安装包，在方便用户的同时同样也有利于产品的优化。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/06/11/%e5%ae%9a%e5%88%b6deb%e5%ae%89%e8%a3%85%e5%8c%85/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>Ubuntu的AppArmor引发的Mysql问题</title>
		<link>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e7%259a%2584apparmor%25e5%25bc%2595%25e5%258f%2591%25e7%259a%2584mysql%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Fri, 08 Apr 2011 02:56:29 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1430</guid>
		<description><![CDATA[这些天一台ubuntu server的mysql数据目录/var/lib/mysql所在分区快用光了，于是想把Mysql的数据目录移到一个相对空闲的分区下，直接修改了my.cnf中的配置，系统提示无法启动Mysql。又自做聪明的使用了链接文件访问，仍然无效。完全排除了所有linux文件系统权限的可能之后，我回忆起了之前在Redhat系操作系统上发生过的SeLinux导致的类似问题。看了一下官档，果然！Ubuntu在710之后，增加了一个类似于Selinux的权限控制服务叫做AppArmor，名字就很有意思：应用铠甲，让我想起了Diablo2中的暗金⋯⋯ 首先，解决那个Mysql的问题： #sudo nano /etc/apparmor.d/usr.sbin.mysqld ＃好吧，我承认，我sudo出了习惯 发现了有两行配置： /home/mysql/ r, /home/mysql/** rwk, 修改掉 /data/mysql/ r, /data/mysql/** rwk, 重启AppArmor /etc/init.d/apparmor reload 重启Mysql，一切OK! 当然你可以直接关闭apparmor服务避免类似的问题，但从安全角度考虑，我不建议这么做，毕竟修改两行参数的事，不复杂。 事实上，这个应用是Novell主导的，想必Suse上也有同样的设置。在/etc/apparmor.d目录下的增减文件可以在Linux文件系统权限之外基于程序对文件系统的访问操作进行限制。如果你想要限制一个/a/b的文件，对应的配置文件就是/etc/apparmor.d/a.b。内容应该很好理解了。 感觉上相比Selinux而言AppArmor简单一点，不知安全程度如何。但就我个人而言，我更加信任相对复杂的SeLinux。 ps: 之前我还碰到过ssh上去不能读写移动硬盘的问题，估计也于此有关。]]></description>
			<content:encoded><![CDATA[<p>这些天一台ubuntu server的mysql数据目录/var/lib/mysql所在分区快用光了，于是想把Mysql的数据目录移到一个相对空闲的分区下，直接修改了my.cnf中的配置，系统提示无法启动Mysql。又自做聪明的使用了链接文件访问，仍然无效。完全排除了所有linux文件系统权限的可能之后，我回忆起了之前在Redhat系操作系统上发生过的SeLinux导致的类似问题。看了一下官档，果然！Ubuntu在710之后，增加了一个类似于Selinux的权限控制服务叫做AppArmor，名字就很有意思：应用铠甲，让我想起了Diablo2中的暗金⋯⋯</p>
<p><span id="more-1430"></span>首先，解决那个Mysql的问题：</p>
<pre>#sudo nano /etc/apparmor.d/usr.sbin.mysqld ＃好吧，我承认，我sudo出了习惯</pre>
<p>发现了有两行配置：</p>
<pre>/home/mysql/ r,
/home/mysql/** rwk,</pre>
<p>修改掉</p>
<pre>/data/mysql/ r,
/data/mysql/** rwk,</pre>
<p>重启AppArmor</p>
<pre>/etc/init.d/apparmor reload</pre>
<p>重启Mysql，一切OK!<br />
当然你可以直接关闭apparmor服务避免类似的问题，但从安全角度考虑，我不建议这么做，毕竟修改两行参数的事，不复杂。</p>
<p>事实上，这个应用是Novell主导的，想必Suse上也有同样的设置。在/etc/apparmor.d目录下的增减文件可以在Linux文件系统权限之外基于程序对文件系统的访问操作进行限制。如果你想要限制一个/a/b的文件，对应的配置文件就是/etc/apparmor.d/a.b。内容应该很好理解了。</p>
<p>感觉上相比Selinux而言AppArmor简单一点，不知安全程度如何。但就我个人而言，我更加信任相对复杂的SeLinux。</p>
<p>ps:</p>
<p>之前我还碰到过ssh上去不能读写移动硬盘的问题，估计也于此有关。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/04/08/ubuntu%e7%9a%84apparmor%e5%bc%95%e5%8f%91%e7%9a%84mysql%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下安装Nginx+php(FastCGI)</title>
		<link>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258b%25e5%25ae%2589%25e8%25a3%2585nginxphpfastcgi</link>
		<comments>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 04:46:13 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1330</guid>
		<description><![CDATA[Nginx是近期最火的www服务器软件，它的种种优势这里就不在累述了，直接进入正题吧。 安装nginx 老一套的把戏 sudo apt-get install nginx 安装好之后sudo /etc/init.d/nginx restart 启动服务，正常情况下，你应该可以访问它获得经典的Welcome to nginx!欢迎界面。 安装php5 不同于apache的mod方式，nginx只限于fastcgi模式调用php。说道fastcgi，之前一直有兄弟问过我CGI和FastCGI的区别。其实FastCGI就是一个预先启动的进程，减少了CGI方式每次启动解释器的资源耗用。当然，这个方式带来的缺陷就是很容易因为解释器的挂死而失效。 sudo apt-get install php5-cgi 修改nginx的配置，使其支持php5 sudo /etc/nginx/sites-available/default location ~ \.php$ { fastcgi_pass   127.0.0.1:9000; fastcgi_index  index.php; fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name; include fastcgi_params; } 需要注意的是，默认nginx默认配置中注释掉的那一段中对于fastcgi_param的那段配置是有问题的，需要设置正确的路径。 如果你重启nginx的话，这里是无法正常使用php的，原理是php的fastcgi进程还没有启动。 sudo php-cgi -b 127.0.0.1:9000  &#38; //与上面的fastcgi_pass设置是同一端口 正常情况下，nginx已经支持了php。 由于这种方式容易出现问题导致php失效。这里我建议使用spawn-fcgi守护进程。 sudo apt-get install spawn-fcgi sudo spawn-fcgi -a 127.0.0.1 -p [...]]]></description>
			<content:encoded><![CDATA[<p>Nginx是近期最火的www服务器软件，它的种种优势这里就不在累述了，直接进入正题吧。</p>
<p><strong>安装nginx</strong><br />
老一套的把戏 sudo apt-get install nginx</p>
<p>安装好之后sudo /etc/init.d/nginx restart 启动服务，正常情况下，你应该可以访问它获得经典的Welcome to nginx!欢迎界面。</p>
<p><span id="more-1330"></span><strong>安装php5</strong></p>
<p>不同于apache的mod方式，nginx只限于fastcgi模式调用php。说道fastcgi，之前一直有兄弟问过我CGI和FastCGI的区别。其实FastCGI就是一个预先启动的进程，减少了CGI方式每次启动解释器的资源耗用。当然，这个方式带来的缺陷就是很容易因为解释器的挂死而失效。</p>
<p>sudo apt-get install php5-cgi</p>
<p><strong>修改nginx的配置，使其支持php5</strong></p>
<p>sudo /etc/nginx/sites-available/default</p>
<pre>location ~ \.php$ {
 fastcgi_pass   127.0.0.1:9000;
 fastcgi_index  index.php;
 fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
 include fastcgi_params;
 }
</pre>
<p>需要注意的是，默认nginx默认配置中注释掉的那一段中对于fastcgi_param的那段配置是有问题的，需要设置正确的路径。</p>
<p>如果你重启nginx的话，这里是无法正常使用php的，原理是php的fastcgi进程还没有启动。</p>
<p>sudo php-cgi -b 127.0.0.1:9000  &amp; //与上面的fastcgi_pass设置是同一端口</p>
<p>正常情况下，nginx已经支持了php。</p>
<p>由于这种方式容易出现问题导致php失效。这里我建议使用spawn-fcgi守护进程。</p>
<p>sudo apt-get install spawn-fcgi</p>
<p>sudo spawn-fcgi -a 127.0.0.1 -p 9000 -c 5 -f /usr/bin/php5-cgi //其中的 -c意味着同时同时启动5个进程</p>
<p>为了更加方便，不妨修改下nginx的启动脚本</p>
<p>sudo nano /etc/init.d/nginx //修改</p>
<pre>start)
 echo -n "Starting $DESC: "
 test_nginx_config
 start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
 --exec $DAEMON -- $DAEMON_OPTS || true
 echo -n "Starting Php FastCGI"
 /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -c 5 -f /usr/bin/php5-cgi
 echo "$NAME."
</pre>
<pre>stop)
 echo -n "Stopping $DESC: "
 start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
 --exec $DAEMON || true
 echo -n "Stopping Php FastCGI"
 killall php5-cgi
 echo "$NAME."
 ;;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu上Xen的快速部署</title>
		<link>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258axen%25e7%259a%2584%25e5%25bf%25ab%25e9%2580%259f%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 08 Oct 2010 02:02:29 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1324</guid>
		<description><![CDATA[上篇CentOS上Xen的快速部署中给的承诺，现在兑现。 注意的是本文的实例采用的是Ubuntu804 Server的LTS版本，采用这个版本而不是习惯上采用最新版本的Ubuntu主要是考虑到几个因素： 至少在904之后，Ubuntu从支持库中移除了Kernel-xen的包，仅保留xen-server的支持包。这也就意味着Xen已经得不到官方支持，804成了目前唯一提供官方支持的xen版本。当然你可以手工编译自己的内核或者使用debian的对应包强行安装Xen，但出错的概率比较大（本人在1004的版本上尝试过几次才顺利启动）。 1004的grub设置变动很大，尚没有搞懂手动修改启动顺序的正确方法。设置错误会直接损坏grub导致无法启动。 这次主机比上次的好，至少支持硬件虚拟化，方便很多。 安装Xen支持 Ubuntu的标志性命令，非常容易。 #sudo apt-get install ubuntu-xen-server xen 如果使用的是804以后的版本，在此之后，如果使用debian包，则下载linux linux-modules linux-headers的带xen的包，并使用sudo dpkg -i 方法安装。 直接编译内核的同学，可以直接load /boot/config-xxxx-xxx文件并手工添加xen的支持(make menuconfig) 用xen内核重启。 #sudo nano /etc/xen/xend-config.sxp 将#(vnc-listen &#8217;127.0.0.1&#8242;)修改为(vnc-listen &#8217;0.0.0.0&#8242;) 安装来宾操作系统：方法1，直接安装 这种方式的前提是你的cpu支持硬件虚拟化 建立虚拟硬盘，如果使用实际裸分区，可跳过 #sudo mkdir /xen #sudo dd if=/dev/zero of=/xen/2003_disk bs=1 count=0 seek=5G 编辑配置文件/etc/xen/2003 kernel = '/usr/lib64/xen/boot/hvmloader'#64位内核，32位的则替换为'/usr/lib/xen/boot/hvmloader' builder='hvm' memory = 512 #内存 shadow_memory = 8 name [...]]]></description>
			<content:encoded><![CDATA[<p>上篇<a title="Permanent Link: CentOS上Xen的快速部署" rel="bookmark" href="http://www.litrin.net/2010/09/16/centos%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/">CentOS上Xen的快速部署</a>中给的承诺，现在兑现。</p>
<p>注意的是本文的实例采用的是Ubuntu804 Server的LTS版本，采用这个版本而不是习惯上采用最新版本的Ubuntu主要是考虑到几个因素：</p>
<ol>
<li>至少在904之后，Ubuntu从支持库中移除了Kernel-xen的包，仅保留xen-server的支持包。这也就意味着Xen已经得不到官方支持，804成了目前唯一提供官方支持的xen版本。当然你可以手工编译自己的内核或者使用<a rel="nofollow" target="_blank" href="http://security.debian.org/debian-security/pool/updates/main/l/">debian的对应包</a>强行安装Xen，但出错的概率比较大（本人在1004的版本上尝试过几次才顺利启动）。</li>
<li>1004的grub设置变动很大，尚没有搞懂手动修改启动顺序的正确方法。设置错误会直接损坏grub导致无法启动。</li>
</ol>
<p>这次主机比上次的好，至少支持硬件虚拟化，方便很多。</p>
<p><span id="more-1324"></span></p>
<p><strong>安装Xen支持</strong></p>
<p>Ubuntu的标志性命令，非常容易。<br />
#sudo apt-get install <a title="ubuntu" href="http://www.litrin.net/tag/ubuntu/">ubuntu</a>-xen-server xen</p>
<p>如果使用的是804以后的版本，在此之后，如果使用debian包，则下载linux linux-modules linux-headers的带xen的包，并使用sudo dpkg -i 方法安装。<br />
直接编译内核的同学，可以直接load /boot/config-xxxx-xxx文件并手工添加xen的支持(make menuconfig)</p>
<p>用xen内核重启。</p>
<p>#sudo nano /etc/xen/xend-config.sxp<br />
将#(vnc-listen &#8217;127.0.0.1&#8242;)修改为(vnc-listen &#8217;0.0.0.0&#8242;)</p>
<p><strong>安装来宾操作系统：方法1，直接安装</strong></p>
<p>这种方式的前提是你的cpu支持硬件虚拟化</p>
<p>建立虚拟硬盘，如果使用实际裸分区，可跳过<br />
#sudo mkdir /xen<br />
#sudo dd if=/dev/zero of=/xen/2003_disk bs=1 count=0 seek=5G<br />
编辑配置文件/etc/xen/2003</p>
<pre>kernel = '/usr/lib64/xen/boot/hvmloader'#64位内核，32位的则替换为'/usr/lib/xen/boot/hvmloader'
builder='hvm'
memory = 512 #内存
shadow_memory = 8
name = "2003"
vif = [ 'type=ioemu, bridge=eth0' ]
disk = [
   'tap:aio:/xen/2003_disk,hda,w',
   #'phy:/dev/sda5,hda,w', #挂装裸分区方式
   'phy:/dev/cdrom,hdc:cdrom,r'
]

boot = "dc"
device_model = '/usr/lib64/xen/bin/qemu-dm'
vnc=1
vncpasswd=''
serial='pty'
sdl=1</pre>
<p>启动虚拟机<br />
sudo xm create /etc/xen/2003</p>
<p>用vnc客户端直接连接主机，即可开始典型的图形化安装过程。</p>
<p><strong>安装来宾操作系统：方法2，xen-create-image</strong></p>
<p>sudo xen-create-image &#8211;hostname=xen-ubuntu &#8211;size=5gb &#8211;memory=256mb &#8211;partitions=with-data &#8211;dist=lucid &#8211;ip=192.168.103.101 &#8211;gateway=192.168.103.254 &#8211;netmask=255.255.254.0  &#8211;mirror=http://cn.archive.ubuntu.com/ubuntu  &#8211;boot &#8211;passwd &#8211;role udev &#8211;dir=/etc/xen &#8211;force</p>
<p>系统会自动完成xen的配置并从制定的源中下载安装操作系统。</p>
<p><strong>部分操作（照贴过来的）</strong></p>
<p>xm console &lt;NAME&gt; 连接到虚拟机控制台<br />
xm create &lt;NAME&gt; 根据配置文件创建主机，如果您一直follow之前的操作并且完成了虚拟主机的安装，这条命令实际上等于启动一台虚拟机<br />
xm shutdown &lt;NAME&gt; 关机<br />
xm reboot &lt;NAME&gt; 重启<br />
xm destroy &lt;NAME&gt; 删除主机<br />
xentop 各主机之前的资源占用情况</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/10/08/ubuntu%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CentOS上Xen的快速部署</title>
		<link>http://www.litrin.net/2010/09/16/centos%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=centos%25e4%25b8%258axen%25e7%259a%2584%25e5%25bf%25ab%25e9%2580%259f%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2010/09/16/centos%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 05:57:43 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1312</guid>
		<description><![CDATA[背景描述 一台托管在外的服务器，环境为CentOS5.5，跑LAMP。由于运行环境和成本控制的考虑，需要同时配置PHP4+Mysql和PHP5+Mysql两种环境。起初计划采用两个apache环境，不同的端口来解决。考虑到目前Xen技术上已经成熟，于是考虑在真实主机上安装ngnix和mysql。通过xen安装两套虚拟环境分别配置不同的Php版本，前端使用ngnix代理的方式实现多个虚拟主机合并到同一个80号的目的。 本文同样适用于Redhat和小白鼠Fedora. 真实主机（主机名:www）上配置Xen CentOS的Xen还是比较容易设置的 #yum install kernel-xen xen等待安装，安装结束后，修改grub配置，确保主机通过xen内核启动后，重启主机。 主机启动后，首先确认 #uname -r ，内核版本号后面应该跟随一个xen标记，如：2.6.18-194.11.3.el5xen 需要解释的是，由于这台主机的要求网络结构是“一个出口”，即逻辑上虚拟主机的网络拓扑应该是路由方式，而Centos默认Xen的结构是网桥模式，这里需要修改下相应的配置。 /etc/xen/xend-config.sxp文件中 (network-script network-bridge) (vif-script vif-bridge) 注释掉 (network-script network-route) (vif-script     vif-route) 去掉注释 重启xen服务使设置生效，/etc/init.d/xend restart 配置虚拟主机 相比之前参考的很多文档，Centos的虚拟主机配置相对比较容易，至少没有那么复杂，因为Centos提供了一个比较方便的工具virt-install 我准备给虚拟主机都安装CentOS5.5，为了方便，我将光盘挂装到了 /mnt并设置了ngnix可以直接通过http://www/方式访问光盘中的文件，如果您之前通过http或者其他方式网络安装过操作系统，这一步应该很好理解。 正题来了：  virt-install -n CentOSVM1 -r 512 -f /xen/CentOSVM1.img  -l http://www/  &#8211;network=network:default -p -s 10 &#8211;nographics &#8211;vcpus=2 解释： -n CentOSVM1 设置虚拟服务器名称 -r 512 设置内存大小 -f [...]]]></description>
			<content:encoded><![CDATA[<p>背景描述</p>
<p>一台托管在外的服务器，环境为CentOS5.5，跑LAMP。由于运行环境和成本控制的考虑，需要同时配置PHP4+Mysql和PHP5+Mysql两种环境。起初计划采用两个apache环境，不同的端口来解决。考虑到目前Xen技术上已经成熟，于是考虑在真实主机上安装ngnix和mysql。通过xen安装两套虚拟环境分别配置不同的Php版本，前端使用ngnix代理的方式实现多个虚拟主机合并到同一个80号的目的。</p>
<p>本文同样适用于Redhat和小白鼠Fedora.</p>
<p><span id="more-1312"></span></p>
<p><strong>真实主机（主机名:www）上配置Xen</strong></p>
<p>CentOS的Xen还是比较容易设置的<br />
#yum install kernel-xen xen等待安装，安装结束后，修改grub配置，确保主机通过xen内核启动后，重启主机。</p>
<p>主机启动后，首先确认<br />
#uname -r ，内核版本号后面应该跟随一个xen标记，如：2.6.18-194.11.3.el5<strong>xen</strong></p>
<p>需要解释的是，由于这台主机的要求网络结构是“一个出口”，即逻辑上虚拟主机的网络拓扑应该是路由方式，而Centos默认Xen的结构是网桥模式，这里需要修改下相应的配置。<br />
/etc/xen/xend-config.sxp文件中<br />
(network-script network-bridge)<br />
(vif-script vif-bridge)<br />
注释掉<br />
(network-script network-route)<br />
(vif-script     vif-route)<br />
去掉注释<br />
重启xen服务使设置生效，/etc/init.d/xend restart</p>
<p><strong>配置虚拟主机</strong></p>
<p>相比之前参考的很多文档，Centos的虚拟主机配置相对比较容易，至少没有那么复杂，因为Centos提供了一个比较方便的工具virt-install</p>
<p>我准备给虚拟主机都安装CentOS5.5，为了方便，我将光盘挂装到了 /mnt并设置了ngnix可以直接通过<a rel="nofollow" target="_blank" href="http://www/">http://www/</a>方式访问光盘中的文件，如果您之前通过http或者其他方式网络安装过操作系统，这一步应该很好理解。</p>
<p>正题来了：</p>
<p> virt-install -n CentOSVM1 -r 512 -f /xen/CentOSVM1.img  -l <a rel="nofollow" target="_blank" href="http://mirrors.163.com/FreeBSD/releases/i386/8.1-RELEASE/8.1-RELEASE/">http://www/</a>  &#8211;network=network:default -p -s 10 &#8211;nographics &#8211;vcpus=2</p>
<p>解释：<br />
-n CentOSVM1 设置虚拟服务器名称<br />
-r 512 设置内存大小<br />
-f /xen/CentOSVM1.img  虚拟磁盘文件的保存路径，如果有重名可以使用&#8211;force参数强制重建。<br />
-l <a rel="nofollow" target="_blank" href="http://mirrors.163.com/FreeBSD/releases/i386/8.1-RELEASE/8.1-RELEASE/">http://www/</a> 安装文件的访问方式，支持nfs http ftp smb等多种方式。如果你对你的带宽比较自信，可以使用<a rel="nofollow" target="_blank" href="http://mirrors.163.com/centos/5.5/os/i386/">http://mirrors.163.com/centos/5.5/os/i386/</a>网易的镜像站<br />
&#8211;network=network:default 网络连接方式，我选择的是route中的default<br />
-p 我的机器不支持硬件虚拟化，-p参数不使用类似技术。现在新的CPU连Atom这样的都支持了，-p可以不加。<br />
-s 10磁盘文件的大小，单位是G<br />
&#8211;nographics 不使用图形界面，可以不加此参数，然后加入&#8211;vnc看看图形效果<br />
&#8211;vcpus=2 虚拟CPU的个数</p>
<p>剩下的就是等待安装的过程，由于之前的设置，网络这块直接DHCP就可以通过了。安装过程中报错找不到安装媒体的大多都是网络设置错误。</p>
<p>整个过程中可以通过ctrl+]回到真实主机，通过在真实主机中使用xm console CentOSVM1回到CentOSVM1的控制台。</p>
<p>OK，可以开始第二台主机的安装了，照旧吧：<br />
 virt-install -n CentOSVM2 -r 512 -f /xen/CentOSVM2.img  -l <a rel="nofollow" target="_blank" href="http://mirrors.163.com/FreeBSD/releases/i386/8.1-RELEASE/8.1-RELEASE/">http://www/</a>  &#8211;network=network:default -p -s 10 &#8211;nographics &#8211;vcpus=1</p>
<p><strong>部分操作</strong></p>
<p>xm console &lt;NAME&gt; 连接到虚拟机控制台<br />
xm create &lt;NAME&gt; 根据配置文件创建主机，如果您一直follow之前的操作并且完成了虚拟主机的安装，这条命令实际上等于启动一台虚拟机<br />
xm shutdown &lt;NAME&gt; 关机<br />
xm reboot &lt;NAME&gt; 重启<br />
xm destroy &lt;NAME&gt; 删除主机<br />
xentop 各主机之前的资源占用情况</p>
<p><strong>关于Ubuntu的xen</strong></p>
<p>记得804的时候，通过apt-get install ubuntu-xen-server xen的方式可以搭建起xen的环境，但不知出于什么目的，904以后，apt源里面移出了linux-xen内核的安装包。你当然可以下载到类似的替代安装包，但这无疑给安装带来了麻烦。</p>
<p>ubunt desktop和server的安装盘都无法通过网络安装程序，如果需要部署Ubuntu的虚拟机，你需要下载alternate安装盘。</p>
<p>暂时就这么多，改日写个ubuntu的安装文档出来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/09/16/centos%e4%b8%8axen%e7%9a%84%e5%bf%ab%e9%80%9f%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>1</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>利用Ubuntu搭建私有云</title>
		<link>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%25a9%25e7%2594%25a8ubuntu%25e6%2590%25ad%25e5%25bb%25ba%25e7%25a7%2581%25e6%259c%2589%25e4%25ba%2591</link>
		<comments>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 06:30:09 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1293</guid>
		<description><![CDATA[这一段时间大家都在谈云计算，Ubuntu也是在它的server版本中增加了Eucalyptus软件包，用以支持一个与亚马逊EC2兼容的企业云。作为一个弹性扩展方式，Cloud的确很方便。 闲来无事，测试了一下。报下配置，理论上用虚拟机是完全可以的： 1台Dell 台式机，用以安装Cluster，双核+2G+250G；一台Asus本本，用以安装Node，双核+2G+160G；当然，我的测试中还有我自己的ubuntu本本充当客户端，这台机器可以省略，将客户端放在上述主机中的任何一台——前提是只要不是生产环境。 1. 安装Cluster主机 貌似这里没什么好说的，我用的是Ubuntu 910 x86_64 server，我的网络已经开启了DHCP（ip:192.168.103.223），没有太多的配置。安装的最后，系统会询问你安装的软件包。选择 Install Ubuntu Enterprise Cloud Cluster。系统会要求配置postfix以发送验证邮件，internet Site选项即可。Name your cluster 也没什么特别，我就用了My Cloud。 a list of available IP addresses on your network 选项是用于虚拟机的IP段，这里用一个空的Ip段即可。 2. 安装Node主机 同样没什么可以多说的，但要求Node主机跟Cluster在同一个网段内即可（ip:192.168.103.233）。选择 Install Ubuntu Enterprise Cloud Node。由于Cluster主机已经启动了，向导直接就通过了。 3. 调试Cloud 在Cluster上执行 sudo euca_conf &#8211;no-rsync &#8211;discover-nodes ，系统会提示发现Node并将Node加如Cloud。 用客户端访问https://192.168.103.223:8443 (建议使用Linux+Firefox)，默认的用户名和密码都是admin，比较汗。登录后在Credentials选项卡中download Credentials下载打包好的验证文件。我的文件名~/euca2-admin-x509.zip    4. 配置客户端  据说有一个基于Firefox插件的图形化客户端，没有测试过，各位可以测试下。我还是比较笨的用命令行。 sudo apt-get install ec2-api-tools   euca2ools mkdir ~/.euca cd ~/.euca unzip ~/euca2-admin-x509.zip chmod -R 0700 ~/.euca  ~/.euca/eucarc  echo ”[ -r ~/.euca/eucarc ] &#38;&#38; . ~/.euca/eucarc” &#62;&#62; ~/.bashrc 重新开一个终端，让配置生效，或者。。。重启吧。]]></description>
			<content:encoded><![CDATA[<p>这一段时间大家都在谈云计算，Ubuntu也是在它的server版本中增加了Eucalyptus软件包，用以支持一个与亚马逊EC2兼容的企业云。作为一个弹性扩展方式，Cloud的确很方便。</p>
<p>闲来无事，测试了一下。报下配置，理论上用虚拟机是完全可以的：<br />
1台Dell 台式机，用以安装Cluster，双核+2G+250G；一台Asus本本，用以安装Node，双核+2G+160G；当然，我的测试中还有我自己的ubuntu本本充当客户端，这台机器可以省略，将客户端放在上述主机中的任何一台——前提是只要不是生产环境。</p>
<p><span id="more-1293"></span></p>
<p><strong>1. 安装Cluster主机</strong></p>
<p>貌似这里没什么好说的，我用的是Ubuntu 910 x86_64 server，我的网络已经开启了DHCP（ip:192.168.103.223），没有太多的配置。安装的最后，系统会询问你安装的软件包。选择 Install Ubuntu Enterprise Cloud Cluster。系统会要求配置postfix以发送验证邮件，internet Site选项即可。Name your cluster 也没什么特别，我就用了My Cloud。<br />
a list of available IP addresses on your network 选项是用于虚拟机的IP段，这里用一个空的Ip段即可。</p>
<p><strong>2. 安装Node主机</strong></p>
<p>同样没什么可以多说的，但要求Node主机跟Cluster在同一个网段内即可（ip:192.168.103.233）。选择 Install Ubuntu Enterprise Cloud Node。由于Cluster主机已经启动了，向导直接就通过了。</p>
<p><strong>3. 调试Cloud</strong></p>
<p>在Cluster上执行 sudo euca_conf &#8211;no-rsync &#8211;discover-nodes ，系统会提示发现Node并将Node加如Cloud。<br />
用客户端访问<a rel="nofollow" target="_blank" href="https://192.168.103.223:8443">https://192.168.103.223:8443</a> (建议使用Linux+Firefox)，默认的用户名和密码都是admin，比较汗。登录后在Credentials选项卡中download Credentials下载打包好的验证文件。我的文件名~/euca2-admin-x509.zip   </p>
<p><strong>4. 配置客户端</strong> </p>
<p>据说有一个基于<a rel="nofollow" target="_blank" href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=609" target="_blank">Firefox插件的图形化客户端</a>，没有测试过，各位可以测试下。我还是比较笨的用命令行。</p>
<p>sudo apt-get install ec2-api-tools   euca2ools</p>
<p>mkdir ~/.euca<br />
cd ~/.euca<br />
unzip ~/euca2-admin-x509.zip<br />
chmod -R 0700 ~/.euca<br />
 ~/.euca/eucarc <br />
echo ”[ -r ~/.euca/eucarc ] &amp;&amp; . ~/.euca/eucarc” &gt;&gt; ~/.bashrc</p>
<p>重新开一个终端，让配置生效，或者。。。重启吧。</p>
<p><strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/08/11/%e5%88%a9%e7%94%a8ubuntu%e6%90%ad%e5%bb%ba%e7%a7%81%e6%9c%89%e4%ba%91/feed/</wfw:commentRss>
		<slash:comments>1</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>用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>
	</channel>
</rss>

