Random Tech Thoughts

The title above is not random

由配置 Apache 得到的感想

最近配置 apache 使用 mod_auth_mysql 搞的头痛了,具体的经过和解决办法在上一篇文章里已经说明。这里是一些感想,作为我第一次配置服务器的一点总结。算是经验积累吧,这次的经历让我觉得做个系统管理员其实不是那么容易的,而且很麻烦,还是写程序痛快一些。

  1. 服务器程序需要的是稳定,所以对服务器来所新版本的软件未必就是最好的,已经验证了的稳定的版本才是应该选用的。也难怪 apache 1.3 到现在还是使用最多的 apache 版本,更新总是需要付出一定风险的,系统升级也是如此。
  2. 安装使用软件一定要检查软件版本间的兼容性。有些站点使用 apache 1.3 除了升级风险以外还因为需要使用特定的模块,而这些模块可能在 apache 2 中无法使用,比如 mod_auth_sqlite 目前就只有针对 apache 1.3 的,而 apache 2.2 中的 mod_auth_dbd 不稳定,我配置时也失败了。这次 mod_auth_mysql 无法认证的时候查看配置没有问题,google 时也发现大量同样的问题但是都没有解决,其实这个时候就应该考虑是不是因为软件版本不兼容的原因了。
  3. 软件配置这类事情真的是很麻烦,因为程序不是你自己写的,没有办法调试,你也不知道问题可能出在哪里,完全就不在自己的控制之下,这种感觉真的很差。我有段时间真的是搞的心烦意乱,因为花了时间而没有一点成果而带来了极大的挫败感。以后在遇到这种事的时候应该先放一放,等平静以后再来处理。(不过有时候我就是会此事不成誓不罢休,然和就陷入到泥潭中去。)
  4. 如果有现成的捆绑好且配置好的软件还是先拿来用吧,如果捆绑了一堆无用的东西的话可以以后自己慢慢来配精简的,先解决问题再说。这次的例子就是 xampp,这个东东捆绑了 apache, mysql, php, perl, phpmyadmin, ftp-server, mail-server 等一堆东西,但是它很多配置都已经做好了,比如 php, perl 等等,拿来用是非常方便的。我一开始看到它捆了那么多东西就排斥它,但最后解决问题还是靠它,而且如果早一点用它的话可以节省不少时间了。(我先在 windows 下成功的解决了mod_auth_mysql 的问题,linux 也是靠它提醒了才想到版本兼容的问题的。)服务器配置是件麻烦事,别人做了这样的软件就是方便我们使用的,应该好好利用,也应该好好感谢那些软件的开发者。(当然对我这样的系统洁癖来说,使用这样的软件还是觉得有点不爽,所以解决问题以后我又在用 Arch 提供的软件包来配置,那个 mod_auth_mysql 的 patch 就是这时找到的)

Mod_auth_mysql & Apache 2.2

I’ve been painfully battling for several days to get mod_auth_mysql-3.0.0 to work with apache 2.2 these days. I googled a lot and had seen many people having problem about this. The configuration is all right but many people including me got the following error message from the error log

[error] Internal error: pcfg_openfile() called with NULL filename [error] [client 127.0.0.1] (9)Bad file descriptor: Could not open password file: (null)

And at last, by accident, with the help of xampp, I finally find out the cause of the problem. It’s all about the compatibility between different versions of software. My conclusion is that mod_auth_mysql works well with apache 2.0 but not apache 2.2. In fact you will have trouble with compiling mod_auth_mysql against with apache 2.2. I myself failed to compile it because of compile error. What I used with apache 2.2 was a module extracted from an rpm package. Though I started apache with out any problem with the precompiled module, the authentication doesn’t work and I got the above error message.

While I was trying xampp under Linux I found the module is not contained while the windows version contains one. Then I searched xampp addon and find that there is a precompiled mod_auth_mysql but is only for xampp 1.5.0 which using apache 2.0.55. After that, I tried apache 2.0.59 and the module compiles and every thing works.

For those who want to use mod_auth_mysql with apache 2.2, you may use a patch from Andrew’s diary, and you many need to add additional directive “AuthUserFile /dev/null”. To checkout more, see this thread in Fedora Forum.

Ies4linux

今天访问一个网站的时候必须要使用 flash player 9,想起了以前用 ies4linux 安装的 ie6,试了一下,可以访问,效果也非常好,除了启动慢一点而已。呵呵,这个东东真是强 :–)

Arch 中使用 Jdbc 连接 Mysql

这次的作业中要用数据库,所以弄这个东西,一直都觉得数据库很麻烦,这次真是令我头大了。不过问题到不是出在数据库上,而是出在 Arch 对安全的设置上。

