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终端。注释掉就可以在后台执行了。


Q00120:
在安装FreeBSD 8.1的Linux二进制兼容包的时候,发现安装不了,提示错误:

linux_base-f10-10_2 linuxulator is not (kld)loaded.
*** Error code 1

如何解决呢?
A00120:
在安装过程中,先忽略(不安装)这个兼容包。等FreeBSD系统安装好,初始化成功后,我们使用sysinstall进行安装,不过使用sysinstall安装之前,需要执行(见:http://www.freebsd.org/doc/handbook/linuxemu-lbc-install.html):
kldload linux

然后使用命令sysintallConfigure => Packages => CD/DVDs => linux => linux_base-xxx
安装即可。


Q00121:
使用openssh、SSH-Batch等工具的时候发现出现如下错误:


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

该怎么解决呢?
A00121:
使用命令visudo或者编辑/etc/sudoers(不建议直接编辑这个文件),注释或去掉:
Defaults requiretty

这一行即可。


Q00122:
GDB跟到某个程序语句,该语句里有变量nTmp,使用print nTmp查看其变量值时,GDB提示:

No symbol "nTmp" defined in current context.

A00122:
出现此问题的原因可能是编译时局部变量被优化到寄存器里了,此时是无法在内存中查看变量的值的。
解决方法:
CFLAGS=-gstabs+

参见“Debuging with GDB”8.2节:
Another possible efect of compiler optimizations is to optimize unused variables out of
existence, or assign variables to registers (as opposed to memory addresses). Depending
on the support for such cases o ered by the debug info format used by the compiler, gdb
might not be able to display values for such local variables. If that happens, gdb will print
a message like this:
No symbol "foo" in current context.
To solve such problems, either recompile without optimizations, or use a di erent debug
info format, if the compiler supports several such formats. For example, gcc, the gnu
C/C++ compiler usually supports the ‘-gstabs+’ option. ‘-gstabs+’ produces debug info
in a format that is superior to formats such as COFF. You may be able to use DWARF
2 (‘-gdwarf-2’), which is also an e ective form for debug info.

Q00123:
ssh使用选项-X到一台服务器上的时候,发现xclock显示不了始终,提示:

Error: Can't open display:

Failed to open the X11 display!

到底怎么才能显示呢?
A00123:
修改/etc/ssh/sshd_config,将X11Forwarding设置为yes即可。


Q00124:
使用sudo的时候发现sudo用户使用不了,/etc/sudoers配置文件也没有权限的配置错误,但root用户是可以使用sudo的,sudo的用户提示如下错误:

sudo: pam_authenticate: Module is unknown

该如何解决?
A00124:
这个是某个版本sudo的bug,目前最好的方式是更新版本或者会滚版本进行解决,建议使用对应版本的二进制包,而不要使用最新源码的编译方式。


Q00125:
使用mysql客户端连接mysql数据库,发现出现错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/home/mysql/mysql.sock' (13)

怎么解决呢?
A00125:
这个是由于mysql的datadir目录没有权限读写所造成的,一般赋予权限即可:
sudo chown -R mysql.mysql /home/mysql
sudo chmod 0755 /home/mysql

看看是不是可以了呢?


Q00126:
修改程序崩溃时产生core文件的大小时:

ulimit -c unlimited

发现提示:
bash: ulimit: core file size: cannot modify limit: Operation not permitted

如何解决?
A00126:
检查PAM的配置文件:/etc/security/limits.conf以及/etc/security/limits.d/目录权限是否正确,一般文件是644权限。

Q00127:
Zend文件上传之后,运行发现这样的错误提示:

Fatal error: Unable to read 65535 bytes in /home/cnangel/public_html/ebank.inc.php on line 0

如何解决?
A00127:
刚开始以为是Zend的版本不对,折腾了半天才发现原来是二进制传输的问题。如果您的程序出现这个错误,一般是由于该程序自身,或其引用的某个文件上传不完整所致的。一般只有经过Zend加密后的文件上传不完整时才会出现这种现象。这解决方法是使用FTP先将这些文件全部删除,然后用FTP的二进制模式(BINARY)重新上传该文件以及其所引用的所有相关文件就可以解决了, 这并不是由于Zend版本不兼容所至。

Q00128:
在fedora17上打包,发现没有debuginfo的包,修改$HOME/.rpmmacros文件,增加

%debug_package 1

也起不到作用,为什么?
A00128:
fedora17与传统的RHEL4以及RHEL5有很大的差别,需要安装redhat-rpm-config包,来满足需求,具体命令如下:
yum install redhat-rpm-config

即可。

Categories

,
|

August 2012

      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.14-en