Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

Thursday, October 4, 2007

[zz]Linux文件系统的桌面应用

原文链接
本文中要介绍一个所谓的"Linux 文件系统的守护神",这是指一个能实时地观察 Linux 文件系统的变化情况的程序模块。能够实时的观察文件系统的变化情况,并做出及时的适当的反应,这对于应用 Linux 做桌面计算机系统来说,是十分的有趣,也是十分的重要的。本文还要介绍 Linux 文件系统的异步 I/O 的扩展。同样,这对于 Linux 系统的桌面应用也是关键的。

Linux 文件系统的守护神

传 统的 Linux 文件系统呈现给用户程序的界面,确实是十分的干净利落。用户程序可以打开一个文件,向文件中线性的写入数据,从文件的某一位置开始,线性的读出数据,关闭 一个文件,删除一个文件,创建一个文件,等等。请看,只有这么若干个简洁的操作原语,可是却能提供这么多丰富的应用。但是,我们注意到,用于访问 Linux 的文件系统的这些操作原语,并没有提供非常复杂的加锁解锁的功能。这是一件很奇妙的事情,如果来自不同的用户程序的请求发生了冲突怎么办呢?

我 们不妨走的再靠近一点,仔细的看看删除一个文件是怎样进行的。如果已经有一个用户程序在访问一个文件,而另外一个用户程序正好要删除这一个文件,这时会发 生些什么呢?我们知道,Linux 的文件系统是基于所谓的 inode 的,每个文件都相伴有一个 inode。在 inode 中记录了关于这个文件的一些系统信息,比如文件的所有者,文件相关的一些权限记录,关于文件的若干个时间戳,等等。在内存中的 inode 还维持着一个关于自己的使用计数。每当一个 inode 所代表的文件被打开一次,这个 inode 就把关于自己的使用计数加一。每当这个 inode 所代表的文件一被关闭,这个 inode 就把关于自己的使用计数减一。当用户程序删除一个文件的时候,相关的系统调用很快就返回到这个用户程序,告诉它,相应的文件已经被删除了。但是相应的 inode 还是保留在系统中,inode 首先要检查自己的使用计数,如果使用计数为零,那么 Linux Kernel 才可以真正的去删除这个文件。如果使用计数大于零,也就是说,还有其它的用户程序在访问这一个文件,那么 Linux Kernel 需要等待这些其他的用户程序一个个都完成对这一个文件的访问才行。也就是说,要等到这个 inode 的使用计数掉到零,才能真正的去删除这一个文件。

我们可以设想一下,如果有一个 MP3 播放程序在播放一首 MP3 音乐,我们觉得它不好听,就到硬盘上找到这个文件,把它 rm 掉了。这时候,MP3 播放程序并不受到影响,还是可以继续播放这首 MP3 音乐,虽然这时候在文件系统上用 ls 已经找不到这个 MP3 音乐文件了。实际上,一直要到 MP3 播放程序停止播放这首 MP3 音乐,然后 Linux 文件系统才真正的从硬盘上删除这个 MP3 文件。这个经验和我们在 Windows 平台上遇到的截然不同。

在 Windows 平台上,当我们试图在文件夹窗口中用鼠标点击右键菜单删除 Winamp 正在播放的一首 MP3 音乐的时候,Windows 系统会用一个弹出对话框告诉我们,这个文件正在被使用,没办法删除。Windows 系统的关于删除文件的这样一个解释,如果使用不当的话,会带来一个滑稽可笑的问题。我们可以设想一下,用户的一个 P2P 的文件共享程序提供了一个 MP3 文件以供别人下载,恰巧这个 MP3 音乐文件十分的热门,不断的有人来下载,这个用户最终决定要节省一下带宽,想要把这个 MP3 音乐文件删除掉,但是 Windows 系统却不允许用户这样做,因为这个 P2P 的文件共享程序总是在使用这个 MP3 文件。用户要想删除这个文件,不得不先把 P2P 的文件共享程序给停下来!呵呵。

但是 Linux 的文件系统的操作原语也有它自己的问题。我们知道,在一个 Linux Shell 的命令行上,先 rm,然后再 ls,非常的干净,被 rm 的文件没有了,被删除了。但是我们可以设想有一个图形界面的文件管理程序,当用户从 Shell 的命令行上 rm 掉一个文件的时候,这个图形界面的文件管理程序并没有收到任何人发给它的任何消息,它还以为什么都没有发生,被删除掉的文件还在那儿。这实在是很 U.G.L.Y. 啊。

那么要想解决这个问题,一个明显的但是非常不好的办法,就是让一个后台进程 Daemon 每隔一个很短的时间间隔,就检查一下文件系统上这个目录的情况,看看有没有发生什么变化。这个办法的缺点真的是显而易见的,不但系统的性能受到影响,而且它的反应也还不是实时的。

如 果我们需要用户程序能够实时地了解文件系统上某一个目录的变化情况,从实时这个角度出发,显然,我们需要有一个中断机制。我们都知道,硬件中断能够实时地 把系统某一个部件的情况反映给中央处理器,同样的,要想把位于系统内核中的文件系统的情况实时地反映给用户程序,我们也需要一个由操作系统内核到达用户进 程的软件中断机制。熟悉 Linux 系统编程的读者朋友们立即就会想到,这个中断机制在 Linux 系统中早已就有了,这就是信号传递 signal。

找到了信号传递这样一个中断用户进程的机制,一切似乎都已齐备,看来可以动手实现这样一个 Linux 文件系统的守护神,来实时地监视文件系统的变化情况,并且及时地把消息通知给用户程序了。不过且慢,让我们搜索一下 Linux Kernel,看看是否有别人也在做同样的工作。哈哈,果不其然,原来这样一个实时地监视文件系统情况的机制早已在 Linux 内核中实现了。下面一段就是取自 Linux Kernel 文档的一段小小例程,说明了 Linux Kernel 中的 dnotify 功能的用法。dnotify 就是指 directory notification,监视文件系统上一个目录中的情况。

#define _GNU_SOURCE     /* needed to get the defines */
#include /* in glibc 2.2 this has the needed
values defined */
#include
#include
#include

static volatile int event_fd;
// 信号处理例程
static void handler(int sig, siginfo_t *si, void *data)
{
event_fd = si->si_fd;
}

int main(void)
{
struct sigaction act;
int fd;

// 登记信号处理例程
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN, &act, NULL);

// 需要了解当前目录"."的情况
fd = open(".", O_RDONLY);
fcntl(fd, F_SETSIG, SIGRTMIN);
fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
/* we will now be notified if any of the files
in "." is modified or new files are created */
while (1) {
// 收到信号后,就会执行信号处理例程。
// 而 pause() 也就结束了。
pause();
printf("Got event on fd=%d\n", event_fd);
}
}

上面这一小段例程,对于熟悉 Linux 系统编程的读者朋友们来说,是很容易理解的。程序首先注册一个信号处理例程,然后通知 Kernel,我要观察 fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT 事件。(关于这些事件的详细定义,请读者朋友们参阅文后所列的参考资料。) Linux Kernel 收到这个请求后,把相应的 fd 的 inode 给做上记号,然后 Linux Kernel 和用户应用程序就自顾自去处理各自的别的事情去了。等到 inode 上发生了相应的事件,Linux Kernel 就把信号发给用户进程,于是开始执行信号处理例程,用户程序对文件系统上的变化也就可以及时的做出反应了。而在这整个过程中,系统以及用户程序的正常运行 基本上未受到性能上的影响。这里还需要说明的是,dnotify 并没有通过增加新的系统调用来完成它的功能,而是通过 fcntl 来完成任务的。增加一个系统调用,相对来说是一个很大的手术,而且如果设计不当,处理得不好的话,伤疤会一直留在那里,这是 Linux Kernel 的开发者们所非常不愿意见到的事情。





