善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。
显示标签为“OpenBSD”的博文。显示所有博文
显示标签为“OpenBSD”的博文。显示所有博文

2006-03-24

OpenBSD研究手记(六)

把 OpenBSD 重装了。

这次,严格使用从来没使用过的密码(用生成器生成),以免它被攻破之后危急其它的系统。
按照以前的经验,重新安装 Apache2,这次没有遇到任何困难。在新电脑上架设的虚拟机也升级到了 5.5.1,而且硬盘没有使用压缩模式,因此编译、安装的速度快了很多很多。

安装完 Apache2 之后,我把虚拟机停掉,将整个目录打包作了个备份。这样,以后要是安装时出了什么差错,起码系统可以回到这个还原点上。

接着,安装 MySQL。这次我不用那个 5.0.19 的源代码分发包了,改用从 http://www.openbsd.org/3.8_packages/i386.html 处下载的 MySQL 4.0.24 的二进制分发版本。这个版本比较奇怪,分为 Client 和 Server 两部分(这倒不特别奇怪),而且安装的路径不是通常的 /usr/local/mysql,而是直接丢在了 /usr/local/lib、 /usr/local/libexec、 /usr/local/include、 /usr/local/bin 等目录里面。我想,这大概是 BSD 上的 mysql 的安装习惯吧?当然,步骤还是一样,直接在 /usr/local 把它们解压掉就行。

然后,还是要建立 mysql 用户。不过,这个版本奇怪的一个地方在于。它要求创建 _mysql 组,而不是 mysql 组。因此:

groupadd _mysql
useradd -m -g _mysql mysql

当然,mysql_install_db --user=mysql 还是要运行的。然而,接下来要修改的权限又是一个麻烦的地方。因为它的安装路径和我以前装过的 for Linux 版本不一样,因此要修改的目录也就不同。

chown -R mysql /var/mysql
chgrp -R _mysql /var/mysql
chown -R mysql /var/run/mysql

这最后一个目录,一开始不一定有,运行一次 mysqld_safe 可能就会钻出来。

安装 MySQL,我瞥见压缩包里面有着各种 so 文件。估计这次编译 PHP 应该不有什么问题了,实际情况也是如此。很快地,我就又可以安装 discuz 了。
后面的过程和以前是一致的。这次 discuz 的运行没有遇到上次那样的问题。我用管理员帐号登录论坛,打开控制面板,OK,页面出现。不过,还是有点小问题。在「头像」的位置上,出现了一个页面错误的提示,说 Zend Optimizer 没有被安装。

我的确是在 discuz 的官方网站上看到过它需要 Zend Optimizer 的支持。不过既然它到目前为止都表现良好,那也许需要 Zend Optimizer 的只是其中的一小部分功能吧。我去 Zend Optimizer 的官方网站查找 for OpenBSD 的版本下载,结果却令我大失所望。网站上只提供 for OpenBSD 3.3 / 3.4 的版本的下载,连 3.7 都不支持,别说 3.8 了。

我只好下载了 Zend Optimizer 2.6.0 for OpenBSD 3.4。上传到 OpenBSD 服务器上解压,发现有一个 install.sh 可以执行。但执行的结果是告诉我 libm.so.1.0 这个文件不存在,继续执行,发现还有 libc.so.30.0 和 libutil.so.9.0 都找不到。locate 的结果发现,这三个文件的高版本都存在,只是名字不同而已。OpenBSD 为什么没有把不同版本的 so 文件给符号链接到一个通用文件名上的习惯呢?我手动创建了到这些低版本的符号链接,再执行 install.sh,得到的是一个错误。

查看 Zend Optimizer 的安装指南。上面说 OpenBSD 的安装方法是要把 ZendOptimizer.so 拷贝到 /usr/local/lib,然后在 php.ini 中增加两行配置:

zend_optimizer.optimization_level=15
zend_extension="/usr/local/lib/ZendOptimizer.so"

我一看我的 PHP 连 php.ini 都没有生成。看来功能全部是靠编译链接出来的。拷贝了一个 php.ini-recommended 到 /usr/local/lib,加上这两行。然后再检查 phpinfo(),果然 Zend Optimizer 在功能表中出现了。

