GNU/Linux – 夏清然的日志 https://www.qingran.net Xia Qingran Geek Blog Sun, 07 Aug 2016 09:50:33 +0000 en-US hourly 1 https://wordpress.org/?v=4.6.1 112893047 Facebook HipHop on ubuntu 12.04安装笔记 https://www.qingran.net/2012/12/facebook-hiphop-on-ubuntu-12-04%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/ https://www.qingran.net/2012/12/facebook-hiphop-on-ubuntu-12-04%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/#respond Sat, 22 Dec 2012 11:41:09 +0000 https://www.qingran.net/?p=1859 最近看n多报道说facebook的HipHop的VM性能已经超过的编译版的,所以特意尝试了下Facebook的HipHop,现在把安装笔记记录一下。

本次安装在buntu 12.04 x86_64版本上进行,目前hiphop仅支持64bit版本:

  1. 有Internet联网电脑一台;
  2. ubuntu-12.04 x86_64 OS;
  3. 编译时间较长,需要有耐心。

升级ubuntu:

sudo apt-get update
sudo apt-get dist-upgrade

安装必要依赖包:

sudo apt-get install git-core cmake g++ libboost-dev libmysqlclient-dev libxml2-dev libmcrypt-dev libicu-dev openssl build-essential binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev wget memcached libreadline-dev libncurses-dev libmemcached-dev libbz2-dev libc-client2007e-dev php5-mcrypt php5-imagick libgoogle-perftools-dev libcloog-ppl0 libelf-dev libdwarf-dev libunwind7-dev

git检出hiphop代码:

mkdir dev
cd dev

git clone git://github.com/facebook/hiphop-php.git
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/..
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
cd ..

libevent需要重新patch:

git clone git://github.com/libevent/libevent.git
cd libevent
git checkout release-1.4.14b-stable
cat ../hiphop-php/src/third_party/libevent-1.4.14.fb-changes.diff | patch -p1
./autogen.sh
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

libcurl需要重新patch:

git clone git://github.com/libevent/libevent.git
cd libevent
git checkout release-1.4.14b-stable
cat ../hiphop-php/src/third_party/libevent-1.4.14.fb-changes.diff | patch -p1
./autogen.sh
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

编译jemalloc:

wget http://www.canonware.com/download/jemalloc/jemalloc-3.0.0.tar.bz2
tar xjvf jemalloc-3.0.0.tar.bz2
cd jemalloc-3.0.0
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

以上准备工作就绪,现在开始编译hihop,本次安装是使用的hhvm模式:

cd hiphop-php
git submodule init
git submodule update
export HPHP_HOME=`pwd`
export HPHP_LIB=`pwd`/bin
export USE_HHVM=1
cmake .
make

大功告成,进入src/hhvm里,hhvm文件即是。

PS,ubuntu安装极其简单,但在一台centos6.3上装了n次才搞定。

]]>
https://www.qingran.net/2012/12/facebook-hiphop-on-ubuntu-12-04%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/feed/ 0 1859
NUMA微架构 https://www.qingran.net/2011/09/numa%e5%be%ae%e6%9e%b6%e6%9e%84/ https://www.qingran.net/2011/09/numa%e5%be%ae%e6%9e%b6%e6%9e%84/#respond Thu, 08 Sep 2011 04:02:51 +0000 https://www.qingran.net/?p=1484 现在开始补日志,逐步的扫清以前写了一半的和“欠账未还的”。半年之前开的头,今天先把NUMA说完。

PC硬件结构近5年的最大变化是多核CPU在PC上的普及,多核最常用的SMP微架构:

  1. 多个CPU之间是平等的,无主从关系(对比IBM Cell);
  2. 多个CPU平等的访问系统内存,也就是说内存是统一结构、统一寻址的(UMA,Uniform Memory Architecture);
  3. CPU到CPU的访问必须通过系统总线。

结构如图所示:

SMP的问题主要在CPU和内存之间的通信延迟较大、通信带宽受限于系统总线带宽,同时总线带宽会成为整个系统的瓶颈。

由此应运而生了NUMA架构:

NUMA(Non-Uniform Memory Access)是起源于AMD Opteron的微架构,同时被Intel Nehalem采用(英特尔志强E5500以上的CPU和桌面的i3、i5、i7均基于此架构)。这也应该是继AMD64后AMD对CPU架构的又一项重要改进。

在这个架构中,每个处理器有其可以直接访问其自身的“本地”内存池,使CPU和这块儿内存之间拥有更小的延迟和更大的带宽。而且整个内存仍然可做为一个整体,可以接受来自任何CPU的访问。简言之就是CPU访问自己领地内的内存延迟最小独占带宽,访问其他的内存区域稍慢并且共享带宽。

GNU/Linux如何管理NUMA:

  1. probe硬件,了解物理CPU数量,内存大小等;
  2. 根据物理CPU的数量(不是core)分配node,一个物理CPU对应一个node;
  3. 把属于一个node的内存模块和其node相联系;
  4. 测试各个CPU到各个内存区域的通信延迟;

在一台16GB内存,双Xeon E5620 CPU Dell R710用numactl得到以下信息:

# numactl --hardware

available: 2 nodes (0-1)

node 0 size: 8080 MB

node 0 free: 5643 MB

node 1 size: 8051 MB

node 1 free: 2294 MB

node distances:

node 0 1

0: 10 20

1: 20 10

  • 第一列node0和node1就是对应物理CPU0和CPU1;
  • size就是指在此节点NUMA分配的内存总数;
  • free是指此节点NUMA的内存空闲数量;
  • node distances就是指node到各个内存节点之间的距离,默认情况10是指本地内存,21是指跨区域访问。

因为就近内存访问的快速性,所以默认情况下一个CPU只访问其所属区域的内存空间。此时造成的问题是在大内存占用的一些应用时会有CPU近线内存不够的情况,可以使用如下方式把CPU对内存区域的访问变为round robin方式。此时需要通过以下方式修改:

# echo 0 > /proc/sys/vm/zone_reclaim_mode

# numactl --interleave=all

memcached、redis、monodb等应该做以上的优化修改。

