Tag Archives: 规范化

yum的$releasever真是太反动了

来看这篇文章的人,大都应该同意《Unix编程艺术》中提到的那些观点吧。今天就给大家看一个反例:yum 的 $releasever 变量 在 /etc/yum.repos.d/ 目录下的软件库定义文件中,常常会在 baseurl 的路径中提到 $releasever 这个变量,表示当前发行版的大版本号,但大家知道这个变量是在哪设置的吗?我 grep 了整个 etc 目录都没找到,还是看了 yum.conf 才知道的,是在 yum.conf 文件里 distroverpkg 选项定义的。但这个选项就很有问题: distroverpkg 和 releasever 名字不同,且看不出什么联系 distroverpkg 的值,并不是明文,而是“redhat-release”。不知道大家看到这个会有什么想法,反正我是首先想到了 /etc/redhat-release 文件,但我错了。实际上指的是 redhat-release 这个RPM包。所谓“distroverpkg=redhat-release”的意思,其实是将 $releasever 设置为 redhat-release 这个RPM包的版本号 够变态吧?别人都是直接赋值,或者 include 一个各种变量定义的文件进来,而yum竟然用某个包的属性作为值,违反了“everything is file”的原则。烂!用属性实现,则相关软件必须能读取属性。这个功能对于yum来说无所谓,但是对于别的软件呢?还得特地加入rpm相关的代码才能实现,加入了平台相关特性,降低了可移植性,麻烦。正确的方法是以文件内容作为表示形式。当然了,这样的话用属性就没意义了,yum还能减点肥。 … Continue reading

Posted in 默认分类 | Tagged , , , | 14 Comments

这几天玩了一下kexec

kexec 是一个快速重启动 Linux 系统的工具,其快速主要体现在是从内核开始启动而不是从硬件初始化开始,在当今硬件越来越复杂,开机自检越来越慢的条件下,kexec 可算是提高生产力的一大发明。 kexec 的操作分为两步: 加载内核到内存 运行刚才加载的内核 第一步的语法为 kexec -l  内核文件名 –initrd=initrd文件名 –append=内核参数。注意等号必不可少,否则,虽然 kexec 不报错,但是内核启动时会失败;第二部用 kexec -e 即可。通过查看 /sys/kernel/kexec_loaded 的内容可以判断是否已经加载内核。 目前遇到的问题有这几个: cciss HP SmartArray驱动在重启内核时会失败,导致无法正常进行下去 没搞明白如何用 kexec 加载 xen hypervisor 相信很快就会搞明白的。 同时提一下,发行版提供的 kexec 软件包带有 /etc/init.d/ 脚本,可以把正常的 reboot 操作转变成 kexec … Continue reading

Posted in 默认分类 | Tagged , , , , | 3 Comments

优秀Linux发行版应该具备的基本素质(待续)