回页首


Linux 文件系统的异步 I/O 扩展

对 于桌面计算机系统来说,能够快速的响应用户的请求,这也是十分关键的。换句话说,当用户移动鼠标的时候,不管系统正在进行什么天大的、重要的、神圣的、不 可打断的工作,它都得立即停下,并且要让鼠标立即流畅的在计算机屏幕上完美地运动起来。对于习惯在传统的 Linux 命令行上工作的读者朋友们来说,让鼠标能够在任何时间都可以在计算机屏幕上向无头苍蝇一样地乱窜,竟然被当成是最重要的系统任务,这实在有一点让人难以接 受。不过,当你从 Linux 命令行上转移到 GNOME 或者 KDE 这样的图形界面的用户环境的时候,鼠标被锁死,百分之百的也是会让你失去理智的。所以,还是让我们接受这一个现实,看一看如何才能增加系统的响应速度吧。

从 文件系统的角度讲,特别是考虑到网络文件系统,它的响应速度有可能会相当的慢。当用户在文件管理程序中,选择了对文件进行某一个操作以后,文件系统可能会 需要相当长的时间,才能完成这一操作。如果文件管理程序必须要等待文件系统完成这一操作,然后才能继续的话,这显然会给文件管理程序的用户带来非常不愉快 的经历。解决这一个问题的办法,就是要实现异步的文件系统 I/O。

在 Linux 的 Gnome 桌面环境中,由 GnomeVFS 包裹了真正的 Linux 文件系统 I/O,实现了一个异步的文件系统 I/O 接口 API。我们可以看到下面这个用 GnomeVFS 打开文件的例子。

enum _GnomeVFSOpenMode {
GNOME_VFS_OPEN_NONE = 0,
GNOME_VFS_OPEN_READ = 1 << 0,
GNOME_VFS_OPEN_WRITE = 1 << 1,
GNOME_VFS_OPEN_RANDOM = 1 << 2
};
typedef enum _GnomeVFSOpenMode GnomeVFSOpenMode;
typedef void (* GnomeVFSAsyncOpenCallback)
(GnomeVFSAsyncHandle *handle,
GnomeVFSResult result,
gpointer callback_data);
GnomeVFSResult gnome_vfs_async_open
(GnomeVFSAsyncHandle **handle_return,
const gchar *text_uri,
GnomeVFSOpenMode open_mode,
GnomeVFSAsyncOpenCallback callback,
gpointer callback_data);

我们注意到,上面的代码段中,用户程序为了打开一个文件,向 GnomeVFS 注册了一个 call back 例程。在注册了这一个 call back 例程之后,函数调用就立即返回给用户程序,用户程序就可以处理自己的别的事情去了,比如进一步响应来自用户的其--肭螅?鹊取6?蔽募?低惩瓿啥晕募?拇蚩?僮饕院螅�GnomeVFS 就会调用刚刚注册的 call back 例程,通知用户程序,文件已经打开。





回页首


小结

我们在本文中了解了 Linux Kernel 中的 dnotify,可以帮助我们实时地监视文件系统目录树中的变化情况;也了解了 Gnome 桌面环境的 GnomeVFS 异步文件系统 I/O 扩展;可以帮助用户程序不至于被文件系统的请求所 Block。这两个功能对于 Linux 系统在桌面上的应用都是很重要的。



参考资料

1 Stephen Rothwell, Linux Directory Notification, http://lxr.linux.no/source/Documentation/dnotify.txt

2 dnotify source, http://lxr.linux.no/source/fs/dnotify.c

3 FAM Project, http://oss.sgi.com/projects/fam/index.html

4 Ettore Perazzoli, Unix filesystem extensions in the GNOME environment, http://www.usenix.org/events/usenix2000/freenix/full_papers/perazzoli/perazzoli_html/paper.html



关于作者


赵蔚,自由职业者,专业从事 Linux 及 Open Source 的咨询业务。


python script for QTerm

好久没碰python了,语法都忘得七七八八。今天在BBS灌水,发觉有人用灌水机 - -!!
于是也随便写了个for qterm的以备用……咔咔


1.自动灌水机
注意必须保存为GBK的文件(否则发送字符串时,发送的是对应文件编码的字符,而一般国内BBS都是只认GBK的。

import qterm, string
import re, urllib
import os
import sys
import time
import random

lp=long(sys.argv[0])

for i in range(1,100):
qterm.sendParsedString(lp,"^p")
s='河蟹去死'
qterm.sendString(lp,s)
qterm.sendParsedString(lp,"\n\n")
qterm.sendString(lp,"去死去死")
qterm.sendParsedString(lp,"^w\n")
time.sleep(random.uniform(0, 5))



2.代码自动上色!
这个很强大,从这里下载,不过有点古老了,我作了一些更改的。原帖地址在
修改如下:
tags=....
一行改为
tags = '--style-file=/path/to/your/style/file'
原来的--tags-file选项已经不再适用了。现在使用--style-file。

(未完成)
# 批量灌某目录的文章
# 从百度下载歌词灌……
# 使用curl来转载某些文章

Monday, June 25, 2007

[zz] 编译的一点体会,希望对新手有点用 :)

如何从源码包安装软件?

从源码包安装软件最重要的就是仔细阅读README INSTALL等说明文件

它会告诉你怎样才能成功安装


通常从源码包安装软件的步骤是:
tar jxvf gtk+-2.4.13.tar.bz2 解开源码包
cd gtk+-2.4.13/ 进入源码目录
./configure 似乎在某些环境下./configure会造成终端退出
而使用. configure则会正常运行,如果有这个现象,就试试 . configure

通过configure程序猜测主机信息,最终建立Makefile,以完成make,所以如果./configure不成功
而去make的话,就会出现"make: *** No targets specified and no makefile found. Stop."
make 当./configure成功结束后,就开始正式编译程序了.
make install 编译成功后使用make install安装
make uninstall 某些软件支持卸载,可能使用该方法卸载,如果支持的话,通常会在README中写到(似乎比较少)

configure程序带有很多参数,可以通过 ./configure --help 查看详细内容,通常位于前面的是常规configure的
参数说明,末尾是该程序的可用参数说明。
./configure --prefix=/usr 指定安装目录,通常从源码包编译安装的软件默认会放在/usr/local下
因为这是FHS(Filesystem Hierarchy Standard)的规定,不知道什么是FHS?看看这篇文章吧:
http://www.pathname.com/fhs/pub/fhs-2.3.html 相信它会让你对linux系统结构有更好的理解,很值得读读。

再说一下几个关系到能否成功编译的东东:/etc/ld.so.conf ldconfig PKG_CONFIG_PATH

首先说下/etc/ld.so.conf:

这个文件记录了编译时使用的动态链接库的路径。
默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件
如果你安装了某些库,比如在安装gtk+-2.4.13时它会需要glib-2.0 >= 2.4.0,辛苦的安装好glib后
没有指定 --prefix=/usr 这样glib库就装到了/usr/local下,而又没有在/etc/ld.so.conf中添加/usr/local/lib
这个搜索路径,所以编译gtk+-2.4.13就会出错了
对于这种情况有两种方法解决:
一:在编译glib-2.4.x时,指定安装到/usr下,这样库文件就会放在/usr/lib中,gtk就不会找不到需要的库文件了
对于安装库文件来说,这是个好办法,这样也不用设置PKG_CONFIG_PATH了 (稍后说明)