另外,如果有时间,下一篇会总结一下自己对于此问题的思考:如果自己实现一个内存池,并发挥NUMA架构的最大效能,如何设计?

参考自:

http://en.wikipedia.org/wiki/Non-Uniform_Memory_Access

Ulrich Drepper, Memory part 4: NUMA support http://lwn.net/Articles/254445/

http://www.kernel.org/doc/Documentation/sysctl/vm.txt

 

]]>
https://www.qingran.net/2011/09/numa%e5%be%ae%e6%9e%b6%e6%9e%84/feed/ 0 1484
简述软件包管理系统 https://www.qingran.net/2011/07/%e7%ae%80%e8%bf%b0%e8%bd%af%e4%bb%b6%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f/ https://www.qingran.net/2011/07/%e7%ae%80%e8%bf%b0%e8%bd%af%e4%bb%b6%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f/#respond Tue, 05 Jul 2011 10:19:05 +0000 https://www.qingran.net/?p=1083 四月份写的一篇blog,就差个结尾,今天补上。

软件包管理是个很大的话题,希望我能说清楚这事。

上周和运营的同事头一次开会讨论了一下我们游戏上线前要注意的事。当时提到了我们软件的更新问题,由于系统运营指定的CentOS linux系统,所以我当时就说使用系统的软件包管理器yum来做软件的发布,这么合理并且靠铺的一个方案当时就被否。理由是:yum这套东西太复杂,不好使,且我们没有统一的yum源服务器。要求我们用他们自己开发的一个package方案。我暂时不知道这套package方案是如何实现的,猜测估计就是tar出来文件,然后有一个安装的bash脚本。

软件包管理系统在*nix系统中有非常重要的意义。一个能够正常工作或者提供服务的平台一般需要数百甚至数千个软件包。包管理系统就是能协调好这些软件关系,并且方便增、删、查、升级的一套系统。

先从软件开发角度考虑,一个软件安装程序需要包含以下几方面内容:

  1. 程序运行所需要的可执行文件,库文件,资源文件。并把这些文件包装成一个文件方便存放和传输;
  2. 软件包需要有版本号,并且和版本控制中代码的tag有一定的对应;
  3. 软件包能够安装、删除、升级、降级;
  4. 上面的每个过程中的每个阶段都能执行shell脚本;
  5. 软件包对第三方库的依赖性必须能够体现并规范;
  6. 软件包安装后的各个文件必须有checksum信息以获知是否被修改;
  7. 软件包本身有checksum信息,以获知其是否是原生包(debian的secure apt保证了这点,详见以前的一篇blog);
  8. 需要有统一的网络接口、工具去更新和发布软件;
  9. 能对软件进行配置和维护,相当于dpkg-reconfigure;
  10. 级联的升级或者级联的降级;
  11. 需要有工具方便的创建软件包,并且搞定以上所有的事情。

能满足以上11点需求的软件包管理器,有能力无bug的短时间搞定么?觉悟起来用现成的yum吧。

]]>
https://www.qingran.net/2011/07/%e7%ae%80%e8%bf%b0%e8%bd%af%e4%bb%b6%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f/feed/ 0 1083
使用文件系统snapshot做数据库归档备份 https://www.qingran.net/2011/05/%e4%bd%bf%e7%94%a8%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fsnapshot%e5%81%9a%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bd%92%e6%a1%a3%e5%a4%87%e4%bb%bd/ https://www.qingran.net/2011/05/%e4%bd%bf%e7%94%a8%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fsnapshot%e5%81%9a%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bd%92%e6%a1%a3%e5%a4%87%e4%bb%bd/#respond Thu, 12 May 2011 12:17:36 +0000 https://www.qingran.net/?p=1111 昨天下午的技术讨论会上说到了数据库的按时间点的进行实时备份和归档,当时的讨论都是基于日志如何来做。

这个问题需要做到以下几点:

  • 因备份而引起的中断数据库服务的时间尽可能短;
  • 能够迅速的让数据库使用备份的数据rollback;
  • 归档的备份数据能在专门的备份机统一保存,方便本机失效后的处理;
  • 如果可能,归档备份的数据能做到增量备份,以节省备份机的磁盘空间,同时方便快速传输。

从数据库本身解决这个问题,可能受困于已有的数据库设计和代码,不非常容易。换个思路,可以基于fs的snapshot来做。

在*nix系统下功能最强的snapshot首推zfs,本身支持文件系统快照,支持增量备份,并内置了zfs send工具能直接把备份快照、或增量备份快照发送到另外一台物理机器上(也必须是zfs)。但必须使用FreeBSD 8以上或者是 OpenSolaris。但是由于公司的机器都是GNU/Linux的,退而求其次选择LVM。

在家里的E8200 + Debian 6.0.0 i386系统上做了测试,首先是使用lvm创建分区,创建了一个名为main的60GB大小的Volume Group,同时在里面建立了一个名为main0的10GB的Logical Volume挂载“/”,并格式化为ext3。

拷入6GB的数据文件,然后创建snapshot:
# lvcreate -s -L 7G -n snap-`date +%Y%m%d%H` /dev/main/main0
这一步消耗时间只有0.5s左右,而且测试了拷入20GB的数据文件,snapshot时间基本无变化,详细看截图:

然后在/dev/main/下新加入了snap-`date +%Y%m%d%H` LVM逻辑卷,可以挂载此snapshot分区:
# mount /dev/main/snap-`date +%Y%m%d%H` ~/backup

随后就可以tar成gzip包,然后rsync集中保存了。

删除snapshot:
# umount -f ~/backup# lvremove /dev/main/snap-`date +%Y%m%d%H`

对于数据库的操作来说,拿MySQL举例:

# mysql –uroot –p -h localhost
mysql> flush tables with read lock;
mysql>flush logs;
mysql>system lvcreate -s -L 7G -n snap-mysql-`date +%Y%m%d%H` /dev/main/mysqldb;
mysql>unlock tables;
mysql>quit;

就是先flush数据和日志,锁表,创建snapshot,解锁,这时就已经恢复服务。如果flush的速度够快,整个中断服务的时间在1s左右。