发行版内包含的软件足够多、足够新,以避免发生用户因为找不到合适的软件而被迫打破发行版风格的事件。具体的说,RedHat EL包含的软件太少,导致很多人必须编译才能弄到够自己用的软件,就是很不好的。 有优秀的软件包格式和依赖关系解决工具。举个例子,yum只考虑要安装的软件包及其依赖关系,却不考虑本机已经安装了的软件包,很容易发生解决不了的版本冲突问题;另外yum老版本的速度也太慢了。 配置文件的风格应尽量使用include conf.d/*风格,以实现最大的可扩展性,方便插件类的软件单独成为一个软件包 配置文件的文件名应该固定,不应在配置文件名上包含任何与具体情况相关的信息。大家可以对比一下,debian的/etc/network/interfaces文件,可以用man interfaces命令查看其格式;而/etc/sysconfig/network-script/ifcfg-eth0则无法man 配置文件的内容应该清晰明了,默认内容中应包含注释信息 文件系统目录树结构符合FHS规范。我很奇怪,在已经有一个/etc的情况下,为啥会二次发明一个/etc/sysconfig和/etc/default目录。特别是前者,简直包罗万象,已经包含了/etc几乎所有的功能。

Posted in 默认分类 | Tagged , , , , | 4 Comments

怒了,mysql真是太过分了,竟然改开发接口

今天编译 Courier-authlib 0.62.2 版本,编译出来都是残废,不支持 MySQL 查询。后来看了 config.log,发现其需要的 mysql_connect 函数在 libmysqlclient 库中找不到。nm 了一下那个库,还真的是没有。 后来到 http://dev.mysql.com 翻文档,说这个函数改成 mysql_real_connect 了。MySQL 真是太过分了,就不知道留个接口给老的代码吗? 这件事也教育我们:没事不要自己编译,浪费时间和精力。

Posted in 默认分类 | Tagged , , | Leave a comment

敢于自荐的,不一定是毛遂

前几天chaobill问我关于Linux平台上提供技术服务的价格。我心里也没谱啊,于是在debian网站上找了个挂牌顾问,问了一下,对方回答说45$安装一个他自己开发的web界面管理软件,把系统主要服务都管起来就好了。我观察了几天,发现他们自己主要是卖虚拟主机服务的,对单独的技术服务似乎并不是很关心,于是今天打算自己先试试。apt安装之后,提示一句说dpkg的postinst脚本还不够,还得手工执行该软件本身提供的脚本。执行之后,我还是没在/var/www看到关于这个软件的完整内容。手工做符号链接、chown -R多次之后,总算运行起来了,但还是磕磕绊绊,经常提示没有权限执行mkdir之类的;软件的运行流程也不是很清晰,我觉得我还得再看看其不知在哪里放着的文档。 我原以为这个软件叫dtc,包也该叫dtc,后来发现dtc provided by dtc-postfix-courier;但是,安装指南说让安装dtc-toaster。也就是说,刚才apt安装的是错误的软件包。这个软件本身的质量,目前还没看出来;但是我觉得其打包工作做的还是很差的,虽然作者亲自操刀打包工作,但却给软件包取了容易引起误解的名字,亏作者在网站上还标榜自己是一个Debian爱好者呢。看来挂牌顾问也不都是高手啊!

Posted in 默认分类 | Tagged , | 2 Comments

刚才和Dieken讨论了关于二进制/源代码发行版方面的争论

本来在讨论企业环境下的全规范化管理,然后聊到开发环境的规范化管理,具体又谈了svn的webdav、file、svnserve的身份验证功能,然后聊到了关于各个需要身份验证的软件是否有可扩展的身份验证机制、是否需要自己写验证接口程序等,最终谈到二进制发行版和源代码发行版的问题。我们的态度是: 源代码发行版对于个人使用来说具有最高的灵活性,但对于规范化管理是极为不利的,如果将这样的发行版用于企业环境,对sysadmin的要求会有进一步的提高。 聊天记录摘录如下: dieken 说: 以前版上多次争论过源码发行版和二进制发行版 我觉得从可维护性上,源码发行版很不利的,只有大家统一用一个二进制版本,出了问题才好查 所以能用标配的坚决不自己造轮子 七月 说: 关键是在实施过程中如果有过多的可控制余地,则这个可控制的配置选项本身也将成为构建的目标的一部分 但是往往大家并不把它这么看 dieken 说: 没大明白你这句话 怎么把选项本身作为构建目标的一部分? 把编译选项放入包信息里? 七月 说: gentoo的USE参数好像可以指定带某些库、不带某些库吧?类似于./configure的–with和–without这类东西的 dieken 说: 怎么作为构建目标的一部分? 七月 说: 事实上这些参数也是目标的组成部分 它的控制粒度是configure参数,但打包的时候并没有在包名上标明这些参数。从而造成信息的丢失 dieken 说: 哦,明白你的意思了,你是说出了问题时必须能容易精确的得到当初的构建参数吧 这样能容易的复制出出问题的环境,进行调试 cmmi 有一个级别是“可重复”,我对这一点印象特别深刻 七月 说: 是的。但问题是人们往往不把这些东西当做目标的一部分。如果你亲自下载源代码编译,可能印象还会更深刻一点;gentoo全自动化编译却忽视了这个 dieken 说: 这一点 gcc … Continue reading

Posted in 默认分类 | Tagged , , | 3 Comments

请随手删除无用的文件和设置

今天我们部门把一个数据库迁移到另外一台服务器了,但我仍发现原数据库有很多写入操作,干扰mysql master-slave工作,找了很多遍,还是没找到问题所在。后来直接把旧的库删除了,问题马上就暴露出来了。 回想到前年在aka公司,公司的服务器上有十几个ipip隧道,也不知道指向哪里的;服务器上还有几十个服务的配置文件,也不知道还有用没有。单单为了搞清楚那台服务器是干什么的,就花了我两三天的时间。看来这行业手脚不干净的人还是挺多的。 最后喊一句口号:请随手删除无用的文件和设置,践行规范化系统管理。

Posted in 默认分类 | Tagged , , | 2 Comments

不规范的山寨安装流程会带来无穷无尽的麻烦

窝窝终于要扩展到论坛服务器上了。窝窝服务器上的几个目录也用NFS导出到论坛服务器上。但是UID不同步导致的问题越来越严重,经常有上传文件时无法写入目录的问题发生。 各服务器的www服务器都以www用户身份运行。这个用户名就够山寨的了。不过考虑到历史原因,暂且不改。最令人发指的是UID竟然不一样,有些服务器上是500,有些服务器上是501(500是squid用户),一看就是自己编译apache时手工创建的用户,且各服务器上的软件安装顺序不一样,自然创建用户的顺序也就不一样,造成UID不同步;比较诡异的是竟然有48号www用户。难道是apache用户改名而成的? 唉,夜里又得折腾一次,把UID都改成一样的,然后对海量文件执行chown。麻烦!

Posted in 默认分类 | Tagged , | 2 Comments

忘记看mount –bind导致数据库丢失一例

Ubuntu 8.04 Server 原来MySQL的datadir是/var/lib/mysql/目录。因为/var分区比较小,我在一个LVM卷里创建了和库同名的两个目录,并用mount –bind把它绑在原来的数据目录的库目录上: mount –bind LVM/mysql/db1 /var/lib/mysql/db1 mount –bind LVM/mysql/db2 /var/lib/mysql/db2 某一天,/var/lib/mysql/下保存的InnoDB日志占满了/var分区的所有空间。无奈,我只好把数据库目录整个挪到LVM去。因为设置mount –bind的时间太久,我都忘记这个事了。于是我先删除了LVM/mysql目录(因为这个目录看起来比较旧)然后把/var/lib/mysql目录挪过来。于是,丢失了所有的数据……

Posted in 默认分类 | Tagged , , | Leave a comment

感受AppArmor

ubuntu 8.04 server 今天 /var/ 分区装满了,于是把 /var/lib/mysql/ 目录给挪到别处,结果重启动 MySQL 失败。日志显示 mysqld 会尝试创建一个 hostname.lower-test 文件,以确定对 datadir 目录有写权限 我 su 到 mysql 用户,进目录,发现可以创建文件 于是想到可能是安全框架的问题。找了一下 /etc/apparmor.d/usr.sbin.mysqld 文件里写着/usr/sbin/mysqld可以访问的目录和权限。把新的目录加进去,就正常了

Posted in 默认分类 | Tagged , , | Leave a comment