整个过程还是比较曲折。综合评价后,我得出的结论是:

  • 目前,OpenBSD 确实是最安全的服务器操作系统之一,网络服务器(如路由、DNS、DHCP 等)的功能它肯定可以胜任;
  • OpenBSD 可以胜任一台 Apache + PHP + MySQL 服务器的工作;
  • 要在 OpenBSD 上安装 Oracle 是不行的,至少我没有找到 Oracle for OpenBSD 的任何版本。数据库只能指望 MySQL 和 PostgreSQL,而且最好是使用 OpenBSD 官方提供的版本;
  • 应用软件系统对 OpenBSD 的支持还不够,要想随时用上最新版本不是那么容易的。 

OpenBSD研究手记(五)

总算把 OpenBSD 的 Apache + PHP + MySQL 架设完毕,可以开始应用系统的安装了。

虽然目前比较急切的是 blog 的需求,但是我打算先用 discuz 来下手。discuz 可能不是很出名,它是一个国人开发的 PHP + MySQL 的论坛。号称自己比 LB5000 要好,特别是在性能和负载上面,但是我看了看界面,并不是很喜欢。不过 LB5000 是文本论坛,相信代码再怎么优化,在数据查询上还是有先天劣势的。

从 discuz 官方网站(也是一个论坛)上下载了 discuz 的 UTF-8 简体版论坛程序。不错,才 1.2x 个 MB,尺寸蛮不错的。按照安装指南,先解压到本地,然后用 FTP 上传到服务器。修改几个指定目录的权限为 777,编辑配置文件指明数据库连接字符串,然后运行安装脚本 install.php。只经过了很快的几个步骤,就安装完成了,可见有很多设置都是有默认值的。对比 LB5000 的安装,似乎要简单一些。

从安装脚本的执行情况来看,似乎没有什么错误,于是我又继续进行下面的操作。注册了一个用户,正常。用管理员登录,没问题。进系统设置看了看,选项太多,花了眼,又退了出来。打开控制面板……,出错了。

出现错误的 SQL 也打印了出来,错误信息也写在页面上,这点倒是蛮友好的。我看了看那行 SQL,没有什么问题,一个简单的连接查询而已。我在 MySQL Client 上手动执行这条语句,一样的错误。错误信息居然是「无法打开文件:./discuz/cdb_subscription.frm」。

去数据库目录下看了看,有这个文件在啊。ls -l、cat,都没有任何问题。而当我在 MySQL Client 里面 use discuz 之后试图 show tables 的时候,也出现了文件无法打开的错误。我想,这只有可能是 MySQL 本身有问题了。在重启过之后,问题依然无法解决。

真郁闷。最后决定,把虚拟机删了,一切重头来过。正好趁此加大它的硬盘,并把它放在新电脑上。这样一来空间不是问题,速度也要快很多。

OpenBSD研究手记(四)

终于轮到了最后的步骤,PHP。然而,没想到过程是意外的艰苦。按照以前设想的,以支持 MySQL、iconv、GD(PNG)、XML 为目的的 PHP 编译行动,却遇到了预想之外的麻烦。

当然,首先要准备好外围的库文件。要支持 iconv,需要 libiconv。要支持 GD,需要 libpng。而且我还得确认 libz 也要存在才行,GD 也需要它,虽然一般操作系统都有默认安装。

我个人比较喜欢用 locate 来在 Linux / Unix 系统上找文件。不过当前系统刚装,显然 locate 数据库中还没有信息,因此需要让数据库得到一次填充才行。在 RedHat Linux 上,可以通过 locate -u 来做到,可 OpenBSD 下面的 locate 根本没有 -u 这个选项。但是我知道 locate 的数据库肯定是有一个定期更新的定时事件的,通过查找 cron 的配置,我很快找到了 locate 数据库的更新者——/usr/libexec/locate.updatedb。这是个可执行程序,运行它就可以让 locate 自动扫描硬盘,生成所有文件的路径索引了。

用 locate,我轻易地发现了 libz,也确认了 libpng 和 libiconv 在 OpenBSD 上没有默认安装。这两个软件包,都可以从 http://www.openbsd.org/3.8_packages/i386.html(链接已失效)处下载。下载完了之后,将它们上传到 /usr/local,然后就地 tar -zxf 即可。多出来的 +DESC 和 +CONTENT 是一些说明性的文本,可以删掉。

外围的库文件准备好了。接下来,就该编译 PHP 本身了。我首先试用了在 RedHat Linux 上的 configure 参数。然而,在执行 ./configure 的时候出现了一些问题。按照提示的错误信息,我把 png.h 和 pngconf.h 在 /usr/include和/usr/local/include 处都做了 ln -s,并在参数中对 iconv、png 都手动指明路径。OK,configure 没问题了。