二:将/usr/local/lib加入到/etc/ld.so.conf中,这样安装gtk时就会去搜索/usr/local/lib,同样可以找到需要的库
将/usr/local/lib加入到/etc/ld.so.conf也是必须的,这样以后安装东东到local下,就不会出现这样的问题了。
将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择 ^_^
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
/usr/X11R6/lib
/usr/local/lib
/opt/lib

再来看看ldconfig是个什么东东吧 :

它是一个程序,通常它位于/sbin下,是root用户使用的东东。具体作用及用法可以man ldconfig查到
简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件 缓存到/etc/ld.so.cache 以供使用
因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig
使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果
编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。 ^_^
我曾经编译KDE时就犯过这个错误,(它需要每编译好一个东东,都要运行一遍),所以

切记改动库文件后一定要运行一下ldconfig,在任何目录下运行都可以。


再来说说 PKG_CONFIG_PATH这个变量吧:

经常在论坛上看到有人问"为什么我已经安装了glib-2.4.x,但是编译gtk+-2.4.x 还是提示glib版本太低阿?
为什么我安装了glib-2.4.x,还是提示找不到阿?。。。。。。"都是这个变量搞的鬼。
先来看一个编译过程中出现的错误 (编译gtk+-2.4.13):

checking for pkg-config... /usr/bin/pkg-config
checking for glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0... Package glib-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found