问题出在无论怎么配置 mysql,无论怎样修改 jdbc 的测试程序都没有办法连接到 mysql 服务器。有以下几种情况:

  1. 本机只能使用 mysql -h localhost -u … -p 来登录,如果使用 ip 地址或者在 /etc/hosts 中的其他主机名则出现如下信息
    ERROR 2013 (HY000): Lost connection to MySQL server during query
    在其他机器上访问时也出现这样信息。
  2. 使用 jdbc 连接时出现如下信息:
    com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:501) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:971) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2644) at com.mysql.jdbc.Connection.(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:525) at java.sql.DriverManager.getConnection(DriverManager.java:171) at SimpleConnection.main(SimpleConnection.java:22) ** END NESTED EXCEPTION **

搞了好久要崩溃的时候机房其他的同学成功的用 jdbc 连接 mysql 服务器了,他用的是 Ubuntu,在 Ubuntu 的 Wiki 里看到要把 /etc/my.cnf 里的”bind 127.0.0.1” 去掉以使 mysql 可以通过网络访问。但是我的 my.cnf 里面默认没有这个设置。于是 Google 了 Arch 的 Wiki,找到了这篇文章。终于明白问题处在 Arch 下 /etc/hosts.deny 默认为 “ALL: ALL: DENY”,这样就阻止了通过 TCP/IP 对 mysql 服务器的访问。我在 /etc/hosts.allow 中加了 “mysqld: ALL: ALLOW” 以后再连接就成功了。

Linux-PHC & Speedstep-centrino

之前自己编译的内核没有办法使用 speedstep-centrino,只能使用 acpi-cpufreq 来控制 cpu 工作频率,但是 Arch 提供的内核确可以。于是用

locate centrino | grep /usr/src/linux

比较了一下 beyond kernel 跟 vallina kernel 中出现的文件,发现 beyond kernel 下多好几个文件,如

/usr/src/linux-2.6.17-beyond/include/config/x86/speedstep/centrino/builtin/sonoma.h /usr/src/linux-2.6.17-beyond/include/config/x86/speedstep/centrino/builtin/dothan.h /usr/src/linux-2.6.17-beyond/include/config/x86/speedstep/centrino/builtin/banias.h

于是下载了 beyond 的 patch,找到了这些 patch 的出处。原来是在Linux-PHC(Linux Process Hardware Control) ,不仅提供了 dothan, sonoma 的 built-in tables,还可以用来控制 cpu 的电压。使用这个 patch 以后 modprobe speedstep-centrino 时就可以了,不再是 “FATAL Error, … device does not exist”

Vsftpd & Module Capability

vsftpd 依赖内核模块 capability 来正常工作,今天上午配置 vsftpd 的时候没有注意到这一点,搞了一个多小时都没有搞定,lftp 访问始终是“登录失败 500 OOPS”之类的出错信息,用 firefox 还会让 firefox 崩溃 。

下午用 pacman 重装的时候看到了这个依赖,modprobe 以后一切正常了。

Linux Kernel 2.6.18 加入了 SBS 的支持

上次把学院机器上的系统移到笔记本上时自己安装了 2.6.18 的内核,发现一个对 Acer 笔记本用户的好消息:Smart Battery System 的支持已经放到内核里了。配置在 ACPI 下面,不过要使用它的话需要 I2C 的支持,所以要选上 I2C 才行。

这次还发现从 kernel.org 上下的内核,加上 Suspend2 和 gensplash 的 patch,休眠可以正常工作,但是 Arch 提供的 kernel26beyond 要休眠总是不行。但是我自己的内核配置始终没有办法使用 speedstep-centrino,而只能使用 acpi-frep,但是 Arch 提供的却可以使用前者,真不知道为什么。

还有一个问题就是 ATI 的驱动不能用了,即使我把 libgl-dri 卸载以后再自己安装,xorg.conf 配置里面也去掉 dri 还是不能用。一起 X 系统就没有办法用了, Ctrl + Alt + Del 能重启,Ctrl + Alt + BackSpace 去没能停掉 X。不过为了用 Suspend2 也就放弃 ATI 的驱动了。

将现有的 Linux 系统安装到其他系统上