接下来是 make。这次出现了一些不同寻常的信息,说什么找不到 real path of libmysqlclient,只好编译成静态的版本。make install 之后,我草草修改了 httpd.conf,马上去看 phpinfo() 的结果。结果我沮丧地发现,除了 --with-apxs2 参数有生效,其它的参数全部都没有起作用。

当时我的机器非常的慢,完全编译一次要花二十分钟左右。因此我不得不第二天来接着处理这个问题。暂停一下,经过思考,我觉得,不可能所有的选项都有问题。我决定单独添加每个选项,逐个测试,看到底是哪个出了问题。而实践证明,这个方法是有效的。我发现会出问题的只有 --with-mysql=[dir] 这个选项,若去掉它,使用其它的选项都能正常编译。同时,也证明了 PHP 在编译的时候,选项的顺序也是可能会影响编译结果的。我之所以会仅仅生效一个 --with-apxs2,就是因为它的后面紧接着就是 --with-mysql=[dir],所以后面的选项全部失效掉了。

确定了是 MySQL 的问题就好说了。我注意到,不论是否在 --with-mysql 参数中指定 mysql 的安装路径,编译都能通过(这也正常,不指定路径,PHP 就使用自带的 mysqlclient 代码),但是若指定参数,就会出现那个错误信息。不过两者的 phpinfo() 并没有什么实质上的区别,mysqlclient 的版本都是 3.23.*。我试了一下,都无法连接 MySQL 5 的数据库。

无论如何都不行,我郁闷了。只有上 Google,嗬,还真有找到东东。一个叫 Kelly Martin 的人在 MySQL 的官方站点上报告了一条信息,说 MySQL for OpenBSD 3.8 的版本,别的都没有问题,就是和 PHP 4 / 5 编译的时候就会出错。他的帖子链接如下:

http://dev.mysql.com/doc/refman/5.0/en/openbsd.html(链接已失效)

按照他提供的办法。我从 MySQL 官方站点上下载了源代码分发版(5.0.19),根据他指定的参数进行了编译,然后安装 MySQL。果然,这次编译 PHP 不会出现问题了。phpinfo() 的信息也显示,mysqlclient 已经更新为 5.0.19 的版本。

然后,正式调整 httpd.conf 的内容。编辑主机名;修改 DocumentRoot;调整目录权限,把 Index 权限去掉;添加默认首页面文件名;调整编码字符集;至于 AddType application/x-httpd-php .php 那是早就做了。调整完后,重启 Apache,总算!大功告成!

OpenBSD研究手记(三)

装完 Apache,接下来应该是安装 MySQL 了。

若换在 Win32 系统上,应该是先装 PHP 比较合理。但在 Linux / Unix 系统上,这个顺序应该倒过来才对。因为在 Linux / Unix 下安装 PHP 是用编译的,而不是像 Win32 下面那样通过 extension 来进行扩展。而若编译时使用 PHP 自己带的 MySQL Client 库,那么生成的 PHP 引擎不能访问高版本(5.0.* 以上)的 MySQL 服务器。所以一定要先安装 MySQL,再编译 PHP,这样才能正常使用它们。

为了使用一些新特性……,其实,也是为了追新,我下载了 MySQL 5.0.19 的 for OpenBSD 3.8 的版本。和 MySQL 的许多版本一样,这是一个二进制代码分发版本。既然是特意为 OpenBSD 3.8 特意制作的版本,那我就受用啦。解压,安装,一切还算顺利。不过在安装和运行的时候,都出现了一些 warning 信息,说某些 so 库的版本不够,但是仍然「use it anyway」。既然它这么说,那我也就不管了。

