Linux应用心得(三)

写这篇文章是为了方便自己,也同时为了方便他人。

目前的开源软件盛行,很多的README文档都是以英文的形式出现,很多懒人不愿意去读此类的文章,所以遇到问题也不会知道怎么去解决。

Linux应用心得已经在《My Study》中发布了二期,虽然以FAQ形式的出现,但是由于Linux应用的突飞猛进,很多的问答已经变得很苍白,但是我希望还是能够体现Linux中一种自由、开放的精神,让更多的人得到帮助。
如果你对太多的A、Q 不知所措,可以Ctrl+F查找你所需要的问题。

Q00105:
在Linux平台上,大量出现"too many open files"的error信息,如何解决?
A00105:
这个错误产生的原因是操作系统对同时能打开的文件句柄数量有限制,使用"ulimit -a"命令可以查看限制的大小,默认为1024。

$ ulimit -a
open files (-n) 1024

解决办法如下:
(1)修改/etc/security/limits.conf
在最底下增加一行
* - nofile 65535

(2)修改/etc/pam.d/login
在最底下增加一行
session required /lib/security/pam_limits.so

(3)使用命令logout登出后再login,使用命令ulimit -a看看open files是不是改变了。


Q00106:
在使用PHP中Cookie的过程里,发现如论如何也不能使用setcookie这个函数,返回值一直为0,为什么setcookie函数会失效呢?
A00106:
往往神秘的现象背后都是有产生神秘现象的条件,这个也不例外。
经过调试可以发现,单条session的cookie可以正常运转,但是一旦集成,则失效,检查php的配置文件php.ini文件,发现这个文件根本不存在。于是从php源代码中将php.ini-recommended拷贝到配置路径下为php.ini,发现一切正常,神秘现象消失。


Q00107:
在gnome的环境中,eclipse按钮无法响应,怎么解决?
A00107:
这是由于gtk的问题,在
/usr/bin/eclipse启动脚本中
加入

export GDK_NATIVE_WINDOWS=1


Q00108:
如何解决 Freemind 中文字体乱码?
A00108:
由于 Freemind 要应用到 Java 运行时环境,显示中文字体乱码是由于 JRE 的字体造成的,所以更改 JRE 的字体即可。
找一个可用于中文显示的字体。比如: wqy 字体,我这里采用正黑。
确认字体已经安装于系统。我的系统增黑字体安装于:

/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc

找到 JRE 的字体目录,位于:
/usr/lib/jvm/java-6-sun/jre/lib/fonts

如果没有,则创建该字体目录:
$ cd /usr/lib/jvm/java-6-sun/jre/lib/fonts/
$ mkdir fallback
$ ln -s /usr/share/fonts/truetype/wqy/wqy-zenhei.ttc wqy-zenhei.ttc
$ mkfontdir
$ mkfontscale
$ fc-cache

末了,重启 Freemind 即可。


Q00109:
在Eclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:


Access restriction : The type BASE64Decoder is not accessible due to restriction on required library /usr/java/default/jre/lib/rt.jar
Access restriction : The constructor BASE64Decoder() is not accessible due to restriction on required library /usr/java/default/jre/lib/rt.jar

搞不懂是为什么?
A00109:
解决方案如下:
只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。


Q00110:
在RHEL 5.2中,使用vsftpd,如何根据防火墙设置了被动模式?使用了pam验证,发现输入了用户名称和密码怎么也通不过其验证,这个是怎么回事呢?
A00110:
首先,我们需要检查vsftpd安装的正确性,一般rpm或yum安装都无特殊问题,但是如果是编译安装,则需要注意源码中 (1)配置文件的路径

defs.h:#define VSFTP_DEFAULT_CONFIG "/etc/vsftpd/vsftpd.conf"

(2)安装的位置,默认为/usr/local/sbin,很容易造成使用原先的vsftpd问题。
(3)lib64的问题,如果使用x86_64位系统,还需要注意脚本vsf_findlibs.sh找到lib的位置信息。
(4)libpam的问题,一般密码验证有问题都会出现在这,使用:

$ ldd vsftpd
libpam.so.0 => /lib64/libpam.so.0 (0x00002aba248b0000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003794600000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x0000003797600000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x000000379a600000)
libcap.so.1 => /lib64/libcap.so.1 (0x0000003798200000)
libc.so.6 => /lib64/libc.so.6 (0x0000003794200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003793e00000)