前天又做傻事了,笔记本上的 Arch 因为 pacman 变慢所以用那个很搞笑的办法想让他快一点,但是一个不小心,rm -rf 把 /var/lib/pacman 给删了 :–( ,无奈啊,我想是很难恢复得了。另外正好想换文件系统,于是就想把院里机器上的系统拷贝回来用。

于是用 tar 备份,备份过程中 exclude 掉了 /dev/, /proc/, /sys/, /tmp/, /mnt/*,在笔记本上解压然后配置好 grub,修改了/etc/fstab 之后重启,但是很不幸的是在挂载了根文件系统以后遇到了如下的信息:

can’t find initial console Rebooting

之后又是老办法,chroot,然后自己用重新编译了一下内核,但是还是没有解决问题。网上搜也没有找到解决办法,有人说可能是 udev 的问题但是我更新了 udev 还是没有用。接近绝望想重装的时候看到 Arch 的安装光盘可以利用光盘里的内核引导到已有的系统,试了一下结果看到了同样的信息。

这样我就肯定问题不是出在内核,也不是我的备份恢复有问题。已经不记得怎么想到下面的办法的:把 /dev 目录下的文件全部 cp 到解压出来的系统的 dev 目录下。(其实在 mkinitcpio 的时候需要 /sys 下的某些文件,我当时就是用 cp 的办法解决的。)然后重启,果然不再有刚才的出错信息了,但是接下来却说: “can’t find /dev/shm, /dev/pts, /dev/sda1, … “,然后就是到文件系统修复的地方, Ctrl + D 继续的话就直接重启了。一开始又愣了,突然用想起来是 /etc/fstab 没有修改的原因。再进入系统修改了 /etc/fstab ,重启以后一切顺利,终于得到了跟院里机器一模一样的系统了,没有必要重装了! :–)

做点总结:

  1. 如果是把系统移到其他机器上则备份时可以把 /dev exclude 掉,但如果是为机器本身作备份为了避免麻烦还是直接包含进去的比较好。至于 /proc 目录则尽管 exclude 好了。/sys 一般 exclude 也没什么问题的吧。
  2. 恢复系统以后一定要注意修改 /etc/fstab。如果要移动到其他系统,使用的是自己精简的内核的话要重新配置内核并编译。如果使用的是发行版提供的通用的配置的话可能也需要生成一个新的 initrd 来支持新系统的硬件。
  3. 如果移动到其他系统的时候出现问题可以考虑用 livecd 或者使用现有 Linux 系统引导以后将 /dev 目录下的文件拷贝到恢复出的系统的 /dev 目录。

不过现在我倒是对 /dev, /sys 这两个目录的作用即其中的文件究竟是什么感到疑惑了。/proc 下的文件启动时会自动生成(或者说是伪文件,这个我也不清楚),但是 /dev, /sys 下的似乎不是的,那么最初他们是从那里来的呢?从安装过程中来?那么安装光盘为什么可以运行在不同的系统上呢,它里面的 /dev 目录显然不是固定的。呵呵,这几个问题又可以去问老师了。

Reiserfs vs. XFS

对 CPU 快而且负载不大的用户我推荐 reiserfs,它的速度很快,尤其是操作大量小文件的时候有明显优势,另外利用 tail 的话可以节省一定的磁盘空间;不过缺点是 CPU 占用率高,挂载时间很长。

如果是服务器,大文件较多,删除操作比较少的话还是用 XFS,它的优点是速度快,挂载和日志恢复都非常快,但是对大量小文件的删除和搜索操作很慢。

最早用SuSE的时候开始使用 reiserfs,后来用 Gentoo 才发现 reiserfs 是一个很好的文件系统。不过后来看到一个 Debian 的管理员讨论的网站上的一篇评测过的文章说 XFS 在家庭和小型企业的服务器上更合适,于是就开始使用 XFS。之所以换成 XFS 有2个原因,一是 reiserfs 在挂载上实在是很慢;第二是 mkfs.reiserfs 对一个已经创建过 reiserfs 文件系统的分区在重新创建文件系统的时候似乎有点问题(我给原来的 reiserfs 分区分配更大的空间以后用 mkfs.reiserfs 创建文件系统,挂载以后发现它还是原来的大小,不知道是不是因为它的 superblock 内的信息没有更新)。

用 XFS 也有接近半年了,以前在 Gentoo 下没有发现什么不好的地方,挂载很快,日志恢复更是快。不过现在的 Arch 下感觉再也受不了了,pacman 读软件包信息极慢,因为要搜索很多的小文件。而且发现 XFS 删除大量小文件的时候真的是很慢:一个 linux 内核删除在 7200 rpm/min 的 SATA 硬盘上居然要大概 1 分钟,相比 reiserfs 只要至多 5 秒。在我的笔记本上 XFS 更是令我无法忍受了,一用 pacman 其他要读写硬盘的程序就得等很久才有反应。所以下决心做备份然后换回 reiserfs 了,学院的机器已经用 reiserfs 了,效果非常好。

但是笔记本上换 reiserfs 以后发现一点不太时候的地方。在处理大量文件的时候 CPU 占用率非常高,系统响应变的很迟钝,1.6G 的 CPU 毕竟还是不够强劲。但是总得来说还是要比用 XFS 时等那么长时间的 IO 操作要好。