完毕后,即在/dev/main/snap-mysql-`date +%Y%m%d%H`下创建了一个LVM逻辑卷,如果使用,可以随时mount,然后修改mysql的数据路径,即能非常快的使用那时的数据,切换肯定也能在1s之内完成。

接下来要做的就简单了,可以mount上,然后慢慢的tar包,上传到统一备份机。

PS,今天有一位同事指出在lvm下做过snapshot后,磁盘的IO性能影响很大,这个我需要测试一下了。

]]>
https://www.qingran.net/2011/05/%e4%bd%bf%e7%94%a8%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9fsnapshot%e5%81%9a%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bd%92%e6%a1%a3%e5%a4%87%e4%bb%bd/feed/ 0 1111
sshd防止“防火墙断开空闲TCP链接”的设置 https://www.qingran.net/2011/02/sshd%e9%98%b2%e6%ad%a2%e2%80%9c%e9%98%b2%e7%81%ab%e5%a2%99%e6%96%ad%e5%bc%80%e7%a9%ba%e9%97%b2tcp%e9%93%be%e6%8e%a5%e2%80%9d%e7%9a%84%e8%ae%be%e7%bd%ae/ https://www.qingran.net/2011/02/sshd%e9%98%b2%e6%ad%a2%e2%80%9c%e9%98%b2%e7%81%ab%e5%a2%99%e6%96%ad%e5%bc%80%e7%a9%ba%e9%97%b2tcp%e9%93%be%e6%8e%a5%e2%80%9d%e7%9a%84%e8%ae%be%e7%bd%ae/#respond Tue, 22 Feb 2011 02:51:06 +0000 https://www.qingran.net/?p=996 最近发现公司的的内网ssh登陆上服务器后不操作一段时间就会断线,同时如果一直在操作或有屏幕输出(类似tail -f /var/log/apache2/access.log),那么ssh就不会断线。

猜测是公司的防火墙有“断开空闲TCP链接”的策略,在/etc/ssh/sshd_config 内加入:

ClientAliveInterval = 15
ClientAliveCountMax = 100

ClientAliveInterval的含义是每过15s,sshd会向ssh client发出一个询问是否在线的请求,正常的ssh client都会予以回应;同时ClientAliveCountMax设定了这种询问的最大失败值,在本例中如果sshd向client发出了100次讯问均没有得到回应,那么sshd会主动断开此ssh链接。

]]>
https://www.qingran.net/2011/02/sshd%e9%98%b2%e6%ad%a2%e2%80%9c%e9%98%b2%e7%81%ab%e5%a2%99%e6%96%ad%e5%bc%80%e7%a9%ba%e9%97%b2tcp%e9%93%be%e6%8e%a5%e2%80%9d%e7%9a%84%e8%ae%be%e7%bd%ae/feed/ 0 996
删除Python easy_install安装软件 https://www.qingran.net/2011/01/%e5%88%a0%e9%99%a4python-easy_install%e5%ae%89%e8%a3%85%e8%bd%af%e4%bb%b6/ https://www.qingran.net/2011/01/%e5%88%a0%e9%99%a4python-easy_install%e5%ae%89%e8%a3%85%e8%bd%af%e4%bb%b6/#comments Wed, 12 Jan 2011 14:48:51 +0000 https://www.qingran.net/?p=791 python的easy_install是很方便的安装体系,可是一般来说setup.py没有deinstall的选项,那么如何删除已经安装的egg呢?

easy_install -mxN Genshi
然后下面类似的提示:

install_dir /usr/local/lib/python2.6/dist-packages/
Processing Genshi-0.6-py2.6.egg
Removing Genshi 0.6 from easy-install.pth file

Installed /usr/local/lib/python2.6/dist-packages/Genshi-0.6-py2.6.egg

Because this distribution was installed --multi-version, before you can
import modules from this package in an application, you will need to
'import pkg_resources' and then use a 'require()' call similar to one of
these examples, in order to select the desired version:

    pkg_resources.require("Genshi")  # latest installed version
    pkg_resources.require("Genshi==0.6")  # this exact version
    pkg_resources.require("Genshi>=0.6")  # this version or higher

然后删除目录:

rm -rf /usr/local/lib/python2.6/dist-packages/Genshi-0.6-py2.6.egg

]]>
https://www.qingran.net/2011/01/%e5%88%a0%e9%99%a4python-easy_install%e5%ae%89%e8%a3%85%e8%bd%af%e4%bb%b6/feed/ 1 791
Git server安装笔记 https://www.qingran.net/2010/12/git-server%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/ https://www.qingran.net/2010/12/git-server%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/#comments Sat, 18 Dec 2010 14:06:29 +0000 https://www.qingran.net/?p=734 因为Mercurial缺乏对100MB+的binary文件支持,所以今天又把Git装上测试一下,环境是在一台Ubuntu 10.04 amd64 server edition机器上,通过http访问Git。

首先升级系统到最新:

#apt-get update && apt-get upgrade

安装Git

#apt-get install git git-core gitosis
#mkdir /var/www/code.git && cd /var/www/code.git
#git --bare init && git update-server-info
#chown -R www-data:www-data .

配置Apache2

#apt-get install apache2 apache2-mpm-prefork

在/etc/apache2/conf.d中加入git.conf

<Location /code.git>
DAV on
AuthType Basic
AuthName "Git"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
</Location>

重启apache2
# service apache2 restart

Done.

参考文档 how to setup a git server – The Linux Kernel Archives

]]>
https://www.qingran.net/2010/12/git-server%e5%ae%89%e8%a3%85%e7%ac%94%e8%ae%b0/feed/ 1 734
用Linux Kernel源代码绘制的企鹅 https://www.qingran.net/2010/08/%e7%94%a8linux-kernel%e6%ba%90%e4%bb%a3%e7%a0%81%e7%bb%98%e5%88%b6%e7%9a%84%e4%bc%81%e9%b9%85/ https://www.qingran.net/2010/08/%e7%94%a8linux-kernel%e6%ba%90%e4%bb%a3%e7%a0%81%e7%bb%98%e5%88%b6%e7%9a%84%e4%bc%81%e9%b9%85/#comments Fri, 20 Aug 2010 15:46:38 +0000 https://www.qingran.net/?p=619 刚看到一张由专业的海报设计公司Postertext设计的Linux海报,它由Kernel 2.6.34.1版本的源代码“绘制”而成,取自以下部分:sched.c、sched_clock.c、sched_cpupri.c、sched_cpupri.h、sched_debug.c、sched_fair.c。

