<?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/tag/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>Linux的CPU调速器</title>
		<link>http://www.litrin.net/2011/10/15/linux%e7%9a%84cpu%e8%b0%83%e9%80%9f%e5%99%a8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux%25e7%259a%2584cpu%25e8%25b0%2583%25e9%2580%259f%25e5%2599%25a8</link>
		<comments>http://www.litrin.net/2011/10/15/linux%e7%9a%84cpu%e8%b0%83%e9%80%9f%e5%99%a8/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 05:52:03 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1576</guid>
		<description><![CDATA[都说Android手机的耗电和发热是与生俱来的，作为一个Android用户，我也深受其苦。于是刷了一个非官方的固件——Cyanogenmod。既然说是非官固件，总有特别的地方，在省电和性能的均衡方面，CM特地的设置了一个“调速器”的选项。Android本身就是一个Linux的内核，调速器的设置本身就是Linux内核中继承而来的。 在桌面版本的Linux中，一般默认已经安装了调速器的控制台，并可以通过类似gnome控制栏插件的方式简单的启用和调整。对于Server版本，由于定位不同，这样的设置意义不大，但可以手工安装。考虑到要做“绿色IT”，个人觉得在一定范围内适当的使用不但不会影响性能，而且还可以降低主机温度，达到延长主机寿命的功效。具体方法如下： sudo apt-get install cpufrequtils 手工调整CPU频率，需要CPU支持，虽然现如今大多数CPU都支持类似的技术（Speed Step之Intel和nCool之AMD），但恰巧我有一台ATOM芯片的机器就不支持。同样需要注意的是，不是超频，而是降频，指望这种方法为CPU超频的话我劝您还是直接去 BIOS里跳吧 cpufreq-selector -f  频率数，单位是kHz cpufreq-set -d 最高频率 cpufreq-set -u 最低频率 查看CPU状态，不需要太多解释了吧 cpufreq-info 设置CPU运行模式，这才是主要的。系统默认会为CPU设置几种模式方便直接切换 cpufreq-set -g 模式类型 模式类型 powersave，省电模式，简洁明了，就是最省电的状态，CPU始终工作在最低频率上。 userspace，用户定制，手工定制频率的方式。 ondemand，守护模式，自动根据系统负载调整模式，负载越高，频率越高。这是绝大多数系统选择的模式。 conservative，保守模式，有些类似于ondemand，但不同于ondemand一有负载就提高频率到最高，次模式尽量采用较低的模式，直至满载无法承受才提升频率。 performance，性能模式，系统始终工作在最高频率之上。 就拿我的Android手机为例，默认工作在ondemand模式，CPU主频是600mHz（不是新机器，让您见笑了）。下设245, 400, 480, 600共计4个档位。未调整前，大约有超过60％的时间系统工作在600mHz的档位上满负荷工作，而245的档位时间不足1％，耗电和温度自然降不下来。由于手机不同于台式机和服务器，待机时间相比性能而言更为重要——至少我的需求如此，而在大部分时间都应该处在相对空闲的状态下，满负荷大可不必。于是将调速器模式设置为conservative，一周后的统计，245的档位上占据了接近80％，而600的档位不足13％，发热也得到控制，待机时间至少增加了1/3。]]></description>
			<content:encoded><![CDATA[<p>都说Android手机的耗电和发热是与生俱来的，作为一个Android用户，我也深受其苦。于是刷了一个非官方的固件——<a rel="nofollow" target="_blank" href="http://www.cyanogenmod.com" target="_blank">Cyanogenmod</a>。既然说是非官固件，总有特别的地方，在省电和性能的均衡方面，CM特地的设置了一个“调速器”的选项。Android本身就是一个Linux的内核，调速器的设置本身就是Linux内核中继承而来的。</p>
<p><span id="more-1576"></span>在桌面版本的Linux中，一般默认已经安装了调速器的控制台，并可以通过类似gnome控制栏插件的方式简单的启用和调整。对于Server版本，由于定位不同，这样的设置意义不大，但可以手工安装。考虑到要做“绿色IT”，个人觉得在一定范围内适当的使用不但不会影响性能，而且还可以降低主机温度，达到延长主机寿命的功效。具体方法如下：</p>
<p>sudo apt-get install cpufrequtils</p>
<p><strong>手工调整CPU频率</strong>，需要CPU支持，虽然现如今大多数CPU都支持类似的技术（Speed Step之Intel和nCool之AMD），但恰巧我有一台ATOM芯片的机器就不支持。同样需要注意的是，不是超频，而是降频，指望这种方法为CPU超频的话我劝您还是直接去 BIOS里跳吧 <img src='http://www.litrin.net/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<p>cpufreq-selector -f  频率数，单位是kHz<br />
cpufreq-set -d 最高频率<br />
cpufreq-set -u 最低频率</p>
<p><strong>查看CPU状态，</strong>不需要太多解释了吧</p>
<p>cpufreq-info</p>
<p><strong>设置CPU运行模式，这才是主要的。</strong>系统默认会为CPU设置几种模式方便直接切换</p>
<p>cpufreq-set -g 模式类型</p>
<p>模式类型</p>
<ul>
<li>powersave，省电模式，简洁明了，就是最省电的状态，CPU始终工作在最低频率上。</li>
<li>userspace，用户定制，手工定制频率的方式。</li>
<li>ondemand，守护模式，自动根据系统负载调整模式，负载越高，频率越高。这是绝大多数系统选择的模式。</li>
<li>conservative，保守模式，有些类似于ondemand，但不同于ondemand一有负载就提高频率到最高，次模式尽量采用较低的模式，直至满载无法承受才提升频率。</li>
<li>performance，性能模式，系统始终工作在最高频率之上。</li>
</ul>
<div>就拿我的Android手机为例，默认工作在ondemand模式，CPU主频是600mHz（不是新机器，让您见笑了）。下设245, 400, 480, 600共计4个档位。未调整前，大约有超过60％的时间系统工作在600mHz的档位上满负荷工作，而245的档位时间不足1％，耗电和温度自然降不下来。由于手机不同于台式机和服务器，待机时间相比性能而言更为重要——至少我的需求如此，而在大部分时间都应该处在相对空闲的状态下，满负荷大可不必。于是将调速器模式设置为conservative，一周后的统计，245的档位上占据了接近80％，而600的档位不足13％，发热也得到控制，待机时间至少增加了1/3。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/10/15/linux%e7%9a%84cpu%e8%b0%83%e9%80%9f%e5%99%a8/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>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>分布式文件系统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>定制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>Redhat的壁垒</title>
		<link>http://www.litrin.net/2011/03/12/redhat%e7%9a%84%e5%a3%81%e5%9e%92/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=redhat%25e7%259a%2584%25e5%25a3%2581%25e5%259e%2592</link>
		<comments>http://www.litrin.net/2011/03/12/redhat%e7%9a%84%e5%a3%81%e5%9e%92/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 06:19:12 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[开源7788]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[业界话题]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1406</guid>
		<description><![CDATA[前些日子，Redhat宣布将要改变现有的发行版本和补丁包的命名方式，并且直言不讳的说这样是为了“有效的防止竞争对手介入”。一点也不突然，自从Fedora从Redhat中分离的那一天起，这一天就迟早会到来，我反而觉得Redhat动手太迟了。 相比正统到迂腐的“HAT”，“FEDORA”休闲了很多，也正如单词本身的定位，现在的Redhat事实上是Redhat Enterprise Linux( 红帽企业Linux,RHEL)的意思，fedora成为了社区维护的Linux。事实证明，这种战略确实在尽可能的减少开支的情况下给Redhat带来了可观的收益。 说起盈利，目前正统的linux厂商甚至于开源软件厂商的盈利模式无外乎卖服务而已。显然的是，Redhat不但从技术上还是市场上，这些年一直是 作为商业Linux的标杆而“神一样的存在”。大量的应用甚至到专门为Redhat而开发。但说实话，Redhat的价格高的有些离谱，授权费用甚至超过商业Windows或者Unix。作为商业行为我们无可厚非，但对于这些专属应用的下场确实一个艰难的决定：要么放弃，要么使用非授权版本的RHEL。显然Centos的存在就是弥补了这样一个空缺——除了商标之外就是一个RHEL。当然，一贯在商业上滑头的Oracle也是搞了一套RHEL like的Oracle Linux；类似的还有Novell提出可以为客户维护RHEL的服务，这里也不再累述。 所有这一切建立的基础是什么？正式基于RHEL虽然是商业软件，但不得不开源。不可否认，目前Linux的体系里大多数的更新都出自 redhat，没有人敢于否认这一点。甚至可以这么说：“目前最有影响力的企业级Linux都是基于RPM的，RPM本身就是Redhat的！”但看着自己的成果却被别人拿去赚钱，没有人会受这样的窝囊气。此次Redhat做出的改变只能说是在GPL框架内做出的最后反抗。但这样后果如何？ 可能一：Redhat破坏了目前的生态，Centos可以转为独立分支；Oracle 甚至可以直接转向Solaris，RPM体系逐渐衰落。直至最后影响到自己，进而影响到整个Linux的社区。或者说RPM旁落，Debian系里将会出现下一个Redhat。 可能二：Redhat借此击垮了Centos和Oracle Linux，让自己独大，赚取更多利益。到头来可能会是更高的授权费用。但相对这确实是有利于Linux生态的。 可能三：这个可能是最有可能的结果，也是最无聊的。大家依旧我行我素，依然现状不改。 OK，说起服务，不得不提Apple。最近Apple最新的IDE－Xcode4也放在了App store里出售，标价$4.99。要知道Mac上TextMate这个简单的文本编辑器都要卖到$56。区区5刀只能说是象征性收费。这是一个很有意思的问题，也许不久以后的将来IT业的收费模式将会逐步改变为“微收费”模式。像Redhat这样的情况完全可以完全精确到每次升级收取一定数量的服务费，而不是像现在这样按照年这样大的粒度。相信不少企业也会认同这样的收费模式，量上去了，平摊成本自然会降低。这同时也是提醒了很多特定模式下的客户：“收费意味着更高的服务质量和体验！”]]></description>
			<content:encoded><![CDATA[<p>前些日子，Redhat宣布将要改变现有的发行版本和补丁包的命名方式，并且直言不讳的说这样是为了“有效的防止竞争对手介入”。一点也不突然，自从Fedora从Redhat中分离的那一天起，这一天就迟早会到来，我反而觉得Redhat动手太迟了。</p>
<p>相比正统到迂腐的“HAT”，“FEDORA”休闲了很多，也正如单词本身的定位，现在的Redhat事实上是Redhat Enterprise Linux( 红帽企业Linux,RHEL)的意思，fedora成为了社区维护的Linux。事实证明，这种战略确实在尽可能的减少开支的情况下给Redhat带来了可观的收益。</p>
<p>说起盈利，目前正统的linux厂商甚至于开源软件厂商的盈利模式无外乎卖服务而已。显然的是，Redhat不但从技术上还是市场上，这些年一直是 作为商业Linux的标杆而“神一样的存在”。大量的应用甚至到专门为Redhat而开发。但说实话，Redhat的价格高的有些离谱，授权费用甚至超过商业Windows或者Unix。作为商业行为我们无可厚非，但对于这些专属应用的下场确实一个艰难的决定：要么放弃，要么使用非授权版本的RHEL。显然Centos的存在就是弥补了这样一个空缺——除了商标之外就是一个RHEL。当然，一贯在商业上滑头的Oracle也是搞了一套RHEL like的Oracle Linux；类似的还有Novell提出可以为客户维护RHEL的服务，这里也不再累述。</p>
<p><span id="more-1406"></span><br />
所有这一切建立的基础是什么？正式基于RHEL虽然是商业软件，但不得不开源。不可否认，目前Linux的体系里大多数的更新都出自 redhat，没有人敢于否认这一点。甚至可以这么说：“目前最有影响力的企业级Linux都是基于RPM的，RPM本身就是Redhat的！”但看着自己的成果却被别人拿去赚钱，没有人会受这样的窝囊气。此次Redhat做出的改变只能说是在GPL框架内做出的最后反抗。但这样后果如何？</p>
<p style="padding-left: 30px;">可能一：Redhat破坏了目前的生态，Centos可以转为独立分支；Oracle 甚至可以直接转向Solaris，RPM体系逐渐衰落。直至最后影响到自己，进而影响到整个Linux的社区。或者说RPM旁落，Debian系里将会出现下一个Redhat。<br />
可能二：Redhat借此击垮了Centos和Oracle Linux，让自己独大，赚取更多利益。到头来可能会是更高的授权费用。但相对这确实是有利于Linux生态的。<br />
可能三：这个可能是最有可能的结果，也是最无聊的。大家依旧我行我素，依然现状不改。</p>
<p>OK，说起服务，不得不提Apple。最近Apple最新的IDE－Xcode4也放在了App store里出售，标价$4.99。要知道Mac上TextMate这个简单的文本编辑器都要卖到$56。区区5刀只能说是象征性收费。这是一个很有意思的问题，也许不久以后的将来IT业的收费模式将会逐步改变为“微收费”模式。像Redhat这样的情况完全可以完全精确到每次升级收取一定数量的服务费，而不是像现在这样按照年这样大的粒度。相信不少企业也会认同这样的收费模式，量上去了，平摊成本自然会降低。这同时也是提醒了很多特定模式下的客户：“收费意味着更高的服务质量和体验！”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/03/12/redhat%e7%9a%84%e5%a3%81%e5%9e%92/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>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 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>