一切都按照安装包内的指导进行。大致过程如下:

  1. tar -zxf 文件到 /usr/local,然后做一个 ln -s 到 /usr/local/mysql
  2. groupadd mysql,建一个组。这是按安装指南中的要求
  3. useradd -m -g mysql mysql

    建用户的时候,按照安装指南中的步骤是有问题的。useradd -g mysql mysql 会提示 /home/mysql 目录不存在。在 RedHat Linux 里面,新建用户时会自动创建它的个人目录的,但 OpenBSD 3.8 至少是不会。出错提示指出,要加一个 -m 参数。这参数还不能加在后面,一定要写成 useradd -m -g mysql mysql 才行,由此可见 OpenBSD 的外部命令对参数的顺序也是有讲究的。而且这个参数我在 man 里面没有找到。不知是因为这个特性是新近加上的还是一个疏漏?要人命的疏漏啊。

  4. 运行那个 mysql_install_db。安装脚本嘛,但一定要带上 --user=mysql,这样才有正确的权限。
  5. 设置权限。按照安装指南上的步骤,其实质就是要让 /usr/local/mysql 的用户归 root,组归 mysql,然后 /usr/local/mysql/data 的用户归 mysql,当然都是递归的。
  6. 手动启动的命令。mysqld_safe,还是要加 --user=mysql,而且还要用 & 来运行。土啊。不过也习惯了。
  7. 设置自动启动。这步我没做,因为我对于 OpenBSD 的自动启动部分还不太熟悉。

然后的步骤,是各种平台下面都要做的。首先把 'root'@'localhost' 和 'root'@'主机名' 的 MySQL 用户密码改掉。然后 Create Database,再 Grant 创建新用户。再做测试,就略过不提了。

OpenBSD研究手记(二)

本来应该更早一些写下这篇文章的,无奈因为自己整备电脑的事情打断了。到目前为止,研究的目的已经基本达到,所以把研究手记整理出来,以供有需要的人士借鉴。

安装 OpenBSD 现在已经是轻车熟路了。我还尝试安装了一台带 X Windows 的工作站,全选了所有可选包,结果大小也才三四百个 MB。不过那 X Windows 的画面可真是惨不忍睹,大概是因为虚拟机没有显卡驱动的缘故吧?

下一步,是安装 Apache。OpenBSD 的默认安装就已经有了 Apache,不过是一个 1.3.* 的版本(具体版本我忘了看)。我想要的是 Apache 2.0.* 的版本,因此也得下载源代码分发版本自己编译了。

最新的 Apache2 的版本是 2.0.55。第一次编译折腾了很久。记得在 RedHat Linux 上编译 Apache2 的时候相当顺利,但在 OpenBSD 上就遇到了不少的问题。可惜具体的错误信息我现在忘了,当时也没有记录下来。不过我总算是找到了可以顺利编译的配置信息:

  ./configure --prefix=/usr/local/apache2 --enable-so --enable-ssl --with-ssl
  --enable-rewrite

加上 --with-ssl 的选项,是因为 OpenBSD 有默认安装 OpenSSL ,这样就不用白不用了。至于 --enable-ssl,似乎不一定是一个有效的参数,不过还是加上算了。

编译完成之后,make install,然后测试网页,一切 OK,通过。修改 httpd.conf 就等到 PHP 安装完成之后再来吧,反正装完 PHP 是一定要改它的。不过这些操作在我的那虚拟机上跑了非常久的时间。大概和我对硬盘分区勾上了「压缩」选项有关系吧。按道理,压缩格式的分区应该会占用大量的 CPU 时间,并且会造成 I/O 性能急剧下降的。不过没办法啊,空间紧张,只有拿时间换空间。

2006-03-14

OpenBSD研究手记(一)

是从那部黑客小说中看到的 OpenBSD 这个操作系统,并从此得到了它是一个非常安全的系统的感觉(事实也是如此)。后来在那波大肆下载各种软件的时期,我也找到了 OpenBSD 的最新 3.8 版的安装盘。当时用 VMWare 建了个虚拟机大致安装了一下,由于硬盘空间不够很快就删了。昨天开始,决定研究一下它,作为这段时间的业余爱好。

一切都得重头来。不过,安装不会有什么问题。尽管 OpenBSD 只提供了文本方式的安装界面,并且还是命令行式的。但在它的官方网站上,有一篇非常详尽的安装指导。虽然是英文的,但是由于配了例子,好像还有截图,照瓢画葫芦也能把系统装完。我第一次安装的时候,就是完全按照它上面的步骤完成的。

不过,当时也遇到了一些问题。因为我硬盘空间相当紧张,只给虚拟机划分了一个大小为 1G 的虚拟硬盘。在分配 disklabel 的时候,就捉襟见肘了。安装指导上的例子是以 20G 的硬盘为例的,而我不知道各个 mount point 下的空间在安装后到底会消耗多少,所以只好根据经验随意设了一下。后来在安装的时候果然有遇到 /usr 目录空间不够的问题。这一次,我打算把所有目录的空间都统一在一个 disklabel 下面,免得再遇到这些多余的麻烦。