Postertext是一家海报设计公司,专业从事将文学名著作品以文字形式制作成海报。日前Postertext完成一件新的作品,那就是用Linux Kernel源代码完成的Linux企鹅海报。

]]>
https://www.qingran.net/2010/08/%e7%94%a8linux-kernel%e6%ba%90%e4%bb%a3%e7%a0%81%e7%bb%98%e5%88%b6%e7%9a%84%e4%bc%81%e9%b9%85/feed/ 1 619
解决evince中文乱码 https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/ https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/#respond Tue, 06 Jul 2010 06:12:22 +0000 https://www.qingran.net/?p=492 evince打开中文pdf的时候经常是乱码,今天实在忍不了了,google了一翻,其实解决方案很简单:

sudo apt-get install poppler-data
]]>
https://www.qingran.net/2010/07/%e8%a7%a3%e5%86%b3evince%e4%b8%ad%e6%96%87%e4%b9%b1%e7%a0%81/feed/ 0 492
GNU/Linux笔记本CPU频率调整 https://www.qingran.net/2010/07/gnulinux%e7%ac%94%e8%ae%b0%e6%9c%accpu%e9%a2%91%e7%8e%87%e8%b0%83%e6%95%b4/ https://www.qingran.net/2010/07/gnulinux%e7%ac%94%e8%ae%b0%e6%9c%accpu%e9%a2%91%e7%8e%87%e8%b0%83%e6%95%b4/#respond Mon, 05 Jul 2010 06:57:26 +0000 https://www.qingran.net/?p=349 笔记本电脑的CPU频率可以使用cpufrequtils来调整。

cpu频率有五档:available cpufreq governors: conservative, ondemand, userspace, powersave, performance。默认是ondemand。

先安装:

sudo apt-get install cpufrequtils

具体使用方法:
sudo cpufreq-set -g 模式

sudo cpufreq-set -g powersave //设置为最低

sudo cpuferq-set -c <cpuid> 设置单个CPU的模式

sudo  cpuferq-set -c 1 -g powersave //双核cpu 设置第二个

sudo cpufreq-set -f 你所需要的频率
sudo cpufreq-set -d 频率下限
sudo cpufreq-set -u 频率上限

更多的请使用万能的“man“吧。

]]>
https://www.qingran.net/2010/07/gnulinux%e7%ac%94%e8%ae%b0%e6%9c%accpu%e9%a2%91%e7%8e%87%e8%b0%83%e6%95%b4/feed/ 0 349
建立Debian APT mirror https://www.qingran.net/2010/06/%e5%bb%ba%e7%ab%8bdebian-apt-mirror/ https://www.qingran.net/2010/06/%e5%bb%ba%e7%ab%8bdebian-apt-mirror/#comments Wed, 30 Jun 2010 08:48:37 +0000 https://www.qingran.net/?p=444 最近在公司内网给开发组内的兄弟建Xen虚拟机,guest装的都是debian lenny,所以就在内网做了一个apt mirror,笔记如下。

0,安装apt-mirror

apt-get install apt-mirror

1,修改/etc/apt/mirror.list为以下内容

# 同时发起的wget数,根据自己网络调整
set nthreads 20

set _tilde 0

deb http://mirrors.163.com/debian stable contrib main non-free

deb-src http://mirrors.163.com/debian stable contrib main non-free

clean http://ftp.us.debian.org/debian

2, 下载源,这个进行了1整夜。

apt-mirror

3,修改web server配置,指向下载的目录 ,以nginx的配置为例:

location ^~ /debian {

root /var/spool/apt-mirror/mirror/mirrors.163.com/;

autoindex on;

}

然后重启nginx

4,修改使用此mirror的debian /etc/apt/sources.llist 文件

deb http://mirrors.163.com/debian stable contrib main non-free

deb-src  http://mirrors.163.com/debian stable contrib main non-free

5,同步apt

apt-get update

开始使用吧。

]]>
https://www.qingran.net/2010/06/%e5%bb%ba%e7%ab%8bdebian-apt-mirror/feed/ 2 444
*nix软件包管理系统常用命令 https://www.qingran.net/2010/06/nix%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/ https://www.qingran.net/2010/06/nix%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/#respond Fri, 04 Jun 2010 02:36:12 +0000 https://www.qingran.net/?p=395 FreeBSD ports,Gentoo Portage,Debian dpkg,Mac OS X MacPorts常用命令汇编
FreeBSD Ports Packages Gentoo Portage Debian dpkg Mac OS X macports
安装 Ports: make install
Packages: pkg_add pkgname
emerge pkgname apt-get install pkgname port install pkgname
卸载 pkg_delete pkgname emerge –remove pkgname dpkg -r pkgname;apt-get remove pkgname port uninstall pkgname
列出系统所有包 pkg_info equery list dpkg -l port list
查看一个包所含文件 pkg_info -L pkgname equery files dpkg -L pkgname port contents pkgname
查看文件所属包 pkg_info -W filename equry b filename dpkg -S filename
查看包被谁依赖 equery d pkgname apt-cache rdepends pkgname port dependents pkgname
查看包依赖谁 pkg_info -r pkgname emerge –pretend pkgname dpkg -s pkgname port deps pkgname
更新已安装包 portupgrade pkgname emerge -uDN pkgname apt-get upgrade pkgname port upgrade pkgname
升级所有包 portupgrade -far emerge -uDN world apt-get dist-upgrade port upgrade outdated
]]>
https://www.qingran.net/2010/06/nix%e5%8c%85%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4/feed/ 0 395
获得MySQL/PostgreSQL的内存占用比例的脚本 https://www.qingran.net/2010/05/%e8%8e%b7%e5%be%97mysqlpostgresql%e7%9a%84%e5%86%85%e5%ad%98%e5%8d%a0%e7%94%a8%e6%af%94%e4%be%8b%e7%9a%84%e8%84%9a%e6%9c%ac/ https://www.qingran.net/2010/05/%e8%8e%b7%e5%be%97mysqlpostgresql%e7%9a%84%e5%86%85%e5%ad%98%e5%8d%a0%e7%94%a8%e6%af%94%e4%be%8b%e7%9a%84%e8%84%9a%e6%9c%ac/#comments Mon, 24 May 2010 07:32:31 +0000 https://www.qingran.net/?p=364 获得MySQL/PostgreSQL在GNU/Linux和FreeBSD下的内存占用比例:

GNU/Linux系统

MySQL

ps -o pmem,comm ax  | grep mysql | awk '{SUM+=$1}END{print SUM}'

PostgreSQL

ps -o pmem,comm ax  | grep postgre | awk '{SUM+=$1}END{print SUM}'

FreeBSD系统

MySQL

ps -o pmem,comm -wuax | grep mysql | awk '{SUM+=$1}END{print SUM}'

PostgreSQL

ps -o pmem,comm -wuax | grep postgre | awk '{SUM+=$1}END{print SUM}'

其他进程也可以如法泡制~

]]>
https://www.qingran.net/2010/05/%e8%8e%b7%e5%be%97mysqlpostgresql%e7%9a%84%e5%86%85%e5%ad%98%e5%8d%a0%e7%94%a8%e6%af%94%e4%be%8b%e7%9a%84%e8%84%9a%e6%9c%ac/feed/ 1 364
GNU/Linux 安装IPSec VPN https://www.qingran.net/2010/05/gnulinu%e5%ae%89%e8%a3%85ipsec-vpn/ https://www.qingran.net/2010/05/gnulinu%e5%ae%89%e8%a3%85ipsec-vpn/#comments Thu, 06 May 2010 08:14:15 +0000 https://www.qingran.net/?p=307 在前面的一篇日志中详细说明了如何建立基于pptpd的VPN,由于pptpd脆弱的安全性和较低的性能,本文介绍一下IPSec VPN的架设。

一下的内容以ubuntu/debian发行版为例。

1,安装 IPSec。IPSec 会对 IP 数据包进行加密和验证。这意味着你的电脑 / 移动设备与服务器之间传输的数据无法被解密、也不能被伪造。我推荐用 openswan 这个后台软件包来跑 IPSec。

用以下命令安装 openswan:

sudo aptitude install openswan

2,用文字编辑器打开 /etc/ipsec.conf,改成这样:

version 2.0
config setup
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey

conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=YOUR.SERVER.IP.ADDRESS
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

3,修改 /etc/ipsec.secrets:

YOUR.SERVER.IP.ADDRESS   %any:  PSK "YourSharedSecret"

把“YOUR.SERVER.IP.ADDRESS”,这部分换成你的服务器的 IP 地址,把“YourSharedSecret”

4、运行以下命令:

for each in /proc/sys/net/ipv4/conf/*
do
    echo 0 > $each/accept_redirects
    echo 0 > $each/send_redirects
done

5,检查一下 IPSec 能否正常工作:

sudo ipsec verify

如果在结果中看到「Opportunistic Encryption Support」被禁用了,没关系,其他项 OK 即可。

6,重启 openswan:

sudo /etc/init.d/ipsec restart

7,安装 L2TP。常用的 L2TP 后台软件包是 xl2tpd,它和 openswan 是同一帮人写的。

运行以下命令:

sudo aptitude install xl2tpd

8,用文字编辑器打开 /etc/xl2tpd/xl2tpd.conf,改成这样:

[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255
local ip = 10.1.2.1
;require chap = yes
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

这里要注意的是 ip range 一项里的 IP 地址不能和你正在用的 IP 地址重合,也不可与网络上的其他 IP 地址冲突。

9,安装 ppp。这是用来管理 VPN 用户的。

sudo aptitude install ppp

10,检查一下 /etc/ppp 目录里有没有 options.xl2tpd 这个文件,没有的话就建一个,文件内容如下:

require-mschap-v2
ms-dns 208.67.222.222
ms-dns 208.67.220.220
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

注意 ms-dns 两行我填的是 OpenDNS。如果你想用其他的 DNS 服务器(例如谷歌的公共 DNS),请自行更换。

11,现在可以添加一个 VPN 用户了。用文字编辑器打开 /etc/ppp/chap-secrets:

# user      server      password            ip
test        l2tpd       testpassword        *

如果你之前设置过 PPTP VPN,chap-secrets 文件里可能已经有了其他用户的列表。你只要把 test l2tpd testpassword * 这样加到后面即可。

12,重启 xl2tpd:

sudo /etc/init.d/xl2tpd restart

13,设置 iptables 的数据包转发:

iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

14,因为某种原因,openswan 在服务器重启后无法正常自动,所以我们可以在 /etc/rc.local 文件里写入如下语句:

iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
for each in /proc/sys/net/ipv4/conf/*
do
    echo 0 > $each/accept_redirects
    echo 0 > $each/send_redirects
done
/etc/init.d/ipsec restart

到这里,设置工作已经基本完成。你可以用 iPhone 或 iPad 试着连一下。记得在「Secret」中填入你在上述第三步里填的 YourSharedSecret。

如果连接成功,上网也没问题的话,恭喜你,大功告成。如果连不上,恐怕还得多做一步。

Ubuntu 9.10 自带的 openswan 版本是 2.6.22, Debian Lenny 带的版本是 2.4.12。这两个版本的 openswan 都有问题。我们的测试结果表明,2.6.24 版的 openswan 可以在上述两版的 Linux 操作系统下正常工作。所以如果做完以上十四步还是连不上的话,请考虑从源码编译 openswan 2.6.24 :

sudo aptitude install libgmp3-dev gawk flex bison
wget http://www.openswan.org/download/openswan-2.6.24.tar.gz
tar xf openswan-2.6.24.tar.gz
cd openswan-2.6.24
make programs
sudo make install

编译需要一段时间。你的 Linux 内核版本需要高于 2.6.6。

然后可以删除原先通过 aptitude 安装的 openswan,并重启之:

sudo aptitude remove openswan
sudo /etc/init.d/ipsec restart
]]>
https://www.qingran.net/2010/05/gnulinu%e5%ae%89%e8%a3%85ipsec-vpn/feed/ 3 307
GNU/Linux使用LVS在多核、多CPU下网卡中断分配调优 https://www.qingran.net/2010/05/gnulinux%e4%bd%bf%e7%94%a8lvs%e5%9c%a8%e5%a4%9a%e6%a0%b8%e3%80%81%e5%a4%9acpu%e4%b8%8b%e7%bd%91%e5%8d%a1%e4%b8%ad%e6%96%ad%e5%88%86%e9%85%8d%e8%b0%83%e4%bc%98/ https://www.qingran.net/2010/05/gnulinux%e4%bd%bf%e7%94%a8lvs%e5%9c%a8%e5%a4%9a%e6%a0%b8%e3%80%81%e5%a4%9acpu%e4%b8%8b%e7%bd%91%e5%8d%a1%e4%b8%ad%e6%96%ad%e5%88%86%e9%85%8d%e8%b0%83%e4%bc%98/#comments Tue, 04 May 2010 09:53:15 +0000 https://www.qingran.net/?p=410 最近一个哥们在做LVS做load balance测试时发现在并发达到1w以后网卡中断只占用了一个CPU,最终导致此CPU的100%,性能再无法提升。

逐步尝试以下方法:

  1. 修改内核参数irqbalance。印象中此参数能把网卡中断平分到多个CPU上。但是查询最新文档发现此参数在最新的内核中已经不存在;
  2. 使用设备中断的smp_affinity:
    • 首先先从/proc/interrupts里查到网卡的中断号,eth0或者bg0所在行的第一列;
    • 修改/proc/irq/<中断编号>/ 下修改 smp_affinity 文件内容。这个文件是一个位掩码,01意味着只有第一个CPU能处理中断,0F意味着四个CPU都会参与处理中断。
    • 但是经过测试发现此方法能把网卡中断绑定到指定的CPU上,但是不能在多个CPU间平均分配。
  3. 使用user space态下的irqbalance daemon,未得到反馈,估计无效;
  4. 使用Intel高端网卡82575,见文档详细说明:
]]>
https://www.qingran.net/2010/05/gnulinux%e4%bd%bf%e7%94%a8lvs%e5%9c%a8%e5%a4%9a%e6%a0%b8%e3%80%81%e5%a4%9acpu%e4%b8%8b%e7%bd%91%e5%8d%a1%e4%b8%ad%e6%96%ad%e5%88%86%e9%85%8d%e8%b0%83%e4%bc%98/feed/ 1 410
epoll kqueue IOCP异步I/O模型 https://www.qingran.net/2010/03/epoll-kqueue-iocp%e5%bc%82%e6%ad%a5io%e6%a8%a1%e5%9e%8b/ https://www.qingran.net/2010/03/epoll-kqueue-iocp%e5%bc%82%e6%ad%a5io%e6%a8%a1%e5%9e%8b/#comments Wed, 10 Mar 2010 05:39:00 +0000 https://www.qingran.net/?p=146 非阻塞异步(non-blocking asynchronous)是开发高性能应用程序的基础,下文详细描述了常用的这些异步模型。

IO模型

GNU/Linux I/O模型图略:

已知的IO模型有三种:阻塞同步(blocking synchronous) ,阻塞异步(blocking asynchronous),非阻塞同步(non-blocking synchronous) 和非阻塞异步(non-blocking asynchronous) 。

阻塞同步(blocking synchronous):必须等待操作的完成,否则只有等待。在此模型中,应用程序执行一个系统调用,会导致应用程序一直阻塞,直到系统调用执行完毕(成功或返回错误码)。例如:去ATM取钱,前面有人正在取钱,你只有等待此人完成后才能开始。

典型的read/write系统调用即是阻塞同步式IO,如图所示:

阻塞异步(blocking asynchronous):select(2)和poll(2)都是这种模型,select(2)调用本身会导致系统的阻塞,但是后续的处理是异步进行的,如图所示:

非阻塞同步 (non-blocking synchronous):同步操作,但是当资源不可用时,此调用将会立即返回,并得到通知指示资源不可用;否则立即开始。对应前面取钱例子,当你发现ATM前已经有人正在取钱,你立即放弃取钱,继续干以后的事情。在open(2)文件时加入O_NONBLOCK标志的read(2)系统调用的过程如下:

非阻塞异步 (non-blocking asynchronous):异步最重要的是调用方和被调用方的非阻塞运行。我要给你指派任务;好,如果操作立即完成,你会立即返回给我结果;否则就告诉我说你在执行中,完成了再通知我,我接着干自己的事情去吧,无须等待。对应前面例子,你发现前面有人在取钱,你立即委托他帮你取钱,然后立即做下一件事,被委托人取好将交给你。自然的必须提供一种机制,以期能在任务完成时让我得到通知。GNU/Linux的aio_read(2)系统调用的示意图:

阻塞式模型的问题

首先传统的poll()和select()方式在接受大量连接请求时会有以下问题:

0,kernel<->user space的内存拷贝代价。一但一个请求到来之后,无论其是否被处理都会有一次从kernel -> user space的内存拷贝;

1,应用程序需要扫描所有已经打开的文件描述符,根据kernel标记的状态来判断其是否就绪;因为系统内核已经知道了每个FD的状态,那么在app中的这个线性操作( O(N) )显然是一个重复劳动(显而易见的一个更好方式是kernel直接把就绪的FD告诉app);

2,同时在kernel内部对于select()的实现也不理想。首先必须在内存中保存在一个所有打开FD的列表;其次在一个连接到来时,kernel需要遍历这个列表找到空闲的FD。

这个问题的根源在于操作系统内核没有去记录每个应用程序关注的FD的状态和记录应用程序对应不同状态所要应用的操作(注册回掉函数)。

而epoll/kqueue/IOCP就针对以上3个问题采用了原理相同,但是细节略有差异的解决方法。

epoll kqueue IOCP

常规的select()操作是一个同步阻塞式的操作,如果要改变它的这些不足,需要将其改变为“非阻塞的同步”或“非阻塞的异步”。

非阻塞异步的好处是程序无需以相对较高的切换开销(如前文所说开销来自kernel <-> user 的切换,找到就绪FD的开销等)。

epoll

linux kernel 2.5开始引入到2.6内核已经非常成熟,包括Edge Triggered (ET)和Level Triggered (LT)两种工作方式。

LT(level triggered,水平触发)是默认方式,并且同时支持blocking和non-blocking 的IO操作。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行后续操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。

ET(edge-triggered,边缘触发)是高速工作方式,只支持no-blocking IO。在这种模式下,当文件描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个已经就绪的文件描述符发送更多的通知,等到下次有新的文件描述符就绪才会再次出发就绪通知。

kqueue:FreeBSD 4.x引入。

IOCP:windows 2000引入。

未完,继续。

]]>
https://www.qingran.net/2010/03/epoll-kqueue-iocp%e5%bc%82%e6%ad%a5io%e6%a8%a1%e5%9e%8b/feed/ 2 146
GNU/Linux使用pptpd建立VPN网络 https://www.qingran.net/2010/02/gnulinux%e4%bd%bf%e7%94%a8pptpd%e5%bb%ba%e7%ab%8bvpn%e7%bd%91%e7%bb%9c/ https://www.qingran.net/2010/02/gnulinux%e4%bd%bf%e7%94%a8pptpd%e5%bb%ba%e7%ab%8bvpn%e7%bd%91%e7%bb%9c/#comments Mon, 22 Feb 2010 10:11:26 +0000 https://www.qingran.net/?p=123 刚刚做好,留档保存。

VPN方案以前比较熟悉的OpenVPN,不过win下需要单装客户端,所以这次就用pptpd来做,比OpenVPN简单不少。

安装pptpd

以debian/ubuntu为例

# apt-get install pptpd
# apt-get install iptables

配置pptpd

修改/etc/pptpd.conf

localip 10.0.0.1
remoteip 10.0.0.10-250

修改/etc/ppp/pptpd-options

ms-dns <your dns0>
ms-dns <your dns1>

修改密码文件 /etc/ppp/chap-secrets

第一列为用户名,第二列为/etc/ppp/pptpd-options中的name字段(默认为pptpd),第三列为密码,最后一列为允许ip(所有都允许是*)。

iptables转发:

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

sysctl打开ip_forward

sysctl net.ipv4.ip_forward=1

客户端连接:

直接在windows下建立vpn连接,走默认的即可。

完成。

]]>
https://www.qingran.net/2010/02/gnulinux%e4%bd%bf%e7%94%a8pptpd%e5%bb%ba%e7%ab%8bvpn%e7%bd%91%e7%bb%9c/feed/ 1 123
Debian Secure APT简介 https://www.qingran.net/2009/11/debian-secure-apt%e7%ae%80%e4%bb%8b/ https://www.qingran.net/2009/11/debian-secure-apt%e7%ae%80%e4%bb%8b/#comments Mon, 02 Nov 2009 10:46:44 +0000 https://www.qingran.net/?p=468 简单说一下Debian APT体系中为了保证deb包的完整性和可信,建立的一套secure apt体系。

这次升级ubuntu 9.10系统后直接把/etc/apt/sources.list里面google、opera和skype的源的地址直接拷贝了过来,结果apt-get update的时候总是报gpg签名的错误:

“W: A error occurred during the signature verification. The repository is not updated and the previous index files will be used.GPG error: http://dl.google.com stable Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY A040830F7FAC5991“

详细查探了一下原因,原来是因为debian 的 secure apt体系的约束。

secure apt也叫apt-secure是从apt 0.6版本开始引入,时间是在2003年。secure apt的作用是使用数字签名和加密对所有下载包的进行验证。

数字签名目前同时使用了md5、sha-1、sha256等三种签名方式。
首先在每个源、每种架构(i386、amd64)目录都存在了一个Packages.bz2内保存了所有包的checksum文件
例如:

wget http://archive.ubuntu.com/ubuntu/dists/lucid-security/multiverse/binary-i386/Packages.bz2
bzless Packages.bz2

可以看到如下内容:

Filename: pool/multiverse/f/flashplugin-nonfree/flashplugin-installer_10.1.53.64ubuntu0.10.04.1_i386.deb
Size: 19748
MD5sum: 9f0e2dcbdcbfe5df425334aabcd19b68
SHA1: 59dbb008eeba133a994e6a440042f49ed4876175
SHA256: 60d0ded6de08418ee99aa5d667bed9f1e4d2f76334e188b21386abdb343821f3

同时为了保证Packages.bz2的完整性呢, 又通过在的Release文件内加入对Package.bz2文件的签名来保证:
可以打开http://archive.ubuntu.com/ubuntu/dists/lucid-security/Release文件查看。

那么,Release文件的完整性如何来保证?此时为Release引入了GPG签名,可见http://archive.ubuntu.com/ubuntu/dists/lucid-security
/Release.gpg

当执行

apt-get update

apt系统先取到Release.gpg,此文件是一个GPG的签名结果,apt使用存储在/etc/apt/trusted.gpg内的GPG key对同位置下的Release文件进行签名,并把签名结果和Release.gpg进行比较,如果相同就通过,否则就会报最开始的“NO_PUBKEY”错误。

验证apt key的匹配可以通过以下步骤进行验证:

cd /var/lib/apt/lists
gpgv --keyring /etc/apt/trusted.gpg archive.ubuntu.com_ubuntu_dists_lucid-updates_Release.gpg\ archive.ubuntu.com_ubuntu_dists_lucid-updates_Release

同时列出当前的apt key(通过读取/etc/apt/trusted.gpg文件):

apt-key list

添加一个key

gpg --keyserver subkeys.pgp.net --recv-keys
gpg -a --export  | sudo apt-key add -

同时查看一个软件包的HASH签名:

apt-cache show  | egrep '(^MD5|^SHA1|^SHA256)'

参考资料
http://wiki.debian.org/SecureApt

]]>
https://www.qingran.net/2009/11/debian-secure-apt%e7%ae%80%e4%bb%8b/feed/ 1 468
GNU/Linux下更好的使用Thinkpad的键盘灯 https://www.qingran.net/2009/08/gnulinux%e4%b8%8b%e6%9b%b4%e5%a5%bd%e7%9a%84%e4%bd%bf%e7%94%a8thinkpad%e7%9a%84%e9%94%ae%e7%9b%98%e7%81%af/ https://www.qingran.net/2009/08/gnulinux%e4%b8%8b%e6%9b%b4%e5%a5%bd%e7%9a%84%e4%bd%bf%e7%94%a8thinkpad%e7%9a%84%e9%94%ae%e7%9b%98%e7%81%af/#respond Tue, 11 Aug 2009 06:37:09 +0000 https://www.qingran.net/?p=66 让广大“黑友”的thinklight更好的发挥作用。

Thinkpad屏幕顶部的键盘灯是个很有创意的设计,这个和小红点一起构成了Thinkpad的重要特色功能。

比如收到邮件后,thinklight闪烁;pidgin收到消息后,thinklight闪烁提醒。

pidgin通过pidgin-blinklight插件即可实现。

debian/ubuntu用户需要安装:

#apt-get install pidgin-blinklight

然后在pidgin的”工具” -> “插件”内启用,这样在pidgin收到消息时thinklight能闪烁三下。

同时在收到Email的时候也可以让thinklight来进行提醒,如果是evolution的,使用thinklight-notification 就可以实现,详细见:http://ubuntuforums.org/showthread.php?t=1017263

下面详细说一下thunderbird收到邮件时的thinklight闪烁。

安装thunderbird插件yamb,http://www.globs.org/download.php?lng=en。

进入thunderbird,在“工具” -> “附加软件”,进入“Yet Another Mail Biff”的配置,在”External notifier executable”内加入如下代码的执行路径:

=============================================
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
import time
import sys
import signal

TL_PROC_FILE =  “/proc/acpi/ibm/light”
PID_FILE =  “/tmp/thinklightblink.pid”

def blink(second, filepath = TL_PROC_FILE):
try:
# open light
fp = open(filepath, “w”)
fp.seek(0)
fp.write(“on”)
fp.flush()

time.sleep(second)

fp.seek(0)
fp.write(“off”)
fp.close()
return
except Exception, inst:
print inst
return

def writepid(filepath = PID_FILE):
try:
pid = os.getpid()
fp = open(filepath, “w”)
fp.write(str(pid))
fp.close()
return
except Exception, inst:
print inst
return

def delpid(filepath = PID_FILE):
try:
if os.path.isfile(filepath):
os.remove(filepath)

return
except Exception, inst:
print inst
return

def getpid(filepath = PID_FILE):
try:
if os.path.isfile(filepath):
return int(open(filepath).read())
else:
return None
except Exception, inst:
print inst
return None

if __name__ == “__main__”:
try:
os.kill(getpid(), signal.SIGTERM)
except:
pass

writepid()

blink(1)
delpid()
=============================================

完成。测试一下thunderbird收到邮件时thinklight是否会闪动一下 😀

手动操作thinklight的方法:
echo ‘on’ > /proc/acpi/ibm/light
echo ‘off’ > /proc/acpi/ibm/light
echo 255 > /sys/class/leds/tpacpi::thinklight/brightness
echo 0 > /sys/class/leds/tpacpi::thinklight/brightness

参考文档:
http://www.thinkwiki.org/wiki/ThinkLight
http://blog.wahlig.eu/2008/04/thinklight-mail-notification.html

]]>
https://www.qingran.net/2009/08/gnulinux%e4%b8%8b%e6%9b%b4%e5%a5%bd%e7%9a%84%e4%bd%bf%e7%94%a8thinkpad%e7%9a%84%e9%94%ae%e7%9b%98%e7%81%af/feed/ 0 66
解决pgpool2.2.2在PostgreSQL8.4.0下无法使用问题 https://www.qingran.net/2009/08/%e8%a7%a3%e5%86%b3pgpool2-2-2%e5%9c%a8postgresql8-4-0%e4%b8%8b%e6%97%a0%e6%b3%95%e4%bd%bf%e7%94%a8%e9%97%ae%e9%a2%98/ https://www.qingran.net/2009/08/%e8%a7%a3%e5%86%b3pgpool2-2-2%e5%9c%a8postgresql8-4-0%e4%b8%8b%e6%97%a0%e6%b3%95%e4%bd%bf%e7%94%a8%e9%97%ae%e9%a2%98/#respond Sat, 08 Aug 2009 10:18:08 +0000 https://www.qingran.net/?p=1102 PostgreSQL从8.3.x升级到8.4.0后,pgpool-II的最新版2.2.2无法编译通过,报以下错误:


sed 's,MODULE_PATHNAME,$libdir/pgpool-recovery,g' pgpool-recovery.sql.in >pgpool-recovery.sql
cc -O2 -fno-strict-aliasing -pipe -O3 -funroll-loops -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fwrapv -fPIC -DPIC -I. -I/usr/local/include/postgresql/server -I/usr/local/include/postgresql/internal -I/usr/local/include -c -o pgpool-recovery.o pgpool-recovery.c
pgpool-recovery.c: In function `pgpool_recovery':
pgpool-recovery.c:47: error: `textout' undeclared (first use in this function)
pgpool-recovery.c:47: error: (Each undeclared identifier is reported only once
pgpool-recovery.c:47: error: for each function it appears in.)
pgpool-recovery.c: In function `pgpool_remote_start':
pgpool-recovery.c:79: error: `textout' undeclared (first use in this function)
gmake: *** [pgpool-recovery.o] Error 1
*** Error code 2

经过查找,应该是PostgreSQL 8.4.0的include头文件有了一些改动造成。
解决方法:
在pgpool-II 2.2.2的源代码文件 sql/pgpool-recovery/pgpool-recovery.c 第40行加入:

extern Datum textout (PG_FUNCTION_ARGS);

即可!

]]>
https://www.qingran.net/2009/08/%e8%a7%a3%e5%86%b3pgpool2-2-2%e5%9c%a8postgresql8-4-0%e4%b8%8b%e6%97%a0%e6%b3%95%e4%bd%bf%e7%94%a8%e9%97%ae%e9%a2%98/feed/ 0 1102