看libpam.so.0是否存在,如果不存在的话(一般RHEL5),需要重新安装pam库,才能将pam库链接编译到vsftpd中去。
接着,配置vsftpd.conf,整个vsftpd.conf如下所示:

anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
listen=YES
listen_port=21
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/vsftpd.user_list
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_enable=YES
pasv_address=xxx.yyy.zzz.nnn
pasv_min_port=62007
pasv_max_port=62009
virtual_use_local_privs=YES
tcp_wrappers=YES

根据配置文件,需要(1)增加虚拟用户
$ useradd vuser -s /sbin/nologin

(2)设置虚拟用户中ftp用户,这里使用Berkeley DB的工具来生成用户名和密码如下:
db_load -T -t hash -f ftpusers /etc/vsftpd/vsftpd_login.db

其中ftpusers为文本,内容大概形式如下:
$ cat ftpusers
user1
password1
user2
password2
cnangel
cnangel
...

(3)设置用户登录路径

$ cat /etc/vsftpd/vsftpd.user_list/cnangel
local_root=/home/vuser/cnangel
write_enable=YES
local_umask=022
chmod_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES

最后在/etc/pam.d增加验证配置文件vsftpd(/etc/pam.d/vsftpd),内容如下:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

如果使用x86_64位系统,还需要注意库文件pam_userdb.so的路径问题。
(4)最后连接ftp进行测试

[cnangel@cadev12 ~]$lftp 10.19.86.8 -u cnangel
口令:
lftp cnangel@10.19.86.8:~> debug
lftp cnangel@10.19.86.8:~> set ftp:passive-mode on
lftp cnangel@10.19.86.8:~> ls
---- 正在连接到 10.19.86.8 (10.19.86.8) 端口 21
<--- 220 Welcome to Cnangel FTP service.
---> FEAT
<--- 211-Features:
<--- EPRT
<--- EPSV
<--- MDTM
<--- PASV
<--- REST STREAM
<--- SIZE
<--- TVFS
<--- UTF8
<--- 211 End
---> OPTS UTF8 ON
<--- 200 Always in UTF8 mode.
---> USER cnangel
<--- 331 Please specify the password.
---> PASS XXXX
<--- 230 Login successful.
---> PWD
<--- 257 "/"
---> PASV
<--- 227 Entering Passive Mode (10,19,86,144,194,197).
---- 正在建立数据连接到 (10.19.86.8) 端口 49861
---> LIST
<--- 150 Here comes the directory listing.
<--- 226 Directory send OK.
---- 关闭数据连接
-rw-r--r-- 1 cnangel users 0 Dec 14 04:46 aa
-rw-r--r-- 1 cnangel users 255251 Dec 14 04:45 king02.pdf
lftp cnangel@10.19.86.8:/> exit
---> QUIT
---- 关闭控制连接
[cnangel@cadev12 ~]$

看看是否还有问题。


Q00111:
自己编译svn上传代码是报这样的错误:


svn: SSL is not supported

如何让让svn支持ssl?
A00111:
subversion对https链接的支持集成在neon这个组件中。可以下载了一个最新版的neon,用下面的指令编译

./configure --with-ssl -with-zlib --enable-shared --enable-static --prefix=/usr

这样加入ssl的支持,可以使用neon-config程序来确认编译成功:

[cnangel@localhost ~]$neon-config --libs
-lneon -lz -L/usr/kerberos/lib -L/usr/kerberos/lib64 -lssl -lcrypto -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto -lresolv -ldl -lz -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv -lexpat

Q00112:
如何在shell中将汉字urlencode化?
A00112:
这里有很多种解决办法:
(1)调用perl

echo -n "中国" | perl -MURI::Escape -e "print uri_escape(<>);"

(2)调用php
php -r "echo rawurlencode('$(sed "s/'/\\\\'/g" <<< "中国")');"

(3)其它
echo -n "中国"|od -An -tx1|tr ' ' %

上面三种结果都是%e4%b8%ad%e5%9b%bd。


Q00113:
在链接libmysqlclient的时候,发现出现如下错误:

/usr/lib64/mysql/libz.a(adler32.o)(.text+0x0): In function `adler32':
/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/adler32.c:66: multiple definition of `adler32'
/usr/lib64/mysql/libmysqlclient.a(adler32.o)(.text+0x0):/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/adler32.c:66: first defined here
/usr/lib64/mysql/libz.a(adler32.o)(.text+0x340): In function `adler32_combine':
/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/adler32.c:138: multiple definition of `adler32_combine'
/usr/lib64/mysql/libmysqlclient.a(adler32.o)(.text+0x340):/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/adler32.c:138: first defined here
/usr/lib64/mysql/libz.a(compress.o)(.text+0x0): In function `compress2':
/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/compress.c:28: multiple definition of `compress2'
/usr/lib64/mysql/libmysqlclient.a(compress.o)(.text+0x0):/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/compress.c:28: first defined here
/usr/lib64/mysql/libz.a(compress.o)(.text+0xf0): In function `compress':
/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/compress.c:68: multiple definition of `compress'
/usr/lib64/mysql/libmysqlclient.a(compress.o)(.text+0xf0):/export/home/my/tmp-200903301116-5.1.34-19266/rpm/BUILD/mysql-5.1.34/zlib/compress.c:68: first defined here
...

该如何解决?
A00113:
从libmysqlclient.a中删除所有有问题的.o文件即可:
# cp -p /usr/lib/mysql/libmysqlclient.a /usr/lib/mysql/libmysqlclient.a.orig
# ar d /usr/lib/mysql/libmysqlclient.a adler32.o compress.o crc32.o deflate.o gzio.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
原文见:http://www.root0.net/php/index.html#Some_problems


Q00114:
在x86_64平台下,使用jni的时候发现调用jni出现如下错误:

libextractorJni-1.0.0.so.1.0.0: cannot open shared object file: No such file or directory (Possible cause: architecture word width mismatch)

到底怎么解决呢?
A00114:
这个变态的问题发现java的jdk版本是32位所致,安装x86_64位的jdk即可。


Q00115:
刚要删除一个tmp目录下临时文件
由于tmp目录下的临时文件数目太多

rm -rf tmp/*
执行的结果是
bash: /bin/rm: Argument list too long

A00115:
解决办法如下:
ls | xargs -n 10 rm -fr

Q00116:
编译vim的时候,指定configure选项:

./configure --prefix=$HOME/opt/usr --enable-multibyte --enable-cscope --enable-perlinterp

发现执行后,出现如下错误:
checking --with-tlib argument... empty: automatic terminal library selection
checking for tgetent in -lncurses... no
checking for tgetent in -ltermlib... no
checking for tgetent in -ltermcap... no
checking for tgetent in -lcurses... no
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
You need to install a terminal library; for example ncurses.
Or specify the name of the library with --with-tlib.

检查ncurses是否安装:
rpm -q ncurses
发现ncurses已经安装过了,如何解决这个configure配置问题呢?
A00116:
安装ncurses-devel或termcap-devel包即可,或者编译安装ncurses软件包。


Q00117:
如果要清空memcache的items,常用的办法是什么?
A00117:
假设memcached运行在本地的11211端口,那么跑一下命令行:

$ echo ”flush_all” | nc localhost 11211

注:flush并不会将items删除,只是将所有的items标记为expired。

Q00118:
在使用gcc编译时,加上了一些测试的选项:

-fprofile-arcs -ftest-coverage

然后编译时,发现出现如下错误:
/usr/lib/gcc/i686-redhat-linux/4.4.4/libgcov.a(_gcov.o): In function `__gcov_init':
(.text+0x160): undefined reference to `__stack_chk_fail_local'
/usr/lib/gcc/i686-redhat-linux/4.4.4/libgcov.a(_gcov.o): In function `gcov_exit':
(.text+0x148e): undefined reference to `__stack_chk_fail_local'
/usr/bin/ld: .libs/libcpssqclient.so.0.0.0: hidden symbol `__stack_chk_fail_local' isn't defined
/usr/bin/ld: final link failed: Nonrepresentable section on output

应该如何解决呢?
A00118:
如果是gcc,则在CFLAGS选项上加上:
-fstack-protector -fstack-protector-all

如果是g++,则在CXXFLAGS选项上加上:
-fstack-protector -fstack-protector-all


Q00119:
使用SSH-Batch或者crontab的时候sudo经常会碰到这个情况:

sudo: sorry, you must have a tty to run sudo

如何解决?
A00119:
修改一下sudo的配置就好了
vi /etc/sudoers (最好用visudo命令)
注释掉 Default requiretty 一行
#Default requiretty
意思就是sudo默认需要tty终端。注释掉就可以在后台执行了。

Categories

,
|

July 2010

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

关于此日记

此日记由 Cnangel 发表于 December 8, 2009 6:52 PM

此Blog上的上一篇日记关于DES加解密揭秘

此Blog上的下一篇日记关于stlchina.org的问题

首页归档页可以看到最新的日记和所有日记。

归档

Powered by Movable Type 5.02