configure: error: Library requirements (glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
[root@NEWLFS gtk+-2.4.13]#
很明显,上面这段说明,没有找到glib-2.4.x,并且提示应该将glib-2.0.pc加入到PKG_CONFIG_PATH下。
究竟这个pkg-config PKG_CONFIG_PATH glib-2.0.pc 是做什么的呢? let me tell you ^_^
先说说它是哪冒出来的,当安装了pkgconfig-x.x.x这个包后,就多出了pkg-config,它就是需要PKG_CONFIG_PATH的东东
pkgconfig-x.x.x又是做什么的? 来看一段说明:

代码:

The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the make file execution. pkg-config is a function that returns meta information for the specified library. The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig. You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files are installed. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during run-time.

我想看过这段说明后,你已经大概了解了它是做什么的吧。
其实pkg-config就是向configure程序提供系统信息的程序,比如软件的版本啦,库的版本啦,库的路径啦,等等
这些信息只是在编译其间使用。你可以 ls /usr/lib/pkgconfig 下,会看到许多的*.pc,用文本编辑器打开
会发现类似下面的信息:

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include

明白了吧,configure就是靠这些信息判断你的软件版本是否符合要求。并且得到这些东东所在的位置,要不去哪里找呀。
不用我说你也知道为什么会出现上面那些问题了吧。

解决的办法很简单,设定正确的PKG_CONFIG_PATH,假如将glib-2.x.x装到了/usr/local/下,那么glib-2.0.pc就会在
/usr/local/lib/pkgconfig下,将这个路径添加到PKG_CONFIG_PATH下就可以啦。并且确保configure找到的是正确的
glib-2.0.pc,就是将其他的lib/pkgconfig目录glib-2.0.pc干掉就是啦。(如果有的话 ^-^)
设定好后可以加入到~/.bashrc中,例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:
/usr/X11R6/lib/pkgconfig
[root@NEWLFS ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig

从上面可以看出,安装库文件时,指定安装到/usr,是很有好处的,无论是/etc/ld.so.conf还是PKG_CONFIG_PATH
默认都会去搜索/usr/lib的,可以省下许多麻烦,不过从源码包管理上来说,都装在/usr下
管理是个问题,不如装在/usr/local下方便管理
其实只要设置好ld.so.conf,PKG_CONFIG_PATH路径后,就OK啦 ^_^

另外某些软件因为版本原因(比如emacs-21.3),在gcc-3.4.x下编译无法成功,(make 出错)
使用低版本的gcc就可能编译通过。
可能是因为gcc-3.3.x和gcc-3.4.x变化很大的缘故吧。

暂时想到了这么多,先记下这些吧,如果你对源码包编译有了一点的了解,就不枉我打了这么半天字啦。 ^_^

另外./configure 通过,make 出错,遇到这样的问题比较难办,只能凭经验查找原因,比如某个头文件没有找到,
这时候要顺着出错的位置一行的一行往上找错,比如显示xxxx.h no such file or directory 说明缺少头文件
然后去google搜。
或者找到感觉有价值的错误信息,拿到google去搜,往往会找到解决的办法。还是开始的那句话,要仔细看README,INSTALL
程序如何安装,需要什么依赖文件,等等。

另外对于newbie来说,编译时,往往不知道是否成功编译通过,而编译没有通过就去make install
必然会出错,增加了解决问题的复杂性,可以通过下面方法检查是否编译成功:

一:编译完成后,输入echo $? 如果返回结果为0,则表示正常结束,否则就出错了
echo $? 表示 检查上一条命令的退出状态,程序正常退出 返回0,错误退出返回非0。
二:编译时,可以用&&连接命令, && 表示"当前一条命令正常结束,后面的命令才会执行",就是"与"啦。
这个办法很好,即节省时间,又可防止出错。例:
./configure --prefix=/usr && make && make install

编译DOSBOX时出现"cdrom.h:20:23: SDL_sound.h: No such file or directory"

今天忽然想回味下经典DOS游戏,于是编译这个DOSBOX模拟器,README中说明需要SDL_SOUND
于是下载,安装,很顺利,没有指定安装路径,于是默认的安装到了/usr/local/
当编译DOSBOX make 时,出现如下错误:
if g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I/usr/include/SDL -D_REENTRANT -march=pentium4 -O3 -pipe -fomit-frame-pointer -MT dos_programs.o -MD -MP -MF ".deps/dos_programs.Tpo" -c -o dos_programs.o dos_programs.cpp; \
then mv -f ".deps/dos_programs.Tpo" ".deps/dos_programs.Po"; else rm -f ".deps/dos_programs.Tpo"; exit 1; fi
In file included from dos_programs.cpp:30:
cdrom.h:20:23: SDL_sound.h: No such file or directory <------错误的原因在这里
In file included from dos_programs.cpp:30:
cdrom.h:137: error: ISO C++ forbids declaration of `Sound_Sample' with no type
cdrom.h:137: error: expected `;' before '*' token
make[3]: *** [dos_programs.o] Error 1
make[3]: Leaving directory `/root/software/dosbox-0.63/src/dos'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/root/software/dosbox-0.63/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/software/dosbox-0.63'
make: *** [all] Error 2
[root@NEWLFS dosbox-0.63]#
看来是因为cdrom.h没有找到SDL_sound.h这个头文件
所以出现了下面的错误,但是我明明已经安装好了SDL_sound阿?
经过查找,在/usr/local/include/SDL/下找到了SDL_sound.h
看来dosbox没有去搜寻/usr/local/include/SDL下的头文件,既然找到了原因,就容易解决啦

[root@NEWLFS dosbox-0.63]#ln -s /usr/local/include/SDL/SDL_sound.h /usr/include

做个链接到/usr/include下,这样DOSBOX就可以找到了,顺利编译成功,回味仙剑ing....^_^
曾经编译Xorg-6.8.1的时候,也出现找不到freetype.h的问题,原因也是如此。
编译安装软件时,经常遇到类似的情况,都是因为找不到需要的头文件而出现错误,也许是因为
没有安装相关的头文件,或者是安装了但没有找到,如上例。
找不到的情况:做个链接到/usr/include下,就可以了。
没安装的情况:去google找什么东东包括该头文件,安装上就应该可以了。
通常错误提示也都是"No such file or directory",所以编译失败时要好好找找错误信息哦。
错误信息总是在Error上面不远的,耐心点 ^_^

不修改/etc/ld.so.conf使用非默认路径下的库文件-----LD_LIBRARY_PATH

环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路径。
如果不想修改或无法修改(无root权限)/etc/ld.so.conf而使用其他路径下的库文件
就需要设置LD_LIBRARY_PATH了,例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib
这样就可以使用/opt/lib下的库文件啦。当然还是修改/etc/ld.so.conf方便。

先写到这吧,再有编译感想再增加 ^_^

Friday, June 22, 2007

ld与ld-linux.so.2

ld,和ld-linux.so.2的区别,一个编译时用,一个运行时用,ld负责在它的搜索路径里找到要求的库,并查看是否有提供了需要的符号(如函数等),如果有,记录相关信息到程序中,由ld-linux.so.2在执行时查找到该库并,并根据相关信息进行需要符号的重定位等工作.注意这两者的搜索库的方式是不同的.

Thursday, June 21, 2007

[八卦故事]内核头文件传奇

做 LFS 是不是很累了?OK,让我先来讲一段八卦故事,放松放松神经,然后再继续冒险吧。。。

在 Linux 2.2/2.4 的纯真年代,内核头文件一直保持着 Unix 世界的"KISS"传统,只需将内核源码树中的头文件直接复制到 /usr/include 中即可使用,一切都是那么 Simple and Stupid ...

但是随着 2.6 系列内核的发布,事情开始变得混乱和复杂起来。首先是内核开发者宣布强烈反对直接使用"未净化"的"原始"内核头文件,他们建议使用发行版提供的"经过净化的"内核头文件。于是各种发行版开始"八仙过海,各显神通",由于"净化"方法各不相同,结果就是每个发行版都有着自己与众不同的内核头文件。更为严重的是,内核开发者甚至推荐编译 Glibc 的头文件也要使用发行版提供的"经过净化的"内核头文件。由于 Glibc 和 Kernel 是整个系统的根基,这样一来 Linux 便像传统的 Unix 那样开始走向分裂。

另一件哭笑不得的事情是,虽然内核开发者强烈推荐使用发行版提供的"经过净化的"内核头文件,但是 Glibc 的开发者却不买账,他们推荐使用"未净化"的"原始"内核头文件来编译 Glibc ,两个开发组一直坚持各自的见解,互不妥协!另外,两个开发组在应当由谁提供内核头文件的问题上意见也不一致:内核开发组认为应当由发行版的制作者提供,而 Glibc 开发组认为应当由内核开发组提供。结果就是"神仙打架,凡人遭殃",虽然对 Debian 这种大型发行版来说,提供自己独有的"经过净化的"内核头文件不会成为多大的负担,但是对于那些没有能力或精力的小心发行版制作者和我们这些 DIY fans 来说却是一场灾难!要么直接使用其他发行版的成果,要么自力更生;前者让人心有不甘(没有了 DIY 的原汁原味),后者让人望而生畏(有几个人知道啥叫"净化"?怎么净化?)。

危机时刻总会有英雄的出现,就在一片恐慌之际,一个叫"linux-libc-headers"项目组诞生了!他们向我们这些"凡人"们提供了安全的、普遍适用的、"经过净化的"内核头文件,真是及时雨啊!天空重新晴空万里……然而好景不长,由于精力和人力有限,该项目在发布了 2.6.12.0 版本之后,遗憾的离开了这个世界。这样一来,2.6.12 以上版本的内核新特性(比如新的系统调用)和 ABI/API 的变化就无法反映出来,对于我们这些 DIY fans 来说,世界重回混沌……

俗话说,"合久必分,分久必合",大概是内核开发组意识到了如果继续固执己见将不可避免的导致混乱以及重蹈 Unix 逐渐走向分裂的覆辙,于是从 2.6.18 版本开始,内核开发组担负起了维护一份统一的、"经过净化的"内核头文件的职责(窃以为这原本就是他们的责任)。现在获取"经过净化的"内核头文件又变得简单起来,只要在内核源码树中使用 make headers_install 即可,而且不用再担心更新问题。对于我们这些 DIY fans 来说,又可以重新 Day Day Happy 了。

不过,由于磨合需要时间。目前 Glibc-2.4 以下的版本都无法配合这种新式头文件编译成功。不过偶相信前途一片光明……

Wednesday, June 20, 2007

Get counted -- LFS6.2 by iveney!

LFS ID Name First LFS Version
18672 iveney 6.2

忙活了整个星期(我比较笨……)
总算把lfs搭好了,虽然是在虚拟机上。
不过用起来真的很清爽的,ls一下/etc也只有那么几个文件,不像其他发行版,往往几屏都装不下的配置文件。
而且,最重要的是,从中我学到了许多的东西!

[zz]Linux系统的相关专业术语发音

原文地址:http://www.91linux.com/html/article/...0618/2855.html

Linux 相关专业术语发音 和 Linux 相关方面有很多专业术语,这些词语一般都不好直接翻译成中文,如果不知道它们的发音在交流时要不念它们的字母,要不就想当然的乱说,特别是为人师表更应该正确的掌握它们的发音,不然很容易误人子弟。就像那天妹跟我说,他们的英语老师每天都会教一些课外常用词汇,如:我们经常在加油站看见 CNG 的标识,那是什么意思呢?老师认真的说道,那是中国天然气 (China Natural Gas) 的意思,瞧,这不是闹笑话了吗?
这些专业术语要分两类,一种是原本就有这个词,但在 IT 业中它已经是另外一种意思了 (一般都是根据原有词来命名的),但读法保持不变,代表有:Fedora (一种浅顶软呢帽)、Opera (歌剧)、Safari (旅行)、Apache (印第安人的一个种族)、python (蟒蛇) 等等,Ubuntu 也应该属于这类;另外一种就是合成词、自造词,这种东西的读法最困难,代表有:GNU (GNU’s Not Unix)、Linux、GNOME (GNU Network Object Model Environment)。
以下专业术语都注有音标,可以按照他们的音标来正确发音,对于以上说的第一类词语是完全没有问题的,但那些合成词或自造词发音都来源于互联网,我不能保证它们百分百的正确,只是一个参考而已。以下词语有些并不和 Linux 相关,也一并放上去了。
操作系统相关
Unix: [ ju:niks ] 发音 (yew-nicks) 尤里克斯
GNU [ gəˈnju: ] 发音 (guh-noo) 葛扭
Linux: [ ‘li:nэks ] 里那克斯
GNOME: [ gəˈnoʊm ] 发音 (guh-nome) 葛擩呣
Debian: [ ˈdebiən ] 发音 (deb-e-un)
Ubuntu: [ ùbúntú ] 发音 (oo-BOON-too) 乌班图
SuSE: [ zuzə ] 发音 (su-zee)
Fedora: [ fi’dɔ:rə ]
Solaris: [ səu’leris ] 瑟’拉瑞丝
Leopard: [ ‘lepəd ]
浏览器相关
Mozilla = Mosaic + Godzilla ( Mo=[’mәu] zilla=[zilʌ] )
Mozilla: [mәu’zilʌ] 官方中文译法 “谋智“
Firefox: [ faiefɔ:ks ]
Opera: [ ‘ɔpərə ]
Safari: [ sə’fa:ri ]
Netscape: [ netskeip ]
Konqueror: [ ‘kɔŋkərə ]
其他方面
Apache: [ ə’pætʃi ] 阿帕奇
python: [ ‘paiθɔn ] 派森
perl: [ pə:l ] 泼尔
Pidgin: [ ‘pidʒin ] 裴金
Beryl: [ ‘beril ] 贝里尔
Samba: [ ’sæmbə ] 桑巴
Rhythmbox: [ ‘riðəmbɔks ]
WiFi: [ ‘waifai ]
WYSIWYG: [ ‘wiziwig ]

Thursday, May 31, 2007

FC7 Release - 转载自LinuxTOY

Fedora 7 发布

Fedora 7(开发代号为“Moonshine”)按照其预定的发布计划于今日正式推出了。其中值得注意的更新包括 KDE 3.5.6、GNOME 2.18、Xorg 7.3、Linux Kernel 2.6.21 等。

Fedora 7
image from Phoronix

Fedora 7 也包含了 KVM 虚拟化技术、Liberation 字体、以及 tickless 内核等新特性。更为详细的信息,可查阅邮件列表中的 Fedora 7 发布公告

- Download Fedora 7
- Download Fedora 7 (via bittorrent)

Tags: , ,

awesome!!! Can't wait to upgrade to KDE4! -- New KWin Effect!

太爽了!详细请看Lubos的youtube
http://www.youtube.com/watch?v=SWaSz4smYlg

Saturday, May 26, 2007

[zz]Linux下用fortune制作诗词检索系统

Linux下有一个小程序fortune,能随机打印一些名言警句(有好的,有不好的)之类的。有时用来试试运气,大概就是它叫fortune的原因吧。
fortune带了一个参数"-m"用来从fortune文件中搜索指定的模式。
例如:


[sprite@calabash python]$ fortune -m "tired of think"
%% (fortunes)
A conclusion is simply the place where someone got tired of thinking.


因此,在此基础上做一个小诗词检索系统。下面是基本步骤。

1、安装fortune。

2、制作自己的fortune文件,文件的内容当然就是诗、词了。具体方法如下:
(1)把诗词录入文本文件,每首词之间用“%”分开。例如:

【年代】:先秦
【作者】:伯夷叔齐
【作品】:采薇歌
【内容】:

登彼西山兮,采其薇矣。
以暴易暴兮,不知其非矣。
神农虞夏,忽焉没兮。
吾适安归矣。
吁嗟徂兮,命之衰矣。
%
【年代】:先秦
【作者】:荆轲
【作品】:易水歌
【内容】:

风萧萧兮易水寒,壮士一去兮不复还。
%

(2)然后用strfile将其制作成随机访问文件。
[sprite@calabash ~]$ /usr/sbin/strfile poet

在当前目录下会形成poet.dat的文件。
(3)将这两个文件拷贝到fortune目录下。
sudo cp poet poet.dat /usr/share/fortune

3、然后就可以从poet中检索诗词了。
[sprite@calabash ~]$ fortune -m "钱多事少" poet
%% (poet)
【年代】:当代
【作者】:佚名
【作品】:工作
【内容】:
钱多事少离家近,
位高权重责任轻。
睡觉睡到自然醒,
数钱数到手抽筋。

如果觉得上面的命令麻烦,写一个脚本放到~/usr/local/bin中


#!/bin/bash
fortune -m "$*" poet

在notebook上挂载sd卡

问题
新买的laptop有5 in 1 card reader,插入SD卡,执行dmesg提示:
tifm_7xx1: sd card detected in socket 1

自动能检测到有SD卡插入,但未能自动挂载(GNOME提供的gnome-mount仅能自动挂载U盘和CD/DVD ROM)
但是在/dev里没有发现类似的文件,怎么办呢?


解决
上网查后,知道了必须挂载相应的读写模块才能进行读写.方法如下:


[root@DMH387 ~]# modprobe tifm_sd



挂载tifm_sd模块,用于SD卡读写.

此时在/dev中就多了 mmcblk0 和 mmcblk0p1.意思应该是SD/MMC card 0 以及其第一个分区吧.如果有开GNOME的自动挂载功能,应该能发现并自动挂载(另外,在gnome panel上的磁盘挂载者applet也相应出现(在面板上添加了,但是不出现,直到插入SD卡或其他需要挂载的设备))
如下:


[root@DMH387 dev]# mount | grep mmc
/dev/mmcblk0p1 on /media/disk type vfat (rw,noexec,nosuid,nodev,shortname=winnt,uid=500)



自动挂载
可以在/etc/modules文件里添加需要自动挂载的模块,如以上情况,则可以添加:


#auto mount sd card
tifm_sd


到该文件,以实现启动自动加载该模块

Friday, May 25, 2007

[zz]通向KDE4之路(十五):Konsole大整修

Konsole会变成如何呢?
KDE4越来越值得期待了!让我们拭目以待!

Thursday, May 24, 2007

/etc/X11/prefdm : 更改自己喜欢的xdm

我们知道,在/etc/X11/prefdm文件里,有一个地方记录了自己喜爱的xdm:

# Run preferred X display manager
preferred=gdm

通过修改为gdm/kdm等,可以改为gdm,kdm.
但是这个脚本是什么时候被执行的呢?

原来,在/etc/inittab里有这么一行:

# Run xdm in runlevel 5
x:5:once:/etc/X11/prefdm -nodaemon


当init执行到这行时,就执行了这个脚本来运行自己喜爱的xdm.

总结:Linux服务大全

在网上摘抄的一些,由于年代久远,也许很多都过时了,不过还是很有参考价值的。

LINUX守护进程介绍

amd:自动安装NFS(网络文件系统)守侯进程
apmd:高级电源管理
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
Autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息
crond:Linux下的计划任务
Dhcpd:启动一个DHCP(动态IP地址分配)服务器
Gated:网关路由守候进程,使用动态的OSPF路由选择协议
Httpd:WEB服务器
Inetd:支持多种网络服务的核心守候程序
Innd:Usenet新闻服务器
Linuxconf:允许使用本地WEB服务器作为用户接口来配置机器
Lpd:打印服务器
Mars-nwe:mars-nwe文件和用于Novell的打印服务器
Mcserv:Midnight命令文件服务器
named:DNS服务器
netfs:安装NFS、Samba和NetWare网络文件系统
network:激活已配置网络接口的脚本程序
nfs:打开NFS服务
nscd:nscd(Name Switch Cache daemon)服务器,用于NIS的一个支持服务,它高速缓存用户口令和组成成员关系
portmap:RPC portmap管理器,与inetd类似,它管理基于RPC服务的连接
postgresql:一种SQL数据库服务器
routed:路由守候进程,使用动态RIP路由选择协议
rstatd:一个为LAN上的其它机器收集和提供系统信息的守候程序
ruserd:远程用户定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息
rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,允许用户给每个注册到LAN机器上的其他终端写消息
rwhod:激活rwhod服务进程,它支持LAN的rwho和ruptime服务
sendmail:邮件服务器sendmail
smb:Samba文件共享/打印服务
snmpd:本地简单网络管理候进程
squid:激活代理服务器squid
syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
xfs:X Window字型服务器,为本地和远程X服务器提供字型集
xntpd:网络时间服务器
ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程
yppasswdd:NIS口令服务器
ypserv:NIS主服务器
gpm:管鼠标的
identd:AUTH服务,在提供用户信息方面与finger类似

Linux各项系统开机服务的功能是什么?有哪些可以关掉?
Linux在启动时要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。但是,开启不必要或有漏洞的服务则会给操作系统带来安全和性能上的影响。下面我们以BluePoint Linux 2.0的开机服务为例,列表说明各项服务的功能。

alsasound
Alsa声卡驱动程序支持。Alsa声卡驱动程序本来是为了 一种声卡Gravis UltraSound(GUS)而写的,该程序被证明很优秀,于是作者就开始为一般的声卡写驱动程序。 Alsa和OSS/Free 及OSS/Linux兼容,但是有自己的接 口,甚至比OSS优秀。

amd
运行automount精灵程序,该精灵在必要时自动安装一些 本地设备和NFS文件系统。

apmd
apmd用来监视系统用电状态,并将相关信息通过syslogd 写入日志。也可以用来在电源不足时关机。

arpwatch
该程序主要用来维护以太网物理地址和IP地址的对应关系。

atalk
AppleTalk精灵程序。注意不要在后台运行该程序,该程 序的数据结构必须在运行其他进程前先花一定时间初始化。

atd
运行用户用At命令调度的任务。也在系统负荷比较低时 运行批处理任务。

autofs
当您需要时自动转载文件系统,而当您不需要时自动卸载。

bootparamd
该服务允许老的Sun工作站从Linux网络启动,它和rarp 现在很少使用,基本上被bootp和dhcp取代了。

crond
cron是Unix下的一个传统程序,该程序周期地运行用户 调度的任务。比起传统的Unix版本,Vixie版本添加了不 少属性,而且更安全,配置更简单。
dhcpd 该精灵提供了对动态主机控制协议(Dynamic Host Control Protocol)的访问支持。

gated
gated通过一个数据库提供了网络路由功能支持。它支持 各种路由协议,包括RIP版本1和2、DCN HELLO协议、 OSPF版本2以及EGP版本2到4。

gpm
gpm为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。它也支持控制台下鼠标 的拷贝,粘贴操作以及弹出式菜单。

httpd
http是著名的www服务器,可用来提供HTML文件以 及CGI动态内容服务。

inetd
因特网操作服务程序。监控网络对各种它管理的服务的需 求,并在必要的时候启动相应的服务程序。通常,inetd 管理的程序有telnet、ftp、rsh和rlogin。关闭inetd也就 关闭了这些由它管理的服务。

innd
inn是最流行的用户组新闻服务器。它允许您建立起本地 新闻服务器。配置有一定的难度,可以先阅读/usr/doc/ inn*文档获得帮助。


keytable 该程序的功能是转载您在/etc/sysconfig/keyboards里说 明的键盘映射表,该表可以通过kbdconfig工具进行选 择。您应该使该程序处于激活状态。

ldap
LDAP代表Lightweight Directory Access Protocol, 实现了目录访问协议的行业标准。

linuxconf
linuxconf是Linux下的一个有效的系统配置工具,该服 务允许远程运行。

lpd
lpd是系统打印守护程序,负责将lpr等程序提交给打印 作业。

mcserv
Midnight Commander服务进程允许远程机器上的用户 通过Midnight Commander文件管理器操作本机文件。服 务进程用PAM来验证用户,需要给出“用户名/口令” 以通过验证。

mysql 一个快速高效可靠的轻型SQL数据库引擎。

named 域名服务器,将Internet主机名解析为点分的IP地址。

netfs 负责装载/卸载NFS、Samba、NCP(Netware)文件系统。

network 激活/关闭启动时的各个网络接口。

nfs
NFS是一个流行的基于TCP/IP网络的文件共享协议。该 服务提供了NFS文件共享服务,具体的配置在/etc/ exports文件里。

nscd
该服务负责密码和组的查询,并且缓冲查询结果。如果您 的系统有比较慢的服务(如NIS和NIS+),则应该启动该 服务。

pcmcia pcmcia 主要用于支持笔记本电脑。

portmap portmap 用来支持RPC连接,RPC被用于NFS以及NIS 等服务。

postgresql PostgreSQL 关系数据库引擎。

proftpd proftpd 是Unix下的一个配置灵活的ftp守护程序。

radvd 路由广播程序。

random
保存和恢复系统的高质量随机数生成器,这些随机数是系 统一些随机行为提供的。

routed
该守护程序支持RIP协议的自动IP路由表维护。RIP主要 使用在小型网络上,大一点的网络就需要复杂一点的协议。

rstatd Rstat协议允许网络上的用户获得同一网络上各机器的性能 参数。

rusersd 该服务使网络用户可以定位同一网络上的其他用户。

rwalld
Rwall协议允许远程用户向在同一系统中活跃着的终端发送 消息,类似wall的本地行为。

rwhod
允许远程用户获得运行rwho精灵的机器上所有已登录用户 的列表,与finger类似。

sendmail 大名鼎鼎的邮件服务器。

smb 启动和关闭smbd和nmbd精灵程序以提供SMB网络服务。

snmpd 简单网络管理协议(SNMP)的守护精灵。

syslog
syslog是操作系统提供的一种机制,守护程序通常使用这 种机制将各种信息写到各个系统日志文件。通常应该启动 该服务。

xfs X的字体服务器。
ypbind NIS/YP的客户端守护程序。如果您需要使用NIS/YP机 器,请启动这项服务,否则,关闭这项服务。

yppasswd
让NIS用户能够修改密码。运行在NIS域的服务器上。客 户端程序同样也叫yppasswd。

ypserv
标准NIS/YP网络协议的一个实现。允许主机名,用户名 和其他信息分布于网络各端。运行在NIS服务器上,客户 端不需要。


http://developer.ccidnet.com/pub/dis...33276&pageNO=1

定制自己的Linux应用环境(一)
作者:曹江华 本文选自:开放系统世界--赛迪网 2002年12月11日

基于开放源代码的Linux给用户提供了这样一个平台:可以根据自己的软、硬件环境,定制自己的Linux应用环境。因此,根据每个用户不同的应用范围定制应用环境,可以将Linux系统的性能提升到新的高度。

定制系统服务


Linux在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。但是,开启不必要或有漏洞的服务则会给操作系统带来安全和性能上的影响。对于系统安全来说,如果操作系统中的任何一个漏洞,都可能使整个系统受到攻击。所以,增加系统安全的最佳办法就是尽量监视系统的功能。至于选择多少服务和功能,要根据工作需求和能力来决定。

下面以root身份运行:

#ntsysv





图1 将不需要的服务和进程前面的*去掉


打开如图1所示的窗口,在此可以开启/关闭每一项系统服务(以Red Flag 3.0为例)。将不需要的服务和进程前面的*去掉(用空格键),然后重新启动系统,这样就可以使不需要的服务和进程不再启动。用这种办法可以随时根据需求定制系统服务,不但安全有保障,而且还能提高系统的性能,一举两得。要保障Linux正常工作,有些系统服务是必须启动的,例如crond、 syslog、keytable、nfs、 kudzu。

为了高效安全地定制系统服务,下面介绍一下各项系统服务的功能。

alsasound Alsa 声卡驱动程序支持。Alsa声卡驱动程序本来是为了一种声卡Gravis UltraSound(GUS)而写的,它和OSS/Free 及OSS/Linux兼容。

apmd 用来监视系统用电状态,并将相关信息通过syslogd 写入日志,也可以用来在电源不足时关机。一般用于笔记本电脑,若是台式机建议关闭。

atd 用At命令调度的任务,也在系统负荷比较低时运行批处理任务。

autofs 需要时自动转载文件系统,不需要时自动卸载。

chargen 端口chargen字符产生的缩写,输出一个可打印字符的旋转序列,用于测试字符终端设备。

chargen udp udp格式下端口chargen字符产生的缩写,输出一个可打印字符的旋转序列,用于测试字符终端设备。

crond 根据用户要求周期地运行调度的任务。它比较安全,配置简单,类似Windows中的计划任务。

dhcpd 提供了对动态主机控制协议(Dynamic Host Control Protocol)的访问支持。

echo 端口echo简单地回应所有为测试连接发送给它的数据。

echo udp udp格式下端口echo简单地回应所有为测试连接发送给它的数据。

gpm 为文本模式下的Linux程序,如MC(Midnight Commander)提供了鼠标的支持。它也支持控制台下鼠标的拷贝、粘贴操作及弹出式菜单。

inetd 因特网操作服务程序。监控网络管理服务的需求,并在必要的时候启动相应的服务程序。通常,inetd 管理的程序有telnet、ftp、rsh和rlogin。关闭inetd也就关闭了这些由它管理的服务。

http 它是著名的WWW服务器,可用来提供HTML文件以及CGI动态内容服务。

isdn isdn的守护程序。

keytable 该程序的功能是转载/etc/sysconfig/keyboards里说明的键盘映射表。该表可以通过kbdconfig工具进行选择,应该使该程序处于激活状态。

kudzu 它是一个硬件检测程序,和Windows中的添加新硬件差不多。如果系统核心支持该硬件,并且有该驱动程序,就可自动装载。

linuxconf 它是Linux下一个有效的系统配置工具,该服务允许远程运行。

linuxconf web 在Web方式下使用linuxconf。

lpd 系统打印守护程序,负责将lpr等程序提交给打印作业。

medusa 支持Web的浏览器。

mysql 一个快速高效可靠的小型SQL数据库引擎。

ntalk 允许用户把自己的计算机和其它的计算机连接起来,然后向前或向后传送信息。

netfs 负责装载/卸载NFS、Samba、NCP(Netware)文件系统。

network 激活/关闭启动时的各个网络接口。

nfs 一个流行的、基于TCP/IP网络的文件共享协议。该服务提供了NFS文件共享服务,具体的配置在/etc/ exports文件里。

nscd 该服务负责密码和组的查询,并且缓冲查询结果。如果系统有比较慢的服务(如NIS和NIS+),则应该启动该服务。

pxe 用于远程无盘的Linux系统启动的服务程序。

pcmcia 主要用于支持笔记本电脑。

rexec 它是一个安全、分散式的远程执行系统,用于集群计算机的平行和连续运行。

random 保存和恢复系统的高质量随机数生成器。这些随机数是由系统一些随机行为提供的。

routed 该守护程序支持RIP协议的自动IP路由表维护。RIP主要使用在小型网络上,大一点的网络就需要复杂一点的协议。

rsync 叠加的Ftp Server,允许循环检查。

rsh 远程主机上启动一个shell,并执行用户命令。

rwhod 允许远程用户获得运行rwho守护程序的机器上所有已登录用户的列表,与finger类似。

swat Samba的一个工具包,使用901号端口。

sendmail 邮件服务器。

smb 启动和关闭smbd和nmbd守护程序,以提供SMB网络服务。

snmpd 简单网络管理协议(SNMP)的守护程序。

syslog 是操作系统提供的一种机制,守护程序通常使用这种机制将各种信息写到各个系统日志文件。通常应该启动该服务。

xfs X-Window系统的字体服务器。

xinetd 是inetd继承服务,监控网络对各种管理的服务的需求,并在必要的时候启动相应的服务程序。

以上这些系统服务中,安全隐患比较大的是:rsh、rwhod、rexec、snmp、named、sendmail。对于确实需要的系统服务,应该尽量选用最新的版本程序,并增加其它安全防范。



Linux系统服务学习心得——不断补完中

一直以来都对这个概念半知半解,现在越来越觉得不能再拖下去了,一定要深入了解其运行机制,以提高自己的工作效率以及让自己用系统用得更爽快~

进入/etc目录,有一个叫做rc.d的文件夹,而且,还有rc[0-6].d的文件夹。但是,rc[0-6].d是到/etc/rc.d/rc[0-6].d的符号链接。

在/etc/rc.d目录里,有这么些文件:

init.d
rc
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.local
rc.sysinit

以下分别解释一下各个文件/目录的作用:

init.d
包含一组script. 基本上, 在启动时或进入另一个运行级别时, 每个服务(service)需要一个script来进行自启动. Services包括SSHD,sendmail, HTTPD等等.


rc[0-6].d
我们首先要知道"启动级别"的概念.
可以查看到里面有类似以下的内容:


# vi /etc/inittab

Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6


意思是,系统可以看作一个状态机,启动后可以进入0-6这几个级别,但是如果启动后直接进入停机/重启级别就没意思了吧?因此应该进入1,2,3,5这几种级别之一,功能分别如注释里面所说.我们一般选择3--多用户全功能模式,或5--在3的基础上进入X.

进入不同的启动级别会启动对应级别的服务.这就是rc[0-6].d的作用.我们执行以下命令:


# cd /etc/rc.d/rc5.d
# ls -l
lrwxrwxrwx 1 root root 15 04-30 16:26 K01smolt -> ../init.d/smolt
lrwxrwxrwx 1 root root 24 02-05 01:22 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
lrwxrwxrwx 1 root root 16 02-05 01:22 K02dhcdbd -> ../init.d/dhcdbd
lrwxrwxrwx 1 root root 24 02-14 20:06 K02NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx 1 root root 34 02-05 01:23 K02NetworkManagerDispatcher -> ../init.d/NetworkManagerDispatcher
lrwxrwxrwx 1 root root 19 02-05 01:22 K05saslauthd -> ../init.d/saslauthd
lrwxrwxrwx 1 root root 23 03-17 23:47 K08vmware -> /etc/rc.d/init.d/vmware
lrwxrwxrwx 1 root root 13 02-05 10:09 K09vdr -> ../init.d/vdr
lrwxrwxrwx 1 root root 19 02-05 01:29 K10dc_server -> ../init.d/dc_server



可以看到,在rc5.d里面,没有真实存在的文件!只有符号链接!

所以我们可以看出

系统所有具有自启动功能的服务,都必须拥有一个用于配置启动的脚本,这些脚本放在/etc/rc.d/init.d/里;而在rc[0-6].d里,则分别指明了对应的启动级别会启动的服务,因此,可以针对不同的启动级别设定要启动的服务!


这些连接的命名规则如下:
一个字母+一个数字+启动脚本
'S'是指启动这个特定的script, 'K'是指结束它,即kill。 数字是顺序,Init将根据顺序启动所有的services. 因此我们可以用一个两位数字和一个大写的'S'或'K'来启动或结束所需要service。

Init如何启动和结束service? 很简单. 每个script都写了一个接收参数用来'start' 和'stop'. 我们可以用命令行来执行这些script, 如:


/etc/rc.d/init.d/httpd stop #结束httpd服务器.

Init只需读文件名, 如果有'K', 它就用'stop'参数调用script. 如果有'S',则用'start'参数.

rc.sysinit
这是一个脚本,在系统启动时运行一次.这关系到系统启动流程:init读取inittab获得运行级别后将执行这个脚本进行系统初始化.关于这个步骤所进行的工作有很多,推荐鸟哥文章:
開機關機流程與 Loader

rc.local
在启动时或者修改运行级别时, 当所有的其他初始化完成后, 将执行文件/etc/rc.d/rc.local. 可以在这增加新的初始程序,我们自己所编写的程序建议加在该文件中。我们可以看到在rc*.d目录下启动顺序为99的链接文件名为S99local,是一个指向rc.local的链接.这说明在改运行级别所有服务都启动后,就执行rc.local脚本.比方说,我要开机后自动执行我自己编写的一个程序,就可以在该脚本里加入启动该程序的命令.更一般的做法是,编写自己相应的模块化的脚本,每个脚本只完成一项工作,然后把运行该脚本的命令放入rc.local里,就可以更好地管理了!

rc
这是一个脚本,作用是切换运行级别时start/stop相应运行级别的服务.

关于service命令
这个命令其实实际工作是,进入/etc/rc.d/init.d目录里搜寻作为参数传递进来的服务名,然后执行之.以下代码执行效果完全一样:

# 使用service 命令启动httpd
# service httpd start
# 直接执行启动脚本启动httpd
# /etc/rc.d/init.d/httpd start

事实上,service只是一个脚本文件,可以在/sbin下找到它并查看内容.

关于chkconfig命令
我们一般不手动更改rc*.d目录下的文件及结构,而是通过系统提供的实用程序来完成:


[root@localhost rc5.d]# whatis chkconfig
chkconfig (8) - updates and queries runlevel information for system services
chkconfig (rpm) - 用来维护 /etc/rc*.d 文件层次的系统工具。



keytouch终于配置成功了

keytouch是一个linux下配置特殊键映射的工具,对于手提笔记本的键盘特别有用,因为一般每部laptop的键盘都各有特色,有很多厂商专门设计的按钮。比如我的笔记本是Acer TravelMate 3273WXMi,左上角的"e","mail","WWW","P"键就必须有专门驱动支持。可惜ACER只提供了windows下的驱动,要让它们在小企鹅下活起来,就必须好好利用keytouch的强大功能。


其实keytouch我很早以前就装上了,但是由于没有已经配置好的键盘,于是只好随便找了个类似的ACER机子的映射文件来用,这样就基本上只有音量调节钮可以用。今天终于忍受不了了,于是上官方网站仔细看了看,发觉,原来有keytouch-editor这个好东东,这下子,就做到了所有键盘都支持了——我们可以专门使用它来为自己的键盘localization。

1.安装keytouch
http://keytouch.sourceforge.net
上官方网站下载keytouch-2.3.0的src(也可以直接下载RPM/DEB包,可惜没有FC下的,以前安装的keytouch-2.3.0-pre4配置得很好,插件很齐。但是在我的机子上好像有BUG).
解压后编译安装,这里要注意的是安装个官方安装手册说明,必须分别在keytouch-2.3.0,keytouch-2.3.0/keytouch-config,keytouch-2.3.0/keytouch-keyboard目录里进行configure,make,make install。

2.安装keytouch-editor
直接下载最新的RPM包或DEB包进行安装即可。

3.生成键盘配置
运行keytouch-editor进行配置.必须以root身份进行.
首先选择自己的键盘类型,按确定后,随便按一个特殊键进行操作.然后即可新建一个映射,按提示进行具体映射。(其实,所有键都可以映射!功能非常强大!因此,我把UP键左右两个没用的货币符号分别映射为audacious和smplayer,hoho)
我主要映射了这几个键,其他键我的FC6都原生支持。
E -- 启动我的wireless assitant
mail -- 启动revolution
WWW -- 启动firefox
P -- 启动keytouch
mute -- 静音
Volume Up/Down -- 调节音量

另外F1-F4上面几个,以后也许可以充分利用起来...hoho
所有键都映射好后,就可以保存文件并且在keytouch里导入了(是个XML格式的文件)。

4.配置keytouch
运行keytouch后,首先会提示选择键盘,这里import刚才创建的文件并选择之即可.导入后以后就可以方便地直接在keytouch里进行配置了!enjoy!!

Wednesday, May 23, 2007

[zz]linux的source命令

source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。同样的,当前脚本中设置的变量也将作为脚本的环境,source(或点)命令通常用于重新执行刚修改的初始化文件,如 .bash_profile 和 .profile 等等。例如,如果在登录后对 .bash_profile 中的 EDITER 和 TERM 变量做了修改,则可以用source命令重新执行 .bash_profile 中的命令而不用注销并重新登录。象 .bash_profile 或其它类似的Shell脚本这样,文件无需可执行权限即可用source或点命令执行。



source命令的一个妙用

在编译核心时,常常要反复输入一长串命令,如

make mrproper

make menuconfig

make dep

make clean

make bzImage

.......

这些命令既长,又繁琐。而且有时候容易输错,浪费你的时间和精力。如果把这些命令做成一个文件,让它自动按顺序执行,对于需要多次反复编译核心的用户来说,会很方便。用source命令可以办到这一点。它的作用就是把一个文件的内容当成是shell来执行。先在/usr/src/linux-2.4.20目录下建立一个文件,取名为make_command:

在其中输入如下内容:

make mrproper &&

make menuconfig &&

make dep &&

make clean &&

make bzImage &&

make modules &&

make modules_install &&

cp arch/i386/boot/bzImge /boot/vmlinuz_new &&

cp System.map /boot &&

vi /etc/lilo.conf &&

lilo -v

文件建立好之后,以后每次编译核心,只需要在/usr/src/linux-2.4.20下输入

source make_command

就行了。这个文件也完全可以做成脚本,只需稍加改动即可。这里主要是让大家理解source的用法。如果你用的不是lilo来引导系统,可以把最后两句话去掉。配置你自己的引导程序来引导新内核。



shell 编程中的命令有时和C语言是一样的。&&表示与,||表示或。把两个命令用&&联接起来,如 make mrproper && make menuconfig ,表示要第一个命令执行成功才能执行第二个命令。对执行顺序有要求的命令能保证一旦有错误发生,下面的命令不会盲目地继续执行。




Tuesday, May 22, 2007

笑话:"你能想出多少种方法让机器正常关机?"

答案一

alias guanji1 shutdown
alias guanji2 shutdown
alias guanji3 shutdown
alias guanji4 shutdown
alias guanji5 shutdown

guanji1
guanji2
guanji3
guanji4
guanji5


答案二

1、shutdown
2、halt(haltsys)
3、init 0
4、kill -9 1 ----好象不行吧!
5、三次sync(书上写的,在我的系统上不好使:) ----我的Linux下用不了,不知道Unix系统行不?

1、shutdown -h now
2、halt(haltsys)
3、init 0
4、poweroff
5.支持ACPI可以直接按Power开关安全关机
6.ctrl+alt+del 重启到BIOS检测时关机
7.图形界面下可以选择“关机"

让console与X剪贴板交互——xclip

一直在为如何快速把stdio重定向到X的剪贴板感觉到困惑。很多时候不得已只能使用鼠标拖动高亮后使用中键进行选择(要是鼠标没中键怎么办?!)
今天终于给我知道了有xclip这么个utility...(不要BS我阿>_<)




$ uname -a | xclip #把uname -a的输出pipe到X的primary buffer,即XA_PRIMARY


具体可以查看man xclip。作者写了非常详细易懂的介绍,里面有一句话我很欣赏~

I hate man pages without examples!


呵呵,有example果然能很快上手。

我使用了

alias xcp="xclip -selection clip "


来定义了一个xcp命令,作用与xclip一样,不过默认使用XA_CLIPBOARD,这样就可以方便地使用C-v来进行粘贴了。这在贴程序的时候特别方便,比如


[iveney@localhost excersize]$ xcp combine.java


然后就可以……xixi

热烈庆祝文泉驿进入 fedora 仓库!!!

今天逛linuxsir时无意中看到的消息,恭喜恭喜~
原帖地址:
http://www.linuxsir.org/bbs/showthread.php?p=1706640#post1706640

本人从开始使用linux开始就对它的中文字体渲染没感到舒服过,连java都不如……为了配置宋体,Tahoma的显示浪费了很多时间。自从文泉驿出现后,再也不用为字体问题操劳啦~
虽然是点阵字,但是也够用了。