因此,昨天当我在分配 disklabel 的时候,d a 之后,先直接 a b 建立 swap 分区。硬盘这次还是只有 1G,因此只分了 100M 给 swap 分区。剩下的都用在 a a 上,mount point 设为 /。这样它下面的所有目录,无论 /home、/usr 还是 /var,都统统使用它的空间了。我知道若是在真的服务器上这样做是有负面效果的,不过现在空间不够,也只有凑合了。

这些工作都是昨天晚上完成的。今天的计划是将网络设置好,并安装 Apache + PHP + MySQL。我会去研究 OpenBSD,有一部分原因是想把公司以后的 Web 服务器用它来架设。众所周知 Web 服务一直是网络安全的一个薄弱环节,为此我希望有一个自己把握得住的、小巧、安全可靠的系统。安全性要好,功能不需要多,能提供必要的服务就行,而且最好能自己定制。我想 OpenBSD 也许是不错的选择。RedHat Linux 虽然用得很多,但系统发展到现在已经很庞大了,不一定好使。

可惜,早上一来就在网络设置上遇到问题。OpenBSD 和 RedHat Linux 在设置上有不少区别。尽管都有 /etc 目录,可那下面的文件就基本上没几个相同的。当然,这并不是问题,查查资料就可以搞定。但是,在 NAT 设置上我遇到难题了。

我昨天在家里安装的时候,关于虚拟机的网卡,我随便设了一个 Bridge 模式。这当然是最方便也是最简单的设置方式了。不过到了公司就不能这样用了。虽然公司的 IP 也是我在管,但为一个自己研究用的虚拟机就占用一个实际IP也不是很厚道。我决定把它改为 NAT 模式。

然而,遇到了奇怪的事情。当我把 OpenBSD 的 IP、网关、DNS 统统改掉之后,刚开始,在虚拟机上操作起来似乎一切 OK。内外能通,DNS 也能解析。然而,当我试图从本机上 SSH 过去的时候,无法连接。再从本机上尝试 ping,也不行。

正在我为内网工作站没问题,但网关不通工作站而奇怪的时候。过了一会会,SSH 又能连接了。我还没高兴多久,却发现这台 OpenBSD 不能通外网了,就像没有 NAT 一样。再 ping 网关的 ip 地址,却又是通的。反复重启了几次,还是这样的现象,似乎和时间还有一点关系。

郁闷中,发现有个现象。似乎有时候在 OpenBSD 上 route show 的时候,本机上会有网络地址冲突的警告提示。查看日志发现,那块网卡的 MAC 地址从来没有见过。既不是 NAT 型虚拟网卡的地址,也不是 OpenBSD 上的网卡的地址,不是任何一块已知网卡的 MAC 地址。过了一会,我注意到,刚开始的时候,在 OpenBSD 上 route show 的时候,从网关 IP 出发的路由是指向这个未知的 MAC 地址。此时内外网就是通的,但本机不通内网 OpenBSD。而过一会之后,等本机能连接内网 OpenBSD 时,再 route show,就发现那条路由的 MAC 地址变成了 NAT 型虚拟网卡的 MAC 地址,是一个已知的 MAC 地址了。

这让我隐约有点感觉。似乎有两块网卡。一块是我已知的,可以连到内网 OpenBSD,但无法担任网关的工作。另一块可以做网关,做得很好,但是不能让本机连接内网 OpenBSD,因此它不是一块本机上已知的网卡。

上午火箭又输球了,办公室内又有一个串门的 MM 大声地恬噪,搞得我头晕脑胀。中午去麦当劳理了理思路,很快就发现了问题所在。那块不存在的网卡肯定是 VMWare 虚拟出来的,而且甚至都不属于虚拟网卡,只是一个影像而已。它只存在于 VMWare 的世界,只有虚拟机们才能感知到它的存在。而它的 IP 地址,就是 VMWare 的 NAT 网关的 IP 地址。我自作主张把它设成了和虚拟网卡一样的 IP,于是两者在 VMWare 内就冲突了。互相抢IP地址,所以一会可以通一会不行。

回来之后,把 NAT 网关的地址改成另一个,配置 OpenBSD,然后重启,终于,一切正常了。

其实,这不算是对 OpenBSD 的研究,应该算是对 VMWare 的研究吧?