Upstart: Ubuntu 的基于事件的启动进程

译者:王旭(gnawux at gmail.com)

    译注:尽管译者是一位铁杆的Debian粉丝,但也注意 upstart 很久了,就译者本人观点,upstart 应该说是 Ubuntu 所做的众多工作中最为杰出的一个,它将可以极大地加快 Linux 系统启动的过程。尽管它不是惟一的下一代 init 程序,但它已经作为 Ubuntu 的缺省 init 进程工作了相当长的时间,这点将极大有助于程序的成熟;而且,upstart 使用了基于事件的模型,而不是简单的将各个 daemon 并行化,这个架构上的突破也是具有革命性的,下面我们来看这篇文章吧。

    因为传统的System V 的 init daemon (Sysvinit)无法很好地处理现代硬件,如热插拔设备、USB硬盘或山村、网络文件系统等,Ubuntu 使用了Upstart init daemon。

    本文抽取自最近出版的 A Practical Guide to Ubuntu Linux.

    目前已经有多种 sysvinit 的替代产品了,这其中最为著名的一个就是 initng,它已经可以用于 Debian 了,并且在 Ubuntu 上也能工作。在同一位置上,Solaris 使用 SMF (Service Management Facility),而 Mac OS 则使用 launchd。而 Ubuntu 则更倾向于集这些软件的优点于一身。

    Sysvinit daemon 是一个基于运行级别的初始化程序,它使用了运行级别(如单用户、多用户等)并通过从 /etc/rc?.d 目录到 /etc/init.d 目录的初始化脚本的链接来启动与终止系统服务。自从 Feisty 开始,Ubuntu 转向了 Upstart init daemon,并开始将Sysvinit 设置转换为 Upstart 的设置。本文探讨 Upstart 和残存的部分 Sysvinit 遗迹:/etc/rc?.d 和 /etc/init.d 目录以及运行级别的概念。

    Upstart init daemon 是基于事件的,当系统中的什么情况发生变化时,它会运行某个特定的程序。这里被运行的程序多半是用来启动或终止服务的脚本。这个配置方式和systemv 在系统进入某个运行级别的时候运行init脚本的链接的概念实际上是非常类似的,只不过 upstart 更加灵活一些。Upstart 不仅能在运行级别改变的时候启动或终止服务,也能在接收到系统发生其他改变的信息的时候启动或终止服务。这些系统的改变被称为“事件”。例如,当 upstart 从 udev 接收到运行时文件系统加载、打印机安装或其他类似的设备添加或删除的信息,并采取相应的行动。Upstart 也可以在系统启动、关闭或某个任务状态改变的时候启动或关闭服务。

    Upstart由五个包组成,(Ubuntu 中)它们都会被缺省安装:

    upstart 提供Upstart init daemon 和 initctl 工具。

    upstart-logd 提供 logd daemon 和 logd 服务的工作定义文件。

    upstart-compat-sysv 提供了 rc 任务的工作定义文件,并提供了 reboot, runlevel, shutdown, telinit 等工具,以便与 sysvinit 相兼容。

    startup-tasks 提供了系统启动任务的工作定义文件。

    system-services 提供了 tty 服务的工作定义文件。

    定义

    有几个名词帮助我们理解 init 相关的东西。事件(event)是 init 可以得到的状态变更信息。几乎系统所有的内部或外部状态变更都可以触发一个事件。比如,引导程序会触发启动(startup)事件,系统进入运行级别2会 触发运行级别2(runlevel 2)事件,而文件系统加载则会触发路径加载(path-mounted)事件,拔掉或安装一个热插拔或USB设备(如打印机)也会触发一个时间。用户还可 以通过 initctl emit 命令来手动触发一个事件。

    一个工作(job)是 init 可以理解的一系列指令。典型的指令包括一个程序(二进制文件或是脚本)和事件的名称。Upstart init daemon 会在事件触发的时候运行相应的程序。用户可以分别用 initctl start 和 stop 命令手动启动或终止一项工作。工作又可以分为任务和服务。

    任务是运行、并在执行结束后返回到等待状态的工作。

    服务是那些通常不会自己结束的工作。比如,logd daemon 和 gettys 就被实现为服务。init daemon 会监测每个服务的状态,如果服务出现问题会重启服务,在某些事件触发时或手工停止时会杀死服务。

    /etc/event.d 目录下包含着一系列的工作定义文件(定义了 upstart init daemon 运行的工作的文件)。最初,这个目录由 Upstart 包来生成。在 Feisty 之后的 Ubuntu 中,被安装的服务会向这个目录中添加控制服务的文件,替代哪些安装到 /etc/rc?.d 和 /etc/init.d 目录的文件。

    Upstart init daemon 的核心是一个状态机。它持续跟踪各个工作的状态,当有事件触发的时候,跟踪工作的状态改变。当 init 跟踪到一个工作的状态从一个转变到了另一个的时候,就可能会执行工作的命令或是终止工作。

    System V 的 init daemon 通过改变运行级别来启动或停止服务。而使用 Upstart init daemon 的 Ubuntu 系统没有运行级别的概念。为了将基于运行级别的系统平滑移植到基于事件的系统,并为面向其他发布版的软件提供一定的兼容性,Ubuntu 使用 Upstart 模拟了运行级别。

    在 /etc/event.d/rc? 文件中定义的 rc? 工作会运行 /etc/init.d/rc 脚本,这个脚本会运行链接到 /etc/rc?.d 目录中的 /etc/init.d 中的启动脚本,以模拟 SysVinit 的行为。当系统进入一个运行级别的时候,rc? 工作就会运行这些脚本。同时,Upstart 提供了 runlevel 和 telinit 工具以提供与 SysVinit 的兼容性。

    使用 initctl (init control) 工具,具有 root 权限的管理员可以和 Upstart init daemon 通信。这个工具可以用来启动、停止或报告(report)一项工作。 比如,initctl list 命令会列出所有的工作和它们的状态:

    $ sudo initctl list logd (stop) waitingrc-default (stop) waitingrc0 (stop) waiting…tty5 (start) running, process 4720tty6 (start) running, process 4727

    要获得更详细的信息,可以参考 initctl 的 man page 或本节的例子。使用 initctl help 命令 (help 前没有横杠)可以列出 initctl 的命令列表。此外,也可以用 initctl list –help 来列出 list 命令的帮助信息,当然,将 list 换乘其它的 initctl 命令会得到该命令对应的信息。start, stop 和 status 工具是 initctl 的链接,会直接运行 initctl 的对应命令。

工作(Job)

    /etc/event.d 目录下的每个文件都定义了一个工作,其中至少应该包含一个事件和一个命令。当事件被触发的时候,init 执行对应的命令。本节将介绍管理员自定义的工作和 Upstart 包中包含的工作。

    下面的管理员自定义的工作使用 exec 关键字执行了一条 shell 命令。实际上,也可以用这个关键字执行一个 shell 脚本或一个二进制可执行文件。

    $ cat /etc/event.d/mudat start on runlevel 2exec echo “Entering multiuser mode on ” $(date) > /tmp/mudat.out

    这个文件定义了一个任务:当系统进入到多用户模式(运行级2)的时候执行 echo 命令。这个命令会向 /tmp/mudat.out 文件写出一条包含日期时间消息。shell 会运行 date 命令替换其中的内容。在任务结束后, mudat 任务会停止并进入等待状态。

    在下一个的例子中,cat 命令展示了 /tmp/mudat.out 文件的内容和 initctl list 命令关于这个任务的输出(status 工具也可以得到同样的信息):

    $ cat /tmp/mudat.out Entering multiuser mode on Tue Jul 10 17:34:39 PDT 2007 $ sudo initctl list mudatmudat (stop) waiting

    如果 exec 命令行中包含 shell 的特殊字符, init 会运行 /bin/sh(dash 的符号链接)并把命令行交给它来处理。否则,exec 会直接运行命令行。如果要执行多个 shell 命令,可以把他们放到脚本文件中并运行脚本,或是使用 script….end script (下面会介绍)。

    Upstart initdaemon 只能监测哪些使用 exec 运行的工作(服务),无法监测使用 script…end script 运行的工作。换句话说,服务应该使用 exec 运行,而任务则可以使用任意的方法。

    myjob 示例

    用户也可以自己定义一个事件,并让一个工作被这个事件触发。如下的 myjob 工作定义文件定义了一个被 hithere 事件触发的工作:

    $ cat /etc/event.d/myjob start on hitherescript echo “Hi there, here I am!” > /tmp/myjob.out date >> /tmp/myjob.out end script

    myjob 文件提供了另一种运行命令的方法:在 script 和 end script 关键字之间包含了两行命令。这两个关键字常常导致 init 去运行 /bin/sh。例中的命令将一条消息和日期输出到了 /tmp/myjob.out 文件。现在可以使用 initctl emit 命令触发这个工作。如下,init 展示了 myjobs 在我们的触发下所经历的各个状态:

    $ sudo initctl emit hitherehitheremyjob (start) waitingmyjob (start) startingmyjob (start) pre-startmyjob (start) spawned, process 6064myjob (start) post-start, (main) process 6064myjob (start) running, process 6064myjob (stop) runningmyjob (stop) stoppingmyjob (stop) killedmyjob (stop) post-stopmyjob (stop) waiting $ cat /tmp/myjob.out Hi there, here I am!Sat Jul 7 20:19:13 PDT 2007 $ sudo initctl list myjob myjob (stop) waiting

    在上面的例子里,cat 展示了 myjob 产生的输出,initctl 展示了工作的状态。同样也可以用 initctl start myjob(或直接用 start myjob)来运行它。initctl start 十个非常有用的命令,这样你就可以在没有事件的情况下启动一个工作。比如,你可以用 initctl start mudat 来直接运行前面例子中的 mudat 工作而不会触发 runlevel 2 事件。

    指定带参数的事件

    telinit 和 shutdown 工具发送带有参数的 runlevel 事件。比如,shutdown 发送 runlevel 0,telinit 2 会发送 runlevel 2 事件。你可以在工作定义中用如下格式匹配这些事件:

    start | stop on event [arg]

    其中 event 是一个事件,而 arg 是一个可选参数。要在系统进入 runlevel 2 的时候停止一个工作,可以指定 stop on runlevle 2,也可以指定 runlevel [235] 来匹配运行级 2, 3 和 5,或用 runlevel [!2] 来匹配 2 之外的运行级。

    尽管 Upstart 会忽略掉多余的事件参数,但工作定义文件中的事件名称里的参数必须在事件中存在。比如,没有参数的 runlevel 可以匹配所有的 runlevel 事件,不论是否有参数,但 runlevel S arg2 将不会匹配任何事件,因为 runlevel 事件只会带有一个参数。

    /etc/event.d 中的工作定义文件

    随着 Ubuntu 从 SysVinit 向 Upstart 的迁移,更多地工作会在 /etc/event.d 文件中定义。本节介绍一些 Upstart 包放在这个目录中的工作定义文件。

    /etc/event.d/rc2 工作定义文件定义了 rc2 任务,这和其他的 rc? 任务没什么区别。rc2 任务在系统进入到多用户模式的时候会被触发(事件名称是 runlevel 2);当系统进入到其它任意运行级的时候(runlevel [!2])会结束。脚本的第一个部分调用 runlevel 工具,它会让系统显示自己在运行级2 (当然,实际上已经没有运行级这个玩意儿了)并给两个变量赋值。接下来的工作由 exec 命令完成,它会使用参数 2 运行 /etc/init.d/rc 脚本。这个脚本使用相应的参数调用 /etc/rc?.d 目录中的那些链接。这里 rc2 任务会运行 /etc/rc2.d 下的符号链接对应的 init 脚本。

    $ cat /etc/event.d/rc2 # rc2 - runlevel 2 compatibility## This task runs the old sysv-rc runlevel 2 (”multi-user”) scripts. It# is usually started by the telinit compatibility wrapper.start on runlevel 2 stop on runlevel [!2] console outputscript set $(runlevel –set 2 || true) if [ “$1″ != “unknown” ]; then   PREVLEVEL=$1    RUNLEVEL=$2   export PREVLEVEL RUNLEVEL fi exec /etc/init.d/rc 2end script

    tty 服务

    如下是一个在 tty1 上启动并监视 getty 进程的服务的工作定义文件:

    $ cat /etc/event.d/tty1 # tty1 – getty## This service maintains a getty on tty1 from the point when# the system is started until it is shut down again. start on runlevel 2start on runlevel 3start on runlevel 4start on runlevel 5 stop on runlevel 0stop on runlevel 1stop on runlevel 6 respawnexec /sbin/getty 38400 tty1

    这个服务由 runlevel 2 到 5 (多用户模式)来触发,启动 getty 进程,并在系统关闭、重启或进入单用户模式,即运行级 0,1 和 6 时触发来关闭该服务。respawn关键字告诉 init 在服务终止后重启服务,而 exec 命令是让 getty 进程以 38400 波特率运行在 tty1。如下,initctl 工具显示该服务处于启动状态,进程ID 4747,ps 命令显示该服务的进程:

    $ sudo initctl list tty1 tty1 (start) running, process 4747$ ps -ef | grep 4747 root   4747   1 0 Jul02 tty1   00:00:00 /sbin/getty 38400 tty1

rc-default 任务和 inittab

    在 SysVinit 中,/etc/inittab 文件通过 initdefault 项告诉 init 在系统启动的时候进入哪个运行级,而 Ubuntu 没有 inittab 文件,缺省的,Upstart init daemon (使用 rc-default 任务)引导系统进入多用户模式(缺省运行级为2)。如果希望系统启动进入其他运行级别,那么就创建一个 inittab 文件。如下会让系统缺省进入单用户模式 (runlevel S):

    $ cat /etc/inittab :id:S:initdefault:

    当系统进入到单用户(修复)模式,如果系统的root帐号没有被锁定,init 会在显示 root 提示符之前要求输入 root 密码。否则,它会不要求输入密码而直接显示 root 提示符。

    注意:不要将系统设置启动到运行级别 0 或 6,这样系统将永远无法正常启动。要直接进入多用户模式(运行级 2),如果有 inittab 删除这个文件,或者用上述的例子,将里面的 S 替换成 2.

    Upstart的未来

    从 SysVinit 到 Upstart 的迁移涉及到了 Linux 系统的很多部分。要让这个转换尽量平滑并且引入尽量少的问题,Upstart 团队决定通过多个 release 来完成这个迁移。

    Ubuntu 从 Feisty 开始使用 Upstart init daemon。在 Feisty 和 Gutsy+2 之间,Ubuntu 将完成 SysVinit 到更加干净、更加灵活的 Upstart 的迁移。随着越来越多的服务被放到 Upstart 的控制之下,/etc/event.d 目录下的内容将会替代 /etc/init.d 和 /etc/rc?.d 目录下的内容。运行级将不再作为 Ubuntu 正式支持的特征,虽然它们可能为了保持与第三方软件的兼容性而继续保留。最终 Upstart 将会替换掉 crond。

    文章出处:linux/Linuxjs/200863/120876_2.html”>http://www.diybl.com/course/6_system/linux/Linuxjs/200863/120876_2.html

Add comment 四月 28th, 2010

Babylinux制作

作者:GuCuiwen email:win2linux@163.com

版权声明:
本文档可以在网络上在非商业范围内自由转载,转载请注明出处
如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费
以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费

一,什么是BabyLinux
二,为什么要做这样一个linux
三,什么人适合读这篇文档
四,应该具备的知识
五,linux系统引导过程简介
六,编译内核
七,编译busybox
八,制作根文件系统
九,制作ramdisk映象文件
十,内核与busybox的整合
十一,安装测试和内容调整
十二,babylinux中的BUG
十三,接下来要做的事情
十四,参考文献

一,什么是BabyLinux

BabyLinux不是一个完整的发行版,他是利用原有的一套完整的linux系统的内核原代码和编译工具,利用busybox内建的强大功能,在一张软盘上做的一个很小的linux系统.他具备一个linux系统的基本特征,支持linux系统最常用的一百多个命令,支持多种文件系统,支持网络等等,你可以把他当做一张linux起动盘和修复盘来用,你也可以把他当做一个静态路由的路由器软件,当然,你也可以把他当做一个linux玩具,向你的朋友炫耀 linux可以做的多么小.我把他叫做BabyLinux因为他很小巧,小的很可爱,像一个刚刚出生的小baby.

二,为什么要作这样一个linux

先说说我一开始的想法,当我一开始接触linux的时候,看到书上说,linux通常安装只需要60M左右的空间,但是我发现装在我硬盘上的Redhat 6.0确要占据好几百M的空间.为什么我的linux这么大呢? 后来我发现,装在我机器上的那么多东西只有不到30%是我平时常用的,还有30%是我极少用到的,另外的40%基本上是不用的.于是,我和大多数初学者一样,开始抱怨,为什么linux不能做的精简一点呢?于是,我萌发了自己裁减系统的想法.可惜那个时候我还没有听说过有LFS和Debain.等到我积累了足够的linux知识后,我开始制作这样一个小系统.
制作这样一个小系统最大的意义在于,你可以通过制作系统了解linux的启动过程,学会ramdisk的使用,让你在短时间内学到更多的linux知识. 当然,你会得到很大的乐趣.这个项目只是做一个具有基本特征的linux系统,如果你想自己做一个具有完整功能的linux,请阅读Linux From Scratch (LFS)文档.

三,什么人适合读这篇文档

如果你是一个linux爱好者,并且很想了解linux的启动过程和系统的基本结构,而且是一个喜欢动手研究小玩意的人,那么这个文档可以满足你的需求. 如果你仅仅是用linux来做一些普通的日常工作,而不在乎你的linux到底怎么工作,那么这份文档也许不太适合你.另外,如果你是linux爱好者, 但是目前还是一个刚刚入门的newbi,我建议你先把linux命令学好.不过我想我会尽可能的把这份文档写详细一些,如果你有足够的毅力,或许一个 newbi也能成功做一个babylinux.或者,你遇到一件很不巧的事情,比如你的老婆来例假了,你的这个周末就泡汤了,那么阅读这篇文档并做一个 linux小玩具可以打发你的时间.

四,应该具备的知识

在做一个babylinux之前,你应当已经会应用linux最常用的命令.并且至少有一次成功编译并安装系统内核的经历,会通过编译源代码来安装软件. 如果你具备了这些条件,那么做这样一个小系统会很顺利,如果你还没有掌握这些知识,你可能会遇到一些困难.但是只要有毅力,也可以成功.你不需要具备编程的知识,因为我的目标是:让具有中等以上linux水平的爱好者可以通过阅读文档轻松完成这个项目.关于一张软盘上的linux还有一个很著名的 linux叫LOAP (Linux On A
Floppy) 但是他是由比较专业的人员需要编写很多程序完成的.而且没有关于他制作过程的文档.

五,linux系统引导过程简介

首先,主板的BIOS会读取硬盘的主引导记录(MBR),MBR中存放的是一段很小的程序,他的功能是从硬盘读取操作系统核心文件并运行,因为这个小程序太小了,因此通常这个小程序不具备直接引导系统内核的能力,他先去引导另一个稍微大一点的小程序,再由这个大一点的小程序去引导系统内核.在linux系统中这样的小程序有LILO和GRUB.在这个项目中,我决定用LILO来做系统引导程序.在软盘上启动linux系统的过程和在硬盘上启动的过程相似.

Linux系统内核被引导程序装入内核并运行后,linux内核会检测系统中的各种硬件.并做好各种硬件的初始化工作,使他们在系统正式运行后能正常工作.之后内核做的最后一个工作是运行
/sbin下的init程序,init是英文单词initialization(初始化)的简称,init程序的工作是读取/etc/inittab文件中描述的指令,对系统的各种软硬件环境做最初化设定.最后运行mingetty等待用户输入用户名登录系统.所有的工作就这么简单,虽然linux启动的时候有很多内容,看上去十分高深,但是都不过是对这个过程的扩充.明白了这个道理,你可以写一些脚本程序让他在系统启动的特定时间运行完成任务.事实上系统内核并不关心/sbin下的init是不是真的init,只要是放在/sbin下名叫init的可执行程序他都可以执行.可以做以下实验:

编写一个非常简单的C程序:

main()
{
printf(“hello,world!\n”);
}

保存后以init.c保存他,并用gcc编译.
#gcc –-static -o init init.c
这里的–static 参数告诉gcc把这个程序静态联接,这样这个程序不倚赖任何库就能运行.把编译好的init程序拷贝到/sbin下,备份好原来的那个.重新启动系统最后系统的输出结果是: hello,world!
然后停在那里.做这个实验以前先确定你知道如何把系统恢复到原来的状态,有一个简单的方法,在内核启动前给他加上init=参数,比如你原先的init被你改成了init.bak 只要在启动的时候给内核加上init=/sbin/init.bak就可以用原来的init程序启动系统.
做完以上实验,就明白了内核和init程序之间的关系.此外,init程序不一定是一个二进制可执行程序,他可以是一个bash脚本,一个指向另一个程序的联接,他的位置也并不一定要在/sbin下,只要在启动内核时,给内核加上init参数就能被运行,比如,开始时给内核加上init=/bin /bash参数,内核在最后一步就直接运行bash给出提示符,不用登录系统就可以输入命令了.其功能类似单用户模式启动系统. /sbin/init 程序只是内核默认运行的第一个程序.

六,编译一个linux系统内核

1,编译前的规划和准备

在编译内核前,请先确定你的需求,把你的需求罗列成一张详细的表格.你需要让内核支持什么硬件,支持多少种分区类型和文件系统,支持哪些网卡,支持哪些网络协议.等等.请尽可能详细的罗列这些内容,但是你也不要太贪心,因为你所有能利用的空间只有1440K,如果你编译出一个大于1440K或很接近这个数字的内核,你的这个项目就不能完成了,你已经没有空间再放ramdisk映象文件,除非你原意再多出一张软盘,做一个两张软盘的小linux系统.对于声卡驱动之类,我劝你还是放弃吧,因为一个声卡驱动也许只让你的内核增大了十多K,但是你有了一个声卡驱动就务必要有一个播放器吧,否则声卡驱动就没有意义,可一个播放器的大小可不是一张软盘可以装得下的.在我先前制作的babylinux内核有900多K,其中,文件系统部分站了大部分,因为我的目标是把他做成一个系统修复盘.因此我在内核中编译7种文件系统的支持,每减少一个文件系统就可以减小几十甚至200多K的内核大小.越是复杂,越是安全的文件系统,其支持模块也越大,比如在linux下FAT模块只有32K,VFAT只有17K,但是ext3的模块就有86K,JFS达到 216K,reiserfs模块是224K,可以想像,编译一个支持7个文件系统的900多K的内核,文件系统部分就占了600K以上的空间,所以如果某一个文件系统是你根本不用的,那么还是不要编译进内核把,这样至少可以省下100多K的空间.对于其他的驱动,比如网卡,通常大小只有8,9K,最大的也不过10多K,因此可以把常用的网卡芯片的驱动都编译进去.另外如果你想让你的babylinux支持U盘,那么scsi的驱动模块也是不可小看的,他通常要接近150K,因为U盘是被当做scsi设备来驱动的.另外你还需要让你的内核支持即插即用,这些都是不小的空间开销,我的建议是你放弃一两个你不用的文件系统.总之,你最后编译出来的内核大小最好不要超过900K,否则你在busybox里只能编译进去很少的命令.

在我编译的busybox中,我编译进去120多个命令,基本上把busybox支持的命令都包括进去了.加上小系统所必需的文件系统目录,/dev下的设备文件,以及/etc下几个必需的配置文件,做成ramdisk压缩后的大小是440多K, 加上900K左右的内核刚好可以放入一张1440K软盘,请注意,你应该留下至少50K的空间,因为我们要在软盘上创建一个ext2文件系统,而文件系统本生需要占据大概25K的磁盘空间.另外lilo的引导文件boot.b的大小是5.7K,还有装上lilo后自动产生的map文件也要10多K的空间,map文件的具体大小由内核安装的实际大小决定,通常不会超过30K.
综上所述,请遵循下面的公式:

内核大小+文件系统压缩印象文件+50K <= 1440K

另外一点需要说明的是:以上所罗列的文件系统模块大小是察看我现在使用的Redhat 9 的
/lib/modules下的模块文件得到的,实际编译进内核大小会小一点,因为我们用make bzImage
在内核源代码目录树下生成的内核是经过压缩过的.

如果你对以上说的内容不太明白也没有关系,我会在下面的内容中做详细的说明.

2,必需编译进内核的内容

首先,我们制作的这个小系统是基于一张软盘的,因此,你的内核必需支持软盘.另外对IDE硬盘和cdrom的支持也是不可少的,否则做出来的 babylinux就没有实用价值,因为他不能访问硬盘和光盘上的内容这样的linux虽然可以做的更小,但是制造一个完全没有用的东西是浪费时间.其他的包括framebuffer等,如果你需要支持在字符界面下以高分辨率显示,以看到更多的屏幕内容,那么就必需把framebuffer支持编译进内核,此外在高分辨率下使用的8×8字体也必需编译进去.否则即使你给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体.这里我先大致提一下需要注意的事情.在下一小节具体编译时,我会继续就某些细节问题说明.

3,关于内核的版本

我是在Redhat 9 linux系统下打造的babylinux小系统.使用的是Redhat 9 自带的2.4.20版的内核.
为什么我不用最新的2.6的内核?
一开始我也企图用最新的内核,但是通过试验我发现,在用最新的2.6.9内核的情况下,我编译一个all-no的(即所有内容都选N,不支持任何硬件,只有一个最基本的内核)最小化内核就要460K左右,如果我在这个基础上再加入几种文件系统和必要的驱动,那么内核的大小就不能装下一张1440K
的软盘,而我用2.4.20的内核编译一个最小化的内核只需要217K,的大小.如果优化了gcc参数他还能再小些.这样我就立即省下了200多K的空间,在平时,200多K的内容微不足道,但是在babylinux里,这个数目是整个空间的 1/7,相当于一个reiserfs文件系统模块的大小.当然,我也尝试了2.2以及更老的内核,但是他们缺少我需要的东西,因此最后权衡下来用2.4的内核是比较合理的.如果你用的是2.6内核的FC系统,那么最好还是去下载一个2.4版的内核,www.kernel.org 有各个时期的内核可以下载.

4, 内核的配置

如果你对linux内核的配置和编译已经很熟悉了,请跳过这一段,直接看busybox的编译.

以root身份登录系统
进入/usr/src/linux目录
[root@gucuiwen root]# cd /usr/src/linux
如果你下载了一个2.4版本的内核,为了避免麻烦,请将他拷贝到/usr/src下,然后接压缩,再做一个指向他的名为linux的链接.虽然这并不是必需的,但是根据我以往的经验,如果我把linux源代码放在其他目录下解开并编译,偶然会有一些莫名其妙的小问题发生.

#cp linux-2.4.20.bz2 /usr/src/
#cd /usr/src
#tar xfvj linux-2.4.20.bz2
如果是tar.gz格式,可以这样解开
#tar xfvz linux-2.4.20.tar.gz
为了方便,做一个到目录linux-2.4.20的连接:
#ln -s linux-2.4.20 linux
进入linux源代码目录:
#cd linux
清理源代码树:
#make mrproper
运行配置程序:
#make xconfig

code maturity level options
先选择N,当我们配置好常规的东西,要加入framebuffer支持时再将这一项选择Y,因为在2.4.20中,framebuffer支持尚属于实验性代码.如果不在code maturity level options选择为Y,将不能配置framebuffer.

Loadable module support
选择N,为了简化系统的制作,我在这个项目中不选择可加载内核模块的支持.

processor type and features

processor family 中选择你需要的CPU类型,如果你想让老至386,新到P4的CPU都能运行babaylinux那么请选择386CPU,否则请按自己的实际情况选择.

其他选项都选择N.这些在babylinux中都是不需要的.

General setup
networking support 选择Y
PCI support 选择Y 除非你不用PCI设备,不过一般人都是需要的,因为现在网卡大部分是PCI的.

System V ipc 选择Y
systrl support选择Y
kernel support for ELF 选择Y
其余内容都可以选择N,如果有特殊需求,比如的网卡是ISA的,那么请将相应的内容选上.但是不能贪心,时刻牢记,我们能利用的空间只有 1440K ,内核的大小绝不能超过 900K,任何不必要的东西都应该从内核中去除.

memory technology devices (MTD)
Parallel port support
Plug and Play configuration
以上三个大项中的所有内容选择N

block devices

Normal floppy disk support
Loopback device support
RAM disk support
initial RAM disk (initrd) support
Per partition statics in /proc/partitions

以上几项选择Y,其余全部选择N.

这里的选项比较重要,我想重点说明一下.对于软盘的支持,那是不必说的,那是必备的.
loopback device 即回环设备,我们平时用命令

#mount -o loop somecd.ISO /mnt/cdrom

挂装光盘映象文件,或者其他文件系统映象文件时就用到了内核中的loopback 模块,如果没有编译进这个模块,你将不能用上面的命令挂装光盘映象和文件系统映象.
个人认为这个功能是非常重要的,所以编译了进去.

RAM disk support 即内存磁盘(比较贴切的说法是虚拟磁盘,即拨出一部分内存当做磁盘用).这是制作babylinux项目中的核心内容,由于一张软盘的空间有限,babylinux的根文件系统是用gzip压缩法高度压缩的,在运行时,将解压缩后的文件拷贝到一个RAM disk运行,所以在运行时,你在根文件系统上的所有操作实际上是在内存上进行的.但是在形式上和在真正的磁盘上运行一样.只不过放在RAM disk上的所有内容会在系统关机后全部消失.
不仅在运行babylinux时用到ramdisk,我们在制作压缩的根文件系统时也要用到ramdisk,学习ramdisk的使用是做一个babylinux的重要目的之一. 在linux中,还支持另外一种虚拟磁盘,叫做shm,
(shared memory),这种虚拟磁盘机制比ramdisk更加先进,ramdisk的大小是固定的,由编译内核时候的default ram disk size 决定.默认为4096K(4M),也可以在内核装载前加上ramdisk_size=参数来决定他的大小,但是系统一旦启动,ramdisk的大小是不能改变的,而shm的大小却动态的改变.默认情况下为物理内存的一半,当系统需要更多内存的时,他就自动缩小.系统内存富余时,他自动增大,这样可以充分灵活的利用内存空间,shm通常用来作为系统的磁盘高速缓存,存放系统运行中的临时文件等.redaht 的linux在默认情况下都有shm的支持,可以用mount和df察看他的挂装点和大小,如下命令:

[root@gucuiwen linux]# mount
/dev/hda1 on / type ext3 (rw)
none on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda6 on /home type ext3 (rw)
/dev/hda5 on /oracle type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/hda7 on /var type ext3 (rw)

[root@gucuiwen linux]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/hda1 2.9G 2.7G 26M 100% /
/dev/hda6 3.8G 1.8G 1.8G 50% /home
/dev/hda5 5.7G 677M 4.8G 13% /oracle
none 125M 0 125M 0% /dev/shm
/dev/hda7 711M 91M 584M 14% /var

虽然shm有这么多的优点,我还是选择了ramdisk,因为ramdisk可以很方便地在系统启动的时候加载,而shm却没那么容易,下面就来讲一下关于内核启动时加载ramdisk映象的相关内容.

initial RAM disk (initrd) support
即初始化ramdisk支持,这个选项让内核有能力在内核加载阶段就能装入RAMDISK,并运行其中的内容,否则只能在系统运行阶段用ramdisk ,我们平时在编译了一个新内核后,如果你的根文件系统用的是ext3,而你没有把ext3编译进内核,而只作为一个模块编译了,那么就需要用 mkinitrd命令做一个initrd (initializtion ramdisk),这个ramdisk里放了ext3的模块,这样内核在加载根文件系统前就能正确识别ext3文件系统.否则,内核加载的最后一步就会出现kernel panic cant not find init …. 的错误.

在babylinux项目中,这个选项是必需的,这里的作用是把解压的根文件系统映象装入ramdisk.

Per partition statics in /proc/partitions
这个选项不是必需的,但是我发现如果我不把这个功能编译进内核,那么当我在挂装文件系统的时候会有些小问题,比如我不能以简写的挂装命令来挂装文件系统. 我不确定到底是不是这个选项的关系,但是把这个选项编译进内核只增大一点点内核空间,所以为了避免麻烦,我把他编译了进去.

Multi-device support (RAID and LVM)
Cryptography support (CryptoAPI)
这两个大项全部选择N,因为在个人用PC上,及少牵涉到这两项,如果你真的有RAID设备或者LVM,那么就自己摸索着配置一下吧.

Networking options

这一大项中,只需要把下列项目编译进内核:
Packet socket :mmapped IO
TCP/IP networking

对于IP:advanced router这项,如果你想重点把babylinux用做静态路由软件,那么把这项编译进去,而对于network packet filtering (replaces ipchains)这一项,没有必要编译进去了,因为busybox没有提供iptables工具来设置包过滤防火墙.同样,unix domain sockets这项也不必选择,只有运行X的情况下才需要选这项.

Telephony Support 选择N

ATA/IDE/MFM/RLL support
选择Y,然后下面的’IDE,ATA and ATAPI Block Devices’按钮就被激活

下面几项请选择Y,其余都可以是N.
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
Include IDE/ATA-2 DISK support
Auto-Geometry Resizing support
Include IDE/ATA CDROM support

如果你的内核要运行在一台很老的pentium或486上,请把CMD640 chipset bugfix/support编译进去,因为那时候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把这项编译进去会修复这个bug.

下面几个大项:
SCSI support
Fusion MPT device support
IEEE 1394(FireWire) support
I2O device support
全部选择N,这里可能有你想要的好东西,比如1394接口驱动,但是在babylinux上意义不大,而且我们的空间只有1440K.

下面一个大项:
Network device support
选择Y,这样就可以支持网卡了,其余都选择N.然后点Ethernet(10 or 100 Mbit)按钮选择你需要的网卡驱动,你可以把最常见的几种Reltek8139,NE2000,3COM等网卡编译进内核.虽然网卡的驱动通常都很小, 但是不要太贪心,选2~3个就足够了,否则你的内核就会一下子多出几十K.在我先前编译的babylinux内核中,我把via-rhine网卡编译了进去,是因为我打造babylinux的机器上只有一块那个芯片的网卡.

如果你发现你需要的网卡是灰色的,不能点,那么先确定他上一级的选项已经点了,比如你想选NE2000的网卡,就必需先选择ELSA,VLB,PCI and on board controllers.如果还不能点,那么请确定是否已经把PCI的支持选项选上了,(在Geneal setup)里.没有PCI的支持,PCI的网卡将不能选.

可能你是个有钱人,在自己的PC上用千兆网卡,那么请在千兆网卡那一栏选择.

接下来几个大项:
Amateur Radio support
IrDA (infrared) support
ISDN subsystem
Old CD-ROM drivers (not SCSI,not IDE)
Input core support
全部选择N.

接下来的Charcter devices是很重要的一项,他和Bloack devices一样重要,我将重点讲述.
除了Virtual terminal和Support for console on terminal两项,其他全选N.

Virtual terminal 即虚拟终端,这是一般linux必备选项.否则你的linux启动后,在屏幕看不到任何东西.另外还负责键盘输入信息等等.只有在某些嵌入式linux应用场合才会不要这个选项,因为这些linux通常都不用操作.

Support for console on terminal
在虚拟终端上的控制台.他支持在终端上各种信息的输出,这也是必备的.

接下来的几个大项:
Multimedia devices
Crypto Hardware support
全部选择N.

再接下来的那部分File sytems可是重头戏喔.
这部分不用我太罗嗦了吧,自己需要支持什么就选什么.
但是其中有三个是你必需选的:
/proc file system support 缺了他,很多命令和软件就不能运行.
Second extended fs support BabyLinux的基本文件系统.
ISO 9660 CDROM filesytem support 除非你不想用光盘.
另外,诸如磁盘限额(Quota support),Reiserfs的DEBUG模式(Enable reiserfs debug mode)
等就不用编译进去了.这些东西意义不大,确要无端的增大内核大小.请牢记一点:编译出来的内核大小不要超过900K.

Tip:是不是看的很累啊,我写得更累,别急,内核配置部分马上要好了.

最后一个Console drivers
这是支持linux在字符模式下高分辨率显示的内核模块.前面三个全部选择Y,
Frame-buffer support按钮是灰色的不能选,别急,回到第一个大选项:
Code maturity level options 选择Y,就可以激活这个按钮了.

下面几个选项需要选择Y:
Support for framebuffer devices
VESA VGA graphics console
你也可以选择其他的显卡驱动,比如nVidia的,但是VESA和VGA是通用性最好的,只要不是几十年前的黑白显卡(我只听说过,没见过),都兼容VESA和VGA,因此,为了制作好的BabyLinux的通用性,请选择这个驱动.

Support only 8 pixels wide fonts
这个一定要选,否当你给内核传递vga=788参数,让linux在字符界面下高分辨率显示的时候,系统会因为找不到合适的小字体而返回到低分辨率模式.

好了!所有内核的配置工作到这里就全部完成了,剩下的几个大项全部选N就行了.
保存后退出,配置程序会自动生成一个隐藏的配置文件.config

下面是我配置好的.config文件内容.如果你懒的自己去配置,那么直接把这个.config拷贝到你的源代码目录下就能直接用了.(已经去掉了#开头的注释行)
CONFIG_X86=y
CONFIG_UID16=y
CONFIG_EXPERIMENTAL=y
CONFIG_M586=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_X86_USE_STRING_486=y
CONFIG_X86_ALIGNMENT_16=y
CONFIG_X86_PPRO_FENCE=y
CONFIG_NOHIGHMEM=y
CONFIG_NET=y
CONFIG_PCI=y
CONFIG_PCI_GODIRECT=y
CONFIG_PCI_DIRECT=y
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_BLK_DEV_FD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
CONFIG_PACKET=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDE_MODES=y
CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_REISERFS_FS=y
CONFIG_EXT3_FS=y
CONFIG_JBD=y
CONFIG_FAT_FS=y
CONFIG_VFAT_FS=y
CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JFS_FS=y
CONFIG_NTFS_FS=y
CONFIG_PROC_FS=y
CONFIG_EXT2_FS=y
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT=”iso8859-1″
CONFIG_VGA_CONSOLE=y
CONFIG_VIDEO_SELECT=y
CONFIG_VIDEO_IGNORE_BAD_MODE=y
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FB_VESA=y
CONFIG_VIDEO_SELECT=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
CONFIG_FBCON_CFB24=y
CONFIG_FBCON_CFB32=y
CONFIG_FBCON_FONTWIDTH8_ONLY=y
CONFIG_FONT_8×8=y
CONFIG_FONT_8×16=y

5,编译内核
#make dep
#make bzImage

下面是最后编译结果:
Boot sector 512 bytes.
Setup is 4733 bytes.
System is 845 kB
make[1]: Leaving directory `/usr/src/linux-2.4.20-8/arch/i386/boot’

我用上面的配置得到了一个845k的内核.
编译好的内核放在/usr/src/linux-2.4.20-8/arch/i386/boot下.将他拷贝在一个安全的地方备用.

建立一个专放babylinux材料的目录
#mkdir /babylinux
建立一个做babylinux根文件系统的目录
#mkdir /babylinux/rootfs
备份内核
#cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /babylinux/

七,编译busybox

1,busybox简介

busybox是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小.我们平时用的那些linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接.
Busybox的小身材大作用的特性,给制作一张软盘的linux带来了及大方便.

2,busybox的用法

可以这样用busybox
#busybox ls
他的功能就相当运行ls命令
最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能.
#ln -s busybox ls
#ln -s busybox rm
#ln -s busybox mkdir

然后分别运行这三个链接:
#./ls
#./rm
#./mkdir

就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个可执行程序busybox
但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇.
很多linux网站都提供busybox的源代码下载.目前版本是busybox1.0正式版.

3,配置busybox

busybox的配置程序和linux内核菜单配置方式简直一模一样.熟悉用make menuconfig方式配置linux内核的朋友很容易上手.

#cp busybox-1.00.tar.gz /babylinux
#cd /babylinux
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig

下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是同样不要太贪心.
General Configuration应该选的选项
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf

Build Options
Build BusyBox as a static binary (no shared libs)
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库.否则必需要其他库文件才能运行,在单一个linux内核不能使他正常工作.

Installation Options
Don’t use /usr
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令.选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接.

其他选项都是一些linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了.

配置好后退出并保存.

4,编译并安装busybox

#make
#make install

编译好后在busybox目录下生成子目录_install,里面的内容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
lrwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接.
我编译出来的busybox可执行文件是935K,加上符号链接,整个_install目录是952K.加上845K的内核不是已经超过1440K了吗?别担心,我们将对整个根文件系统做大幅度的压缩.

八,制作根文件系统

1,基本目录结构

#cd /babylinux/rootfs
#mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了.
其他的可以象征性的建几个就可以了.

拷贝busybox
#cp -R /babylinux/busybox-1.00/_install/* /babylinux/rootfs/

2,建立设备文件名

#cd /babylinux/rootfs/dev
你可以用mknod手工建立,也可以直接从原系统的/dev目录下拷贝过来.

手工建立的方法:
#ls -l /dev/console
crw——- 1 root root 5, 1 11月 30 09:02 /dev/console
这样就查看到了console设备的主设备号是5,辅设备号是1,是一个标记为C的字符设备.
于是,我们可以用mknod建立一个同样的设备文件:

#mknod console c 5 1

但是手工方法建立太麻烦了,通常直接从/dev下把需要的设备文件拷贝过来.
这些设备文件是特殊文件,在拷贝时一定要加上-R参数才能拷贝.

#cp -R /dev/console ./
#cp -R /dev/null ./
#cp -R /dev/zero ./

以下是我认为需要的设备名:
cdrom fd0 hda14 hda4 hdb11 hdb19 hdc hdc16 hdc6 hdd13 hdd3 loop2 ram2
console fd0H1440 hda15 hda5 hdb12 hdb2 hdc1 hdc17 hdc7 hdd14 hdd4 loop3 tty0
fb hda hda16 hda6 hdb13 hdb3 hdc10 hdc18 hdc8 hdd15 hdd5 loop4 tty1
fb0 hda1 hda17 hda7 hdb14 hdb4 hdc11 hdc19 hdd hdd16 hdd6 loop5 tty2
fb1 hda10 hda18 hda8 hdb15 hdb5 hdc12 hdc2 hdd1 hdd17 hdd7 null tty3
fb2 hda11 hda19 hdb hdb16 hdb6 hdc13 hdc3 hdd10 hdd18 hdd8 ram tty4
fb3 hda12 hda2 hdb1 hdb17 hdb7 hdc14 hdc4 hdd11 hdd19 initctl ram0 tty5
fb4 hda13 hda3 hdb10 hdb18 hdb8 hdc15 hdc5 hdd12 hdd2 loop1 ram1 zero

其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb等是必备的.
其它的hda,hda1,hdb等可以根据实际需要决定.但是上表中的选择是比较合理的,即能满足大部分的需要,有没有不用的设备浪费空间.注意,千万不要把/dev下的设备全拷贝过来,那将产生大约420K的/dev目录,这对babylinux来说太大了.

3,建立etc目录下的配置文件

busybox.conf group inittab motd passwd resolv.conf shadow-
fstab init.d issue mtab profile shadow

其中init.d是一个目录,从busybox-1.00源代码目录下拷贝过来.

#cp -R /babylinux/busybox-1.00/examples/bootflopyp/etc/init.d /babylinux/rootfs/etc/

busybox.conf是一个空文件.
其他文件的内容如下:

fstab
/dev/fd0 / ext2 defaults 0 0
none /proc proc defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
group
root:x:0:root
inittab
::sysinit:/etc/init.d/rcS

::askfirst:/bin/sh
tty2::respawn:/bin/getty 38400 tty2
tty3::respawn:/bin/getty 38400 tty3
tty4::respawn:/bin/getty 38400 tty4

# Stuff to do when restarting the init process
::restart:/bin/init

# Stuff to do before rebooting
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/bin/swapoff -a

issue
Baby Linux release 0.1

motd

mtab

passwd
root::0:0:root:/root:/bin/ash
profile
# /etc/profile: system-wide .profile file for the Bourne shells

echo
echo
export PS1=”[\u@\h \w]\$”
echo “Done”
alias ll=’ls -l’
alias du=’du -h’
alias df=’df -h’
alias rm=’rm -i’
echo

resolv.conf
nameserver 202.96.209.5
nameserver 202.96.209.6
shadow
root:$1$$adltAB9Sr/MSKqylIvSJT/:12705:0:99999:7:::
shadow-
root:$1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:99999:7:::
其中有很多是从原系统的/etc下拷贝过来修改的,如果你是一个具有中等以上水平的linux爱好者,那么应该一看就明白了,当然,你也可以根据自己的需要修改这些文件.其中最重要的是fstab和inittab,busybox内建的init程序用到的inittab文件的语法和一般的不一样,不能直接把原系统/etc下inittab文件拷贝过来.可以把busybox-1.00目录下的示例文件拷贝过来修改用.具体请看busybox的文档.busybox的init也可以不用inittab.但是在我制作babylinux过程中有一个非常奇怪的bug.所有/sbin下的 busybox链接在做成压缩的根文件系统,解压后都不能正常运行,显示找不到该命令.只有当我在/bin下做这些链接时才能运行.具体原因还不太清除, 所以你需要做下面的工作:

#cd /babylinux/rootfs/sbin
#ls
chroot getty ifconfig losetup pivot_root reboot swapoff sysctl
fdisk halt init mkswap poweroff route swapon telnetd
查看到sbin下有上述链接

转到bin下
#cd /babylinux/rootfs/bin
重新做这些链接:
#ln -s busybox chroot
#ln -s busybox getty
#ln -s busybox ifconfig

然后把sbin下的链接删除,以节省空间
#rm -rf /babylinux/rootfs/sbin/*

再把原先inittab中所有的sbin改成bin

init.d下的文件:
rcS
请确保这个文件是可执行的,否则请改成可执行的:
#chmod u+x rcS

rcS的内容:
#! /bin/sh
mount -o remount,rw /

/bin/mount -a
>/etc/mtab
echo
echo
echo
echo
echo -en “\t\tWelcom to \33[0;32mBabyLinux\33[0;39m\n"
echo -en "\33[0;36m\n"
echo
echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\t\t\n"
echo -en "+ This is a tiny linux system based on a floppy.It contains \t\t\n"
echo -en "+ more than 100 basic Linux commands and tools.The kernel of \t\t\n"
echo -en "+ this tiny system support all kinds of normal filesystems. \t\t\n"
echo -en "+ linux ext2,ext3,jfs,reiserfs and windows fat,vfat,ntfs[readonly]\t\t\n”
echo -en “+ is supported! So it is a powerful small system you can use it \t\t\n”
echo -en “+ as a linux and windows rescue disk.Beside this,the kernel also\t\t\n”
echo -en “+ contains the drivers of Reltek8139,NE2000,via-rhine ethernet\t\t\n”
echo -en “+ adpater. you can configure the IPaddress and netmask with tools\t\t\n”
echo -en “+ ‘ifconfig’ and config the default gateway with command ‘route’. \t\t\n”
echo -en “+ Is there anything else? Haha,this is a telnet server build-in\t\t\n”
echo -en “+ you can type ‘telnetd’ to startd it and thus your friends can\t\t\n”
echo -en “+ logon to your system to help you solve the problem.\t\t\n”
echo -en “+ \33[0;32mAll these great features are powered by BusyBox 1.0\33[0;36m\t\t\n"
echo -en "+ This is a free system tool developed by GuCuiwen.\t\t\n"
echo -en "+ RUN YOUR OWN RISK of using it ! if you have any problem please\t\t\n"
echo -en "+ mailto : win2linux@163.com Enjoy!!\t\t\n"
echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\t\t\n"
echo -en "\33[0;39m\n"
hostname BabyLinux
可以自己作相应的修改.
以上是babylinux根文件系统的所有内容,他的总大小应该在1M左右.
[root@gucuiwen baby]# du -hs
1.1M .

九,制作ramdisk映象文件

babylinux根文件系统所有东西都放在/babylinux/rootfs下,我们将利用ramdisk把这些内容做成ramdisk映象文件并压缩他.

以下主要是ramdisk的用法,看完以下内容,你应当学会ramdisk的使用.

[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1
dd: 正在写入 ‘/dev/ram1’: 设备上没有空间
读入了 8193+0 个块
输出了 8192+0 个块

zero是一个特殊的设备,表示全部为0的字符块.上面这条命令的意思是把系统的第一个ramdisk用全部为0的数据填充,因为ramdisk默认大小为4M,因此当读满8192个块(每块512字节)后,显示’设备上没空间’.这很正常,/dev/ram1已经被填充满了.
如果指定块的大小:

[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1 bs=1M count=4
读入了 4+0 个块
输出了 4+0 个块

不会有错误提示,这里演示了dd的一般用法,接下来还要频繁用到dd命令.

在/dev下有很多ramdisk设备,ram1,ram2,ram3….
一般用第一个就可以了.

填充后,ram1就有可空间,可以在这个空间上创见一个文件系统:
[root@gucuiwen babylinux]# mkfs.ext2 -m0 /dev/ram1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

将ram1挂装到文件系统中:
先建立一个挂装点:
#mkdir /mnt/ram
挂上ram1:
#mount /dev/ram1 /mnt/ram
将先前做好的babylinux根文件系统拷贝到ram1上.
#cp -R /babylinux/rootfs/* /mnt/ram

做完以上几步,你应就白了ramdisk设备的含义,他是和hda1,hdb1,一样的块设备,用mount挂到文件系统下后就可以访问,往里放东西,但是所有的东西在内存上.关机将丢失所有东西.

拷贝好babylinux根文件系统后卸载ram1:
#umount /dev/ram1
这时,虽然不能通过/mnt/ram这个挂装点访问ram1中的内容了,但是他却切切实实得在内存中存在.

再用dd把这个ram1以映象方式取出来:

[root@gucuiwen babylinux]# dd if=/dev/ram1 of=/babylinux/ramdisk.img
读入了 8192+0 个块
输出了 8192+0 个块

验证一下取出来的内容:
[root@gucuiwen babylinux]# file ramdisk.img
ramdisk.img: Linux rev 1.0 ext2 filesystem data

他是一个ext2 文件系统,类似一个ISO光盘映象文件.
因次,我们可以用loop设备来把他重新挂装到文件系统里:

[root@gucuiwen babylinux]# mount -o loop ramdisk.img /mnt/ram/

为了方便,我仍旧把他挂在/mnt/ram下,因此,在先前一定要把/dev/ram1 umount掉

查看/mnt/ram下的内容,他应该和/babylinux/rootfs下的一模一样,否则就是出错了:
[root@gucuiwen babylinux]# ls /mnt/ram
bin dev etc home lost+found mnt proc root sbin tmp usr var

这样,我们就得到了一个ramdisk根文件系统映象:ramdisk.img
把他umount掉:
#umount /mnt/ram

如果是第一次接触ramdisk,你可能对上述的内容很迷惑,如果这样,请反复阅读和理解上面的内容,自己多动手做几次试验,就可以理解.

压缩ramdisk.img印象文件:
[root@gucuiwen babylinux]# gzip -v9 ramdisk.img
ramdisk.img: 87.9% — replaced with ramdisk.img.gz

查看压缩后的大小:
[root@gucuiwen babylinux]# ls -lh ramdisk.img.gz
-rw-r–r– 1 root root 495K 11月 30 11:32 ramdisk.img.gz

我得到的压缩ramdisk映象文件安是495K. 加上内核的845K,是1340K
符合公式:

内核大小+文件系统压缩印象文件+50K <= 1440K

如果你做出来的kernel和ramdisk.img.gz太大了,请重新制作kernel或ramdisk.img.gz,在其中做一些取舍,如果你的 kernel和ramdisk.img.gz太小了,那么可以再往里面添加一些内容,使你的babylinux功能更强.

十,内核与busybox的整合

准备一张完好的空白软盘

创建一个比内核大小略大的文件系统:
比如内核大小是845K,那么我我创见一个920K的文件系统:
#mkfs.ext2 -m0 /dev/fd0 920

如果空间允许,还可以再大一些,但是必需保证
1440K-文件系统大小>=ramdisk.img.gz的大小.

挂上软盘
#mount /dev/fd0
将内核拷贝到软盘:
#cp /babylinux/bzImage /mnt/floppy/
将lilo引导文件安boot.b 拷贝到软盘
#cp /boot/boot.b /mnt/floppy

新建一个lilo.conf 配置文件:

prompt
timeout=60
default=linux
boot=/dev/fd0
map=/mnt/floppy/map
install=/mnt/floppy/boot.b
linear

image=/mnt/floppy/bzImage
label=linux
read-only
vga=788
root=/dev/fd0
append=”load_ramdisk=1 ramdisk_start=940″

vga=788表示让内核支持字符界面的高分辨率显示,你可以改成vga=ask,这样可以在启动的时候选择分辨率.

红色一行是关键,load_ramdisk=1告诉内核在启动的时候转载压缩的ramdisk印象文件,
ramdisk_start=940 告诉内核从软盘的第940K的地方去寻找并装载压缩的ramdisk印象文件.

关于ramdisk的用法和更多参数请查看linux0内核文档/usr/src/linux/Documents/ramdisk.txt

接下来再用dd命令把ramdisk.img.gz装到软盘上.

#dd if=/babylinux/ramdisk.img.gz of=/dev/fd0 bs=1k seek=940

这里的seek=940 表示把ramdisk.img.gz装到软盘的第940K开始的地方.

详细内容请看dd的联机文档 man dd

为什么要从940k开始呢?
因为刚才作了一个920K的文件系统.我把他装在文件系统20K以后的地方.
当然,如果你的空间十分紧张,连这20K都不舍得浪费,那么可以这样:

#dd if=/babylinux/ramdisk.img.gz of=/dev/fd0 bs=1k seek=921

当然,别忘记修改lilo.conf文件. ramdisk_start=921

接下来装lilo引导程序就大功告成了.

#lilo -C lilo.conf

如果你的磁盘上还有一点点空余空间,那么可以把lilo.conf也拷贝上去,以备将来使用.
#cp lilo.conf /mnt/floppy

#umount /dev/fd0

整个工程已经完成了,你可以重新启动机器,设置电脑从软盘启动.看看有没有成功.

十一,安装测试和内容调整

如果在整合内核和ramdisk映象过程中,出现磁盘空间不够的情况,请重新编译内核和busybox
可以根据实际需要,调整内核和busybox,比如你要内核支持很多东西,但是只需要一个支持50个命令的busybox,那么可以自己做相应调整.

十二,babylinux中的BUG

有些命令的输出结果会有偏差,比如用 busybox的df 看磁盘使用情况,和实际的不一样.

十三,接下来要做的事情

做一个基于64M U盘的linux小系统.
计划支持如下特征:

a.软盘babylinux的所有功能
b.图形界面的支持.
c.一个轻量级的窗口管理器(window maker)
d.网络的支持,
e.至少一个图形web浏览器,可以上网.
f.一个音乐播放器和一个视频播放器.
g.支持中文的显示和输入.
h.可以修改配置并保存数据

我还计划做一个live CD,但是目前已经有很多live CD了,而且都做的非常好.
但是我会自己做一个作为学习linux的一种手段.如果有时间,可能写一个做U盘linux和live CD
的教程.但是,我想不会写的和这个文档一样详细了,我的时间有限.可能大概讲一下原理和步骤.有经验的linux爱好者应该可以通过阅读文档完成制作.

十四,参考文献

<Pocket Linux Guide>

62 comments 四月 16th, 2010

Ansi控制码的说明

ANSI控制码的说明

例如:
echo -ne “\33[32m" 可以将字符的显示颜色改为绿色
echo -ne "\33[3;1H" 可以将光标移到第3行第1列处
具体的摘抄一些如下:
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
所有的转移字符表:
\a ASCII 响铃字符(也可以键入 07)
\d "Wed Sep 06" 格式的日期
\e ASCII 转义字符(也可以键入 33)
\h 主机名的第一部分(如 "mybox")
\H 主机的全称(如 "mybox.mydomain.com")
\j 在此 shell 中通过按 ^Z 挂起的进程数
\l 此 shell 的终端设备名(如 "ttyp4")
\n 换行符
\r 回车符
\s shell 的名称(如 "bash")
\t 24 小时制时间(如 "23:01:01")
\T 12 小时制时间(如 "11:01:01")
\@ 带有 am/pm 的 12 小时制时间
\u 用户名
\v bash 的版本(如 2.04)
\V Bash 版本(包括补丁级别) ?/td>
\w 当前工作目录(如 "/home/drobbins")
\W 当前工作目录的“基名 (basename)”(如 "drobbins")
\! 当前命令在历史缓冲区中的位置
\# 命令编号(只要您键入内容,它就会在每次提示时累加)
\$ 如果您不是超级用户 (root),则插入一个 "$";如果您是超级用户,则显示一个 "#"
\xxx 插入一个用三位数 xxx(用零代替未使用的数字,如 "07")表示的 ASCII 字符
\\ 反斜杠
\[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。
\] 这个序列应该出现在非打印字符序列之后。

59 comments 四月 16th, 2010

Mldonkey相关配置

web interface

http://localhost:4080/

client_name = “adam”
max_hard_upload_rate = 10
max_hard_download_rate = 100
max_hard_upload_rate_2 = 100
max_hard_download_rate_2 = 1000
max_opened_connections = 100
max_opened_connections_2 = 1000
max_concurrent_downloads = 10
ED2K-max_connected_servers = 10
max_connections_per_second = 50
buffer_writes = true
buffer_writes_delay = 30
buffer_writes_threshold = 2048
client_buffer_size = 30720
enable_kademlia = true
enable_directconnect = true

rm ~/.mldonkey/web_infos/level1.gz

vim ~/.mldonkey/downloads.ini

web_infos
change (”server.met”, 0, “http://www.emule.org.cn/server.met“);
del (”guarding.p2p”, 96, “http://www.bluetack.co.uk/config/level1.gz“);

Firefox MLdonkey/eMule/aMule Protocol Handler
http://www.informatik.uni-oldenburg.de/~dyna/mldonkey/

62 comments 四月 16th, 2010

Irc常用命令

/ADMIN 命令
———————————————————–

【语法】

/admin

【描述】

用来查询当前IRC服务器上Admin(即Administrator,IRC里最高级别的管理员)的相关信息

/ALIAS 命令
———————————————————–

【语法】

/ALIAS [Alias文件名] <命令缩写> <具体命令>

【描述】

用来为某一条命令提供一个简单的缩写方式,这将使你聊天时更为方便,尤其是与对方纸上谈兵时。 ;>
你也可以为该命令缩写指定一个保存的文件名。

【注意】

使用/ALIAS命令只能为一条单行命令提供缩写。事实上大家使用得更多的还是按ALT+A直接调出mIRC的ALIAS编辑框,在这里可以直接对命令缩写进行编辑或者创建、删除等,而且在编辑框里还可以为多行命令设置一个缩写(ALIAS),这是单单用/ALIAS命令所做不到的。

【举例】

在mIRC的命令行里输入:/alias /faint /me 晕倒…,这样就有了/faint这个命令缩写。以后你再打/faint就等于是输入了/me 晕倒…这一串命令。

在mIRC的命令行里输入:/alias /bye /say $1 慢聊,我去了。注意这里的“$1”,它指代了/bye这个命令缩写的第一个参数。以后你打“/bye TigTag”,TigTag就等于成了/bye这个命令缩写的第一个参数的具体值。于是这个命令缩写的最终执行形式实际上就是/say TigTag 慢聊,我去了。

/AME 命令
———————————————————–

【语法】

/AME <消息>

【描述】

向你在的所有闲聊室发送你的动作。(注意,不是小窗口)

/AMSG 命令
———————————————————–

【语法】

/AMSG <消息>

【描述】

向你在的所有闲聊室发送话语。(注意,不是小窗口)

/AUTO 命令
———————————————————–

【语法】

/auto [-r] [on|off|别名/地址] [#闲聊室1,#闲聊室2,..] [类型]

【描述】

用来往mIRC的自动给帽子名单里添加或者删除名字。也就是说,假设TigTag在你的AUTO名单里,那么以后当你在某个闲聊室是主持人的时候,TigTag进来了,则mIRC会自动以你的名义给他加上帽子(即让他变成主持人)。

【注意】

关于地址类型请参照/IGNORE命令帮助。

【举例】

要查看当前是否允许mIRC自动给帽子,直接打“/auto”即可。
要打开mIRC自动给帽子开关,用命令“/auto on”。
要添加TigTag到自动给帽子名单,用命令“/auto TigTag”。
要添加TigTag到自动给帽子名单,并限定只有他在#Chat时才自动给帽子,用命令“/auto TigTag #Chat”。
要从自动给帽子名单移除TigTag,用命令“/auto -r TigTag”。
要让从127.0.0.1来的所有人都自动给帽子,用命令“/auto *!*@127.0.0.1”。

/AWAY 命令
———————————————————–

【语法】
/away [暂时离开的原因]

【描述】
用来留下一条信息以说明你暂时要离开,你可以指定该信息。以后当某人再向你发送密聊话语或者对你做一个“/WHOIS”命令时,他/她就会看到你留下的信息并且得知你已经暂时离开了。
如果敲不带任何参数的/AWAY命令则可以解除离开状态。

/BAN 命令
———————————————————–

【语法】

/ban [-ruN] [#闲聊室] <别名|地址> [类型]

【描述】

禁止某人进入某个闲聊室(根据他的地址)。
加参数-r是不再禁止某人;参数-uN是指只禁止某人N秒钟。

【注意】

这和/MODE命令的禁止稍有不同,/BAN在执行时首先要在当前的服务器上查找你要禁止的那个人,找到了才执行禁止这个动作;而/MODE则是任何时候都可以对指定的别名或地址进行禁止。
关于地址类型请参照/IGNORE命令帮助。

/CHANNEL 命令

【语法】
/channel

【描述】
弹出一个对话框,让你可以快速地对当前的闲聊室设置属性。

【注意】
你必须要在某个闲聊室中,并且你的当前窗口必须是该闲聊室才能执行这条命令。

/CLEAR 命令
———————————————————–

【语法】
/clear [-sghlc] [窗口名称]

【描述】
用来清除指定窗口的所有信息,如果不指定则清除当前窗口。
参数“-s”是指清除mIRC的状态窗口的内容;“-g”是指清除mIRC的Finger窗口的内容;“-h”是指清除指定窗口的输入栏的缓冲;“-l”是指清除一个带有目录列表的自定义窗口的目录列表;“-c”是指清除一个自定义图形窗口的鼠标点击历史。

/CLOSE 命令
———————————————————–

【语法】
/close [-icfgms@] [别名1]…[别名N]

【描述】
用来关闭指定类型的所有窗口。其中,参数-i指未被激活的DCC窗口;-c指闲聊室;-f指文件服务窗口;-g指接收文件窗口;-m指聊天小窗口;-s指发送文件窗口;@指自定义窗口。

/CLOSEMSG 命令
———————————————————–

【语法】
/closemsg <密聊小窗口名称>

【描述】
用来关闭指定的密聊小窗口。

【提示】
事实上,用CTRL+F4或者Alt+Z似乎更加快捷。

/CTCP 命令
———————————————————–

【语法】
/ctcp <别名> <PING|TIME|VERSION|FINGER|…>

【描述】
用来向某人发出特定的CTCP(Client To Client Protocol, 客户端到客户端协议)查询。
* 标准的CTCP查询有:
PING  延迟时间
TIME  本地时间
VERSION    聊天软件版本
FINGER  指针信息

【举例】
要查询到TigTag的延迟时间,用命令:/ctcp TigTag ping
要查询TigTag的本地时间,用命令:/ctcp TigTag time
要查询TigTag的聊天软件版本,用命令:/ctcp TigTag version
要查询TigTag的指针信息,用命令:/ctcp TigTag finger

/DCC 命令(Direct Chat Connection, 直接对话连接)
———————————————————–

【语法】
/dcc <SEND [别名] [完整的文件名]|CHAT [别名]>

【描述】
用来向某人发送文件或者进行密聊。

【注意】
“完整的文件名”在这里是指包含整个路径信息的文件名。
用/DCC CHAT进行密聊和/QUERY的密聊有所不同,用/QUERY进行密聊,所有的消息都要经过IRC服务器转送;而用/DCC CHAT,只是在聊天的最初需要IRC服务器初始化一下,此后双方就等于是通过IP建立起了点对点的连接,所有的消息就直接转送而不是通过IRC服务器转送了,相对就更加安全和隐蔽一些,而且即使这时候IRC服务器DOWN了双方也可以继续聊。
值得注意的是,在用/DCC命令的同时,你的IP地址会暴露给对方,如果是怀有恶意的人……所以,不要随便对陌生人使用/DCC。

/DESCRIBE 命令
———————————————————–

【语法】
/describe <#闲聊室|别名> <动作>

【描述】
用来向某个闲聊室或者某个人做出动作,效果等同于/ME命令,主要用于mIRC的脚本编写。

【举例】
/describe #Chat 晕倒,#Chat里的人就会看到你晕倒了。
/describe TigTag 晕倒,TigTag就会在小窗里看到你晕倒了。

/DISCONNECT 命令
———————————————————–

【语法】
/disconnect

【描述】
强制和IRC服务器断开连接。

【注意】
这和/QUIT不同,/QUIT是先向IRC服务器发出一个断开请求,然后由服务器切断连接;而/DISCONNECT则是在本地强制断开连接。

/ECHO 命令
———————————————————–

【语法】
/echo [颜色码] [-dehiNtsaqlbf] [窗口名称] <信息>
【描述】
用指定的颜色值(0~15)在指定窗口显示信息。其中,参数-a是指在当前窗口;-s是指在mIRC的状态窗口;-d是指在mIRC的Dedicated Query窗口。
参数“-e”是指在信息的前后一行分别放置一个行分隔符;“-iN”是指在指定的第N个字符处将信息自动卷行;“-h”是强制使用硬回车进行卷行;“-t”是指在前缀一个时间戳(当然,时间戳必须设置为打开);“-q”是指如果/echo命令用于一个Alias里,则当调用这条Alias并在命令前前缀一个“.”号时,不显示该信息;“-l”是指采用mIRC的高亮设置来显示信息;“-bf”则是指采用该窗口的Beep/Flash设置来显示信息。
【注意】
用/ECHO显示的信息只有你本人才看得到。

/EXIT 命令
———————————————————–

【语法】
/exit

【描述】
用来关闭mIRC这个应用程序(即相当于用鼠标点击了mIRC窗口最右上方的“×”)。

/LINKS 命令
———————————————————–

【语法】
/links

【描述】
用来解析当前的IRC有几个服务器,然后把解析到的结果放到一个单独的小窗口里。

/LIST 命令
———————————————————–

【语法】

/list [#闲聊室] [-MIN #] [-MAX #]

【描述】

用来列出服务器上的闲聊室名称(可以使用通配符)。如果不指定名称则列出当前服务器上的所有可用闲聊室;“-MIN #”和“-MAX #”用来限定列出包含指定人数的闲聊室。

【举例】

列出包含2~100个人的所有闲聊室:/list -min 2 -max 100

/LUSERS 命令
———————————————————–

【语法】
/lusers

【描述】
用来查询当前IRC服务器上的统计信息,例如当前的在线总人数、已经建立了多少个闲聊室等等。

/IGNORE 命令
———————————————————–

【语法】
/ignore [-lrpcntikxu#] [on|off|别名/地址] [类型]

【描述】
用来往mIRC的忽略名单里添加或者删除名字。在忽略名单里的别名或者地址,mIRC都将根据你所指定的方式对他们进行忽略。
参数  说明
l   根据你所指定的忽略方式列出忽略名单
r   从忽略名单中删除掉指定的别名或地址
p   忽略指定别名或地址的私人信息
c   忽略指定别名或地址的闲聊室信息
n   忽略指定别名或地址的NOTICE信息
t   忽略指定别名或地址的CTCP信息
i   忽略指定别名或地址对你发出的邀请
k   忽略指定别名或地址的颜色代码
x   忽略除了指定别名或地址的其他人的信息
u#  在指定秒数内忽略指定的别名或地址

【注意】
这里的类型是指“别名!电子邮件别名@地址”格式的地址类型,你如果指定了某人的名字,同时也指定了类型,那么mIRC首先会在当前的服务器上查找你指定的那个人,得到他的地址后,以如下的类型形式反馈出来,并添加到mIRC的忽略名单中。
假设此人叫TigTag,电子邮件是who@where.com,来自127.0.0.1,那么他的地址类型表现如下:
地址类型  表现形式
0   *!who@127.0.0.1
1   *!*who@127.0.0.1
2   *!*@127.0.0.1
3   *!*who@127.0.0.*
4   *!*@127.0.0.*
5   TigTag!who@127.0.0.1
6   TigTag!*who@127.0.0.1
7   TigTag!*@127.0.0.1
8   TigTag!*who@127.0.0.*
9   TigTag!*@127.0.0.*
* 地址类型也可以是10~19,只是通配符的位置较上面又有些变化。
* 这些地址类型也适合其它地方,比如/AUTO命令等。
* 当你正在与人开小窗时,对方的小窗信息无法忽略,除非关掉它。

【举例】
要查看当前是否允许mIRC进行忽略,直接打“/ignore”即可。
要允许mIRC进行忽略,用命令“/ignore on”。
要忽略来自TigTag的所有信息,用命令“/ignore TigTag”。
要忽略来自TigTag的地址,电子邮件别名也与他相同的所有别名的CTCP信息,用命令“/ignore -t TigTag 0”。
只忽略TigTag60秒,用命令“/ignore -u60 TigTag”。
要从忽略名单移除TigTag,用命令“/ignore -r TigTag”。
要从忽略名单移除所有的别名和地址,用命令“/ignore -r”。

/INFO 命令
———————————————————–

【语法】
/info

【描述】
用来查询IRC服务器的信息,例如服务器的名称、版本号等等。

/INVITE 命令
———————————————————–

【语法】
/invite <别名> <#闲聊室>

【描述】
用来邀请某人到你指定的闲聊室。

/ISON 命令
———————————————————–

【语法】
/ison <别名1> [别名2] [别名3...]

【描述】
用来向服务器查询指定的别名是否在线,你可以一次查询多个别名。事实上,很多IRC客户端软件的自动通告功能就是借助于/ISON命令实现的。

/JOIN 命令
———————————————————–

【语法】

/join <#闲聊室> [该闲聊室的密码]

【描述】

用来加入某个闲聊室。如果该闲聊室设置了密码,你可以指定它。

/KICK 命令
———————————————————–

【语法】
/kick <#闲聊室> <别名> [踢他的原因]

【描述】
用来把某人从你指定的闲聊室赶出去。你可以指定赶他的理由。

【注意】
要使用/KICK命令,你必须在该闲聊室拥有帽子(也就是是主持人),或者是这个聊天服务器的管理员才可以。

/ME 命令
———————————————————–

【语法】

/me <动作>

【描述】

用来在当前闲聊室或者密聊小窗口做出动作。

【举例】

假设你在#Chat,那么当你敲/me 晕倒,#Chat的其他所有人就会看到你“晕倒”了。

/MODE 命令
———————————————————–

【语法】
/mode <#闲聊室|别名> [[+|-]参数]

【描述】
/MODE命令是一个强有力的命令,它使得一个闲聊室的主持人能够更改所属闲聊室以及该闲聊室成员的属性。
* 更改闲聊室的属性

参数    效果
b <别名>   禁止某人加入该闲聊室
i      把闲聊室设置成只有被邀请的人才能进入
l <人数>   限定进入该闲聊室的最大人数
m      旁听模式—只有主持人和被许可的人才能说话
n      是否接受从闲聊室外传来的信息(+n为不接受)
o <别名>   使指定的人也成为闲聊室的主持人,即给他/她@符号(帽子)
p      把闲聊室设置成私人房间
s      把闲聊室设置成隐藏
t      锁定主题—只有主持人才能更改它
k <密码>   为闲聊室设置密码—只有知道密码的人才能进来
* 更改用户的属性
参数    效果
i      使你变得不可见—如果你不在任何闲聊室里,而别人又不知道你的别名的话,他/她就看不到你
o      IRC管理员(IRC-OP)状态,/MODE命令只能取消该状态。要设置该状态必须用/OPER命令
s      是否接受服务器的通告(+s为接受)
v      允许某人在一个设置成旁听模式的闲聊室说话
w      是否接收WALLOPS信息

【注意】
要在某个闲聊室使用/MODE命令,大多数情况下,你必须在该闲聊室拥有帽子(也就是是主持人)才可以。
你只能更改某人在某个闲聊室的属性,而不能更改其在IRC服务器上的属性(自己除外)。

【举例】
使TigTag成为#Chat的主持人,用命令:/mode #Chat +o TigTag
使TigTag不再是#Chat的主持人,用命令:/mode #Chat -o TigTag
禁止TigTag进入#Chat,用命令:/mode #Chat +b TigTag
不再禁止TigTag进入#Chat,用命令:/mode #Chat -b TigTag
限定#Chat的最大人数是100,用命令:/mode #Chat +l 100
使TigTag在服务器上隐藏起来,用命令:/mode TigTag +i
……
* 如果要使多个人成为主持人,这里有个更快捷的方法:/mode #Chat +oooo nicka nickb nickc nickd

/MOTD 命令
———————————————————–

【语法】
/motd

【描述】
用来查询当前IRC服务器上的今日信息(Message Of The Day)。

/MSG 命令
———————————————————–

【语法】

/msg <别名|#闲聊室> <消息>

【描述】

用来向某人发出密聊话语,或者对某个闲聊室的所有人说话。

【举例】

假设你敲/msg TigTag 你好,那么TigTag就会在他的小窗口里看到你在说“你好”,而且这句话只有你跟TigTag才会看到;

假设你敲/msg #Chat 大家好,那么在#Chat中的全体成员都会看到你在说“大家好”。

【注意】

当用/MSG命令对某人发出密聊话语时,其作用与/QUERY相同。唯一的区别就是:使用/MSG命令时,自己这边不单独开个小窗口;而使用/QUERY命令时,双方都会各自开一个小窗口进行对侃。

/NAMES 命令
———————————————————–

【语法】
/names [#闲聊室]

【描述】
如果未指定闲聊室,则列出当前IRC服务器上的所有别名;否则只列出指定闲聊室的所有别名。

【注意】
如果某人利用/MODE命令对自己使用了“+i”(即设置为隐藏模式),则/NAMES将无法列出他的别名。

/NICK 命令
———————————————————–

【语法】
/nick <新别名>

【描述】
用来更改自己的别名。在高版本的mIRC里你也可以用/ANICK命令来更改自己的备用别名,格式同/NICK。

/NOTICE 命令
———————————————————–

【语法】
/notice <别名> <消息>

【描述】
用来向某人发出通告信息。与/MSG和/QUERY不同,这种通告信息不会在双方开小窗。

/NOTIFY 命令
———————————————————–

【语法】
/notify [-r] [on|off|别名] [注释]

【描述】
用来往mIRC的通告名单里添加或删除名字,这样当通告名单里的人在线或离线时,mIRC都会自动通告你。
参数-r是指从通告名单中将指定的名字移除。
* 如果在别名前面加上个“+”号,则表示在mIRC通告你的同时也自动对其做一个/WHOIS命令。【举例】
允许mIRC根据通告名单进行通告,用命令:/notify on
把TigTag加到mIRC的通告名单,用命令:/notify +TigTag Helisheep是也
把TigTag从mIRC的通告名单移除,用命令:/notify -r TigTag

/OMSG 命令
———————————————————–

【语法】
/omsg [#闲聊室] <消息>

【描述】
用来给指定闲聊室的所有主持人发送密聊话语,前提是你必须也是主持人。如果未指定闲聊室,那么当前所处的闲聊室就是默认闲聊室。

/ONOTICE 命令
———————————————————–

【语法】
/onotice [#闲聊室] <消息>

【描述】
用来给指定闲聊室的所有主持人发送注意信息,前提是你必须也是主持人。如果未指定闲聊室,那么当前所处的闲聊室就是默认闲聊室。

/PART 命令
———————————————————–

【语法】

/part <#闲聊室> [退出的原因]

【描述】

用来退出某个闲聊室,在某些IRC服务器上,你还可以指定退出的原因。

/PARTALL 命令
———————————————————–

【语法】
/partall [退出的原因]

【描述】
用来退出所有闲聊室,在某些IRC服务器上,你还可以指定退出的原因。

/PLAY 命令
———————————————————–

【语法】
/play [-escpb q# m# rl# t#] [#闲聊室/别名/stop] <文本文件名> [间隔时间]

【描述】
用来播放文本文件到指定的闲聊室或者密聊小窗口。
参数“-e”是指将文本文件作为只有自己可以看到的显示信息播放出来;“-s”是指允许离线使用/play命令;“-c”是指要mIRC把文本文件的内容当成IRC命令强制执行。
如果你连续使用了多个/play命令,则在前一个文本文件尚未播放完之前,后面的文本文件是处于等待状态的,意即在同一时刻mIRC只允许你播放一个文本文件(这样主要是为了防止你FLOOD服务器)。参数“-p”可以把文件的等待序列提前,即优先播放;“-q#”可以指定总共允许的最大等待序列(超出的PLAY请求将被忽略);“-m#”则可以指定每个闲聊室或者别名可以接收的最大等待序列(超出的PLAY请求将被忽略)。注意“-q#”和“- m#”参数都必须是在Remote脚本里使用才有效。
参数“-b”是指将剪贴板里的文本作为文本文件播放出来;参数“-r”是指从文本文件里随机播放一行;参数“-l#”则是指从文本文件里播放指定的行。
参数“-t”是指播放指定标题下的所有内容(直到遇到下一个标题为止)。
使用参数“stop”可以停止播放文本文件。
* 在使用/PLAY命令时,函数$pnick可以返回当前的接收对象。

【注意】
间隔时间的单位是毫秒,默认值是1000

/POP 命令
———————————————————–

【语法】
/pop [延迟时间] [#闲聊室] <别名>

【描述】
用来对某人进行一个延迟给帽子。这主要是为了防止大家同时对同一个人给帽子,从而造成系统信息提示的泛滥。

【注意】
间隔时间的单位是秒,如果为0则表明立刻给帽子。

/PROTECT 命令
———————————————————–

【语法】
/protect [-r] [on|off|别名] [#闲聊室1,#闲聊室2,..]

【描述】
用来往mIRC的保护名单里添加或者删除名字。也就是说,假设TigTag在你的保护名单里,那么以后当你在某个闲聊室是主持人的时候,TigTag被踢出去了或者帽子被摘了,mIRC就会自动以你的名义把踢TigTag/摘TigTag帽子的人踢出去/摘帽子。

【举例】
要查看当前是否允许mIRC自动保护,直接打“/protect”即可。
要打开mIRC自动保护开关,用命令“/protect on”。
要添加TigTag到保护名单,用命令“/protect TigTag”。
要从保护名单移除TigTag,用命令“/protect -r TigTag”。

/QUERY 命令
———————————————————–

【语法】

/query <别名> [密聊话语]

【描述】

用来向某人发出密聊话语。

【举例】

假设你敲/query TigTag 你好,那么你和TigTag双方都会各自弹出一个小窗口,“你好”这句话会同时出现在你跟TigTag各自的小窗口里,而且这句话只有你跟TigTag才会看到。

【注意】

当用/MSG命令对某人发出密聊话语时,其作用与/QUERY相同。唯一的区别就是:使用/MSG命令时,自己这边不单独开个小窗口;而使用/QUERY命令时,双方都会各自开一个小窗口进行对侃。

/QUIT 命令
———————————————————–

【语法】
/quit [退出连接的理由]

【描述】
用来退出与当前服务器的连接,并可以给出退出的理由。

【注意】
退出的理由只有那些在你退出的时候,与你在同一闲聊室的人才能看见。

/RAW 命令
———————————————————–

【语法】
/raw [-q] <命令>

【描述】
用来往IRC服务器发送命令并要求其执行。在某些IRC服务器上,该命令等同于/QUOTE。
参数“-q”可以使mIRC不显示你所发出去的命令。

/SAY 命令
———————————————————–

【语法】
/say <消息>

【描述】
用来向当前的闲聊室说话。其实就等于在命令输入栏里直接敲话。

/SERVER 命令
———————————————————–

【语法】
/server [服务器地址] [端口] [密码]

【描述】
用来连接某个IRC服务器,并可以指定端口(默认是6667)和密码。
如果不带任何参数,则mIRC默认连接到上一次连接的IRC服务器。

/SILENCE 命令
———————————————————–

【语法】
/silence [+|-][地址]

【描述】
用来通知IRC服务器为你建立一个忽略列表,凡是符合SILENCE列表里的人发给你的信息都将被服务器忽略,直至你从SILENCE列表里移除这些地址或者退出IRC服务器。
关于地址的类型请参考/IGNORE命令。
* 这个命令其实与/IGNORE命令非常类似,只不过/SILENCE是利用IRC服务器来忽略,而/IGNORE是利用mIRC本身来忽略。

【举例】
忽略TigTag的任何信息,用命令:/silence +TigTag!*@*
不再忽略来自192.168.*的任何信息,用命令:/silence -*!*@192.168.*
查看服务器为你建立的SILENCE列表,用命令:/silence

/SOUND 命令
———————————————————–

【语法】
/sound [on|off|别名/#闲聊室] <file.wav|file.mid> [消息]

【描述】
用来向某人或者某个闲聊室发出声音(可以是*.wav文件或者*.mid文件),同时还可以夹带上一句话。

【举例】
打开mIRC的声音开关,用命令:/sound on
对#Chat发出passport.mid,用命令:/sound #Chat passport.mid
对TigTag发出tada.wav,并且说Hi,用命令:/sound TigTag tada.wav Hi

/SPLAY 命令
———————————————————–

【语法】
/splay [-qwm] <stop|file.wav|file.mid>

【描述】
用来对自己放出声音(可以是*.wav文件或者*.mid文件),只有自己才听得到。
也可以用来停止当前mIRC正在播放的声音,用命令:/play stop
如果只想停止当前mIRC正在播放的*.wav文件,用命令:/play -w stop
如果只想停止当前mIRC正在播放的*.mid文件,用命令:/play -m stop
参数“-q”可以让你将要播放的声音文件自动排成一个序列,然后顺次播放。

/TIMER 命令
———————————————————–

【语法】
/timer[数字/名称] [-ceom] [时间] <重复次数> <间隔时间> <命令>

【描述】
用来重复执行某个命令。默认情况下mIRC使用的是在线TIMER,也就是说,一旦和IRC服务器断开连接,所有的TIMER自动被清除,而参数-o 可以强制某个TIMER成为一个离线TIMER;mIRC默认的间隔时间是以秒为单位,而参数-m可以使之以毫秒为单位。
如果重复次数为0,则该TIMER将一直重复下去,直到用/timer[数字/名称] off停止该任务。(用/timers可以查看所有的TIMER;用/timers off可以清除所有的TIMER;在清除TIMER时也允许使用通配符,例如:/timer3? off、/timerflood_* off)
/TIMER命令也可以指定在某个时间才开始重复执行命令。
* 函数$ltimer可以返回你最后一次使用/TIMER命令时所起的计时器的序号或者名称。

【举例】
重复说10次“大家好”,间隔1秒,用命令:/timer 10 1 /say 大家好
在23:00的时候报一次时,用命令:/timer 23:00 1 1 /say 现在的时间是晚上11点整!
终止所有以1开头的TIMER,用命令:/timer1* off

/TOPIC 命令
———————————————————–

【语法】
/topic <#闲聊室> [新主题]

【描述】
用来更改指定闲聊室的聊天主题。
如果不指定新主题,则系统会告诉你指定闲聊室的当前主题。

/USERHOST 命令
———————————————————–

【语法】
/userhost <别名>

【描述】
用于查找某人的IP。

/WHO 命令
———————————————————–

【语法】
/who [别名/地址|#闲聊室]

【描述】
用来获取某人的一些信息,如对方的IP;也可根据指定的IP找人;还可以列出指定闲聊室的人名。

【举例】
查找IP地址是127.0.0.1的人,用命令:/who 127.0.0.1
查找IP地址以192.168打头的人,用命令:/who 192.168.*
列出当前IRC服务器上的所有非隐藏的人,用命令:/who

【注意】
不是所有的IRC服务器都支持用/WHO命令找人

/WHOIS 命令
———————————————————–

【语法】
/whois <别名>

【描述】
用来获取某人的一些信息,如对方的真实名字,对方的IP,对方是何时登录IRC服务器的,等等。

/WHOWAS 命令
———————————————————–

【语法】
/whowas <别名>

【描述】
用来查询最近某人是否登录过当前的IRC服务器。如果有此人的记录,则通过/WHOWAS命令便可得知他/她末次登录的时间,以及末次登录时使用的地址等等信息

================
● 基本语法篇
================

变量(Variables)

变量是用来暂时储存某个数据以便以后在mIRC脚本中使用的。它的基本构成是”%”+”变量名”,例如%a、%b、%test。在mIRC中对变量的限制很宽松,甚至连任何符号都可以用来作为变量,比如%a@b、%[names等都是合法的变量。当某个变量不存在或者未设置变量值时,该变量的值将被认为是$null(空值)。

下面介绍如何对变量进行设置,以及如何对它们进行操作。

在mIRC中专门有一个与Alias、Popup和Remote类似的变量编辑窗口(按Alt+R,再选择Variables选项卡),你可以直接在这里写入变量名以及所对应的变量值。但是,建议你用如下的mIRC命令根据需要来设置变量,因为这样更便于在脚本中引用。

/SET 命令
-----------------------------------------------------------

【语法】

/set [-szuN] <变量> [变量值]

【描述】

用来设置一个变量,并可以给它赋予初始值。参数-uN是指在设置变量N秒后,如果没有其它脚本引用该变量,则将其自动删除;-s是指在设置变量时让mIRC做出回显(下同);-z是指递减该变量值,直至其为0的时候将其自动删除。

利用/SET命令设置的变量都可以在变量(Variables)编辑窗口看到,并可以进行编辑。

/UNSET 命令
———————————————————–

【语法】

/unset [-s] <变量>

【描述】

用来从变量编辑窗口中删除掉指定的变量。可以使用通配符,例如:/unset %chan*,这将删除掉所有以%chan开头的变量。

/UNSETALL 命令
———————————————————–

【语法】
/unsetall
【描述】
这将删除掉变量编辑窗口中的所有变量。

/INC 命令
———————————————————–

【语法】
/inc [-cszuN] <变量> [步长]
【描述】
根据指定的步长来增加某个指定变量的值。参数-uN是指只增加该变量的值一次,然后在N秒后删除该变量;-c是指每秒增加该变量的值一次;-z指递减该变量的值,直至其为0的时候将其自动删除。

/DEC 命令
———————————————————–

【语法】
/dec [-cszuN] <变量> [步长]
【描述】
根据指定的步长来减少某个指定变量的值。参数-uN是指只减少该变量的值一次,然后在N秒后删除该变量;-c是指每秒递减该变量的值一次;-z指递减该变量的值,直至其为0的时候将其自动删除。

你也可以在脚本中(注意,不是在命令输入栏)直接用英文等号(”=”)来设置某个变量,如“%x = 88”;你也可以利用英文等号来对变量进行一个简单的运算,如“%x = 88 + 5”(注意,如果要进行更复杂的运算,则必须使用$calc()函数)
你还可以利用/VAR命令来设置一个临时变量,它将只能在脚本中进行设置,并且当该脚本运行完毕时将被自动删除。例如:/var %x、 /var %x = hello、 /var %x = hello, %y, %z = $me …

运算符
———————————————————–

在mIRC中也有很多运算符,基本的包括:+(加)、-(减)、*(乘)、/(除)、%(求余数)、^(乘方),不过通常都要配合$calc()函数使用,以让mIRC识别这是一个运算式。例如:%count = $calc((%x + 1) * 4)
在编写mIRC脚本时还经常会用到一个很有用的运算符,那就是“[”和“]”。当表达式或者函数被这两个符号包括起来时,则mIRC会优先执行这里面的运算(按从左到右的顺序)。需要注意的是在“[”和“]”的两旁必须留有一个英文空格,否则将不起作用。
其它还有很多运算符,如关系运算符等,这将在判断语句中进行介绍。

判断语句
———————————————————–

在mIRC中,判断语句(If-Then-Else)的基本句法是:
if (v1 运算符 v2) { 命令 }
elseif (v1 运算符 v2) { 命令 }
else { 命令 }
“()”括号里的内容是表明进行判断,如果为真,则执行“{}”括号里的命令(可以是任何命令)。
这里的运算符包括:
==   等于
===    等于(对大小写敏感)
!=   不等于
<    小于
>    大于
>=   不小于
<=   不大于
//   存在倍数关系
\\   不存在倍数关系
&    存在位与关系

isin  字符串v1被包含在字符串v2里
isincs  字符串v1被包含在字符串v2里(对大小写敏感)
iswm  v2符合包含通配符的字符串v1
isnum   数字v1在指定的v2范围内(v2可省略);例如:(8 isnum 6-10)、(6 isnum)
isletter 字母v1包含在v2列出的英文字母里(v2可省略);例如:(t isletter fantasy)、(s isletter)
isalnum  v1为一个英文字母或者数字
isalpha  v1为一个英文字母

ison  别名v1在闲聊室v2里
isop  别名v1是闲聊室v2的主持人(有@帽子)
isowner  别名v1是闲聊室v2的拥有者(OWNER, 见于IRCX服务器)
isvo  别名v1在闲聊室v2里有发言权
ishop   别名v1是闲聊室v2里的一个助理主持人(HalfOP,旧称Helper)
isreg   v1是闲聊室v2里的一个普通别名
ischan  v1是你目前已经进入的闲聊室
isban   v1是mIRC的内部BAN列表里被BAN掉的地址

isauto  v1是自动给帽子(Auto-Op)列表中的人(v2用来指明是在哪个闲聊室,可选)
isignore v1是忽略(Ignore)列表中的人
isprotect v1是自动保护(Protect)列表中的人(v2用来指明是在哪个闲聊室,可选)
isnotify v1是你的通知(Notify)列表中的人

要进行相反的判断,则在运算符前面加“!”号,例如:(55 !isletter)、(TigTag !ison #Chat) 等等。
函数$ifmatch可以用来返回被IF判断语句捕获的第一个参数,例如:if (TigTag isin TigTagIsHelisheep) { … },由于“TigTag”被包含在了“TigTagIsHelisheep”这个字符串中,因此这里的$ifmatch就将返回TigTag。
你也可以利用逻辑运算符&&(And)和||(Or)来组合更为复杂的判断,例如:if (($nick ison #Chat) && ($nick == TigTag)) { … }

循环语句
———————————————————–

在mIRC中目前只提供了一种循环语句,即While循环。它的基本句法如下:
while (v1 运算符 v2) {
命令
}
(v1 运算符 v2)表示判断(参见判断语句),如果为真则进行循环。你可以用/break跳出该循环,也可以用/continue跳到循环的最开始处。
使用While语句的时候很容易造成一个死循环,用它只是可以让程序流程看起来更清晰明了罢了(个人观点)。你当然也可以利用IF语句+GOTO语句形成一个循环(尽管GOTO语句会让程序变得很晦涩,而且容易打乱程序的结构)。例如:

var %i = 0
:nexti
inc %i 1
if (%i >= 10) { goto endi }
goto nexti
:endi

PS: 在编写Remote脚本的时候,所有用到的IRC命令都可以省略掉前面的“/”号。

============================
● 昵称服务(NickServ)命令
============================

REGISTER 命令
———————————————————–

【语法】

/msg nickserv register <当前昵称的密码> [E-Mail地址]

【描述】

用来注册当前你所使用的昵称,这样其他的用户就不能使用这个昵称了,除非你授予他/她权限在你的ACCESS列表。一但你的昵称被注册了,可以根据你的喜好使用SET命令或ACCESS命令来修改相应设置。请一定记住注册时的密码,这个密码在以后会经常用到。如果你忘记了密码,可以找系统管理员帮助你重新找回。

* 在某些IRC服务器上在注册昵称时还要求你提供一个自己的E-Mail地址,以便在忘记密码时可以将密码邮到该信箱。

【举例】

假设我现在的昵称是TigTag,那么我输入/msg nickserv register HdeestP double.j@ynmail.com,这样就会以Hdeestp这个密码将昵称TigTag注册了。

IDENTIFY 命令
———————————————————–

【语法】

/msg nickserv identify <当前昵称的密码>

【描述】

用来验证当前你所使用的昵称,通常是在你登录IRC服务器或者改名后需要使用。如果在规定的时间内没有输入正确的验证命令和密码,则会被强制更名或者被杀出服务器。

【举例】

假设我现在的昵称是TigTag,输入/msg nickserv identify HdeestP,就会将TigTag这个昵称进行验证了。这里我的密码是Hdeestp,即我们在示例REGISTER命令时所使用的密码。

ACCESS 命令
———————————————————–

【语法】

/msg nickserv access <ADD | DEL | LIST> [地址掩码]

【描述】

用于修改或者显示允许使用你当前这个昵称的地址列表。这里增加的网络地址掩码NickServ会自动识别,如果你在其他的网络地址中使用这个昵称,你仍然需要使用IDENTIFY命令让NickServ来识别您。
地址掩码的格式是:userid@host.domain

【举例】

/msg nickserv access add who@*.moodnet.org,这将允许在moodnet.org这个域里userid为who的人使用当前的这个昵称。
/msg nickserv access del who@*.moodnet.org,这将删除上面所添加的这个ACCESS地址掩码。
/msg nickserv access list,将列出允许使用你当前昵称的所有地址掩码。

LINK 命令
———————————————————–

【语法】

/msg nickserv link <主力昵称> <主力昵称的密码>

【描述】

用于链接当前昵称到你的主力昵称。一旦当你做了链接,如果使用ACCESS命令查看这个昵称的网络列表时,你会发现该昵称的访问列表将被删除,取而带之的是主力昵称的网络列表,而对于当前昵称的所有的留言信息都将被追加到主力昵称上(这将导致主力昵称的留言信息的最小限制被打破,所以需要你及时删除一些没用的留言)。
一但这个链接被建立,你当前的这个昵称将同主力昵称一样被NickServ识别,除非你使用了NickServ的UNLINK或者DROP命令。
例如:你可以使用其它的别名来读取自己的留言信息(别人发给您经过链接的其他昵称的信息,你都可以接收)。如果你现在的昵称经过验证了,那么其他昵称同样自动得到验证。如果你在某个频道里有权限,则也会同样得到识别。
在使用这个命令前,你必须先使用IDENTIFY命令来认证当前的这个昵称。

【举例】

使用命令/msg nickserv link TigTag Hdeestp,将把当前的昵称链接到主力昵称TigTag。这里TigTag的密码是Hdeestp,即我们在示例REGISTER命令时所使用的密码。

SET 命令
———————————————————–

【语法】
/msg nickserv set <选项> <相应参数>

【描述】
用来对你的当前昵称进行一些设置。这些设置项目包括:
Password  用于改变当前昵称的密码
Language  用于选择使用何种语言(通过选择语言代码)让NickServ对该昵称发出信息
URL   用于设置与当前昵称相关的主页地址,该地址可以在使用INFO命令时看到
Email   用于设置与当前昵称相关的电子信箱,该信箱可以在使用INFO命令时看到
Kill  用于设置对假冒用户的处理,使用的参数是“ON”、“QUICK”、“IMMED”和“OFF”。当选择“ON”打开这个开关时,如果有人想使用你的昵称,他/她将会被提示有1分钟的改名时间,如果到时他/她仍然没有改名,将会被NickServ强制杀出服务器。如果你选择了 “QUICK”,他/她将会被提示有20秒改名时间;如果你选择了“IMMED”,则该用户将不会得到任何改名警告而被杀出服务器(请不要使用这个选择,除非你有特别的需要)
Secure  用于打开或关闭NickServ的口令安全机制,使用的参数为“ON”或“OFF”。如果设置为“ON”,则无论当前昵称是否在 ACCESS网络列表里,都需要通过输入密码来认证;如果当前昵称已经在ACCESS网络列表里,则即使设置了KILL选项,系统也不自动杀掉你
Private   用于设置当别人使用/msg nickserv list命令时,是否隐藏你的注册信息。参数“ON”为是,“OFF”为否
Hide  用于设置当别人使用/msg nickserv info命令时,是否隐藏你的一部分信息。这些信息包括“Email”(电子邮件信息)、“UserMask”(网络地址信息)和“Quit”(最后退出时的信息);使用参数“ON”为隐藏,参数“OFF”为不隐藏

【举例】
更改密码:假设我现在的名字是TigTag,且已经通过了IDENTIFY验证,则使用/msg nickserv set password Kssoaqx命令可以将昵称密码改为Kssoaqx
更改语种:假设系统提供了语言代码“1”为“简体中文”;代码“2”为“繁体中文”;代码“3”为“English”…,则使用命令/msg nickserv set language 2可以让NickServ以后使用繁体中文对当前昵称提供信息
更改主页相关:/msg nickserv set url http://xirc.yeah.net/%EF%BC%8C%E8%BF%99%E5%B0%86%E6%8A%8A%E2%80%9C…%E4%BD%BF%E7%94%A8/msg</a> nickserv info命令查看到了
更改Email相关:/msg nickserv set email double.j@ynmail.com,这将把“double.j@ynmail.com”这个电子信箱与当前昵称建立关联,这样别人就可以使用/msg nickserv info命令查看到了
限定假冒用户在60秒内更名:/msg nickserv set kill on
打开NickServ的口令安全机制:/msg nickserv set secure on
在LIST命令里隐藏注册信息:/msg nickserv set private on
在INFO命令隐藏最网络地址信息:/msg nickserv set hide usermask on

DROP 命令
———————————————————–

【语法】
/msg nickserv drop

【描述】
用来注销当前你所使用的昵称,这样别人就可以使用这个昵称了。
在使用该命令前,必须先通过IDENTIFY命令进行的验证。

【举例】
/msg nickserv drop,这就将注销掉当前你所使用的这个昵称。

RECOVER 命令
———————————————————–

【语法】
/msg nickserv recover <指定昵称> <该昵称的密码>

【描述】
用于杀掉一个占用你昵称的人,该做法跟NickServ的自动杀保护是一样的。
当您使用这个命令时,NickServ将假装成一个跟这个昵称一样的用户昵称,这样就导致服务器杀掉这个用户(或强制更名)。这个假装的用户将持续在线1分钟,防止那个用户的再次连接;一分钟以后,你就把你的昵称改变为该昵称了,但在这之前最好使用先使用一下RELEASE命令(/msg NickServ HELP RELEASE)释放掉开头设置的昵称占用。
* 在使用RECOVER命令时你当前的网络地址必须在你的昵称的ACCESS网络列表里存在,而且你必须提供正确的密码。

RELEASE 命令
———————————————————–

【语法】
/msg nickserv release <被占用的昵称> <该昵称的密码>

【描述】
用于通知NickServ去掉因为使用RECOVER命令而占用的昵称,通常这种占用持续1分钟。
* 在使用RELEASE命令时你当前的网络地址必须在你的昵称的ACCESS网络列表里存在,而且你必须提供正确的密码。

UNLINK 命令
———————————————————–

【语法】
/msg nickserv link <昵称> <密码>

【描述】
用于从你的链接列表里删除这个昵称。当这个昵称被删除后,主力昵称的一些标记和网络地址信息将被拷贝过来,这个昵称从此将独立存在。但留言信息不再拷贝过来,所有的留言信息将被存储在主力昵称那里。
如果输入名字和口令参数,则删除跟你链接的其他名字。
服务管理员可以不通过口令认证,取消一个用户的连接。

GHOST 命令
———————————————————–

【语法】
/msg nickserv ghost <昵称> <密码>

【描述】
用于杀掉一个一直占用你昵称的“鬼魂”。当您的“鬼魂”还连接在IRC服务器上时,系统会认为这个“鬼魂”一直在线,从而导致你无法使用这个昵称。
产生这种“鬼魂”的原因通常是因为你不正常掉线了,而当你再次连接上来时,就发生了。
* 在使用GHOST命令时你当前的网络地址必须在该“鬼魂”的ACCESS网络列别里存在。

【举例】
杀掉“鬼魂”TigTag,使用命令/msg nickserv ghost TigTag HdeestP。这里TigTag的密码是Hdeestp,即我们在示例REGISTER命令时所使用的密码。

INFO 命令
———————————————————–

【语法】
/msg nickserv info <昵称> [All]

【描述】
用于查看某个已注册昵称的信息,例如该昵称的主人、网络地址、电子信箱、最后一次退出的信息等。
* 对于某些昵称,增加参数“All”可以获取更详细的信息。

LIST 命令
———————————————————–

【语法】
/msg nickserv list <地址掩码>

【描述】
用于根据指定的地址掩码列出相应的已注册昵称。地址掩码是按照“nick!userid@host.domain”的方式。
* 如果用户设置了Private选项,则在这里将不显示他/她的注册信息。

【举例】
/msg nickserv list *!*@61.128.*,将列出所有从61.128.*注册的昵称。
/msg nickserv list *!bot@*,将列出所有userid是“bot”的昵称。
/msg nickserv list *bot*!*@*,将列出所有包含“bot”字眼的昵称。

STATUS 命令
———————————————————–

【语法】
/msg nickserv status <昵称1[,昵称2,...昵称16]>

【描述】
用于查询指定昵称是否已得到验证,返回的格式是:

昵称 状态代码
“状态代码”的意思如下:
0  该昵称当前不在线,或者根本没有注册
1  该昵称尚未通过验证的
2  该昵称在对应的ACCESS网络列表中,但是没有通过验证
3  该昵称已经得到验证
* 最多一次可以查询16个名字,多余部分将被忽略。

=============================
● 频道服务(ChanServ)命令
=============================

REGISTER 命令
———————————————————–

【语法】

/msg chanserv register <#频道名称> <频道密码> <对该频道的描述>

【描述】

用来注册一个指定的频道。使用这个命令之前你必须先进入这个频道,并成为频道管理员,也就是我们通常说的有帽子;“频道密码”是为了便于验明身份来改变频道的设置;“对该频道的描述”是必须有的,用以说明这个频道研讨的主题。

当你注册了这个频道,你就成了这个频道的“创始者”(Founder)。创始者可以改变频道的所有设置,当创始者进入频道,ChanServ将会自动给予创始者频道管理员的权限。使用ChanServ的ACCESS命令可以为其他用户增加访问权限。

* 在注册频道之前,你必须先注册你的昵称。具体请参照NickServ的REGISTER命令

【举例】

/msg chanserv register #Chat kksSed 随便聊吧,这样就将注册#Chat这个频道,密码是kksSed,相应的频道描述是随便聊吧。

IDENTIFY 命令
———————————————————–

【语法】

/msg chanserv identify <#频道名称> <频道密码>

【描述】

用来验证你是指定的频道的创始者(Founder),ChanServ的很多命令都需要你事先使用它。

这里的“频道密码”是你在使用REGISTER命令注册频道时所使用的密码。

【举例】

/msg chanserv identify #Chat kksSed,这样就将把你验证成为频道#Chat的创始者。在这里我们所使用的密码是kksSed,即前面REGISTER命令示例时所提供的频道密码。

SET 命令
———————————————————–

【语法】

/msg chanserv set <频道名称> <选项> <相应参数>

【描述】

用来对指定频道进行一些设置(但在进行设置前必须使用ChanServ的IDENTIFY命令进行验证)。这些设置项目包括:

Founder  设置频道的创始者(必须是一个已注册的昵称)

Successor  设置频道的继承人。如果频道创始者的名字被取消或者失效,而频道还在使用,这样继承人就会变成频道的创始者。但是,如果这个继承人已经注册了太多的频道(>=20),这个频道将被取消,就跟没有继承人设置是一样的。

Password   设置创始者的密码(或者说是更改频道的密码)

Desc   更改对该频道的描述

URL  设置与该频道相关的主页地址信息(可以使用/msg chanserv info命令查看到)

Email  设置与该频道相关的电子信箱信息(可以使用/msg chanserv info命令查看到)

EntryMsg   设置当有用户进入该频道时,由频道对该用户发出的Notice信息。如果没有参数,将没有信息发给该用户。

Topic  设置该频道的主题

KeepTopic  设置当没有人在该频道时,是否记忆频道的主题,这样当下一次频道建立时会自动恢复成该主题。参数“ON”表示记忆,参数“OFF”表示不记忆。

TopicLock  是否锁定频道的主题。参数“ON”表示锁定,“OFF”表示不锁定。如果频道主题被锁定,则只有使用ChanServ的Set Topic命令才可以更改主题。

mLock  根据指定参数来锁定频道的模式,这些参数是以“+”号表示锁定,“-”表示不锁定,例如“+nt-iklms”;如果仅有一个“+”号而没有跟任何频道模式则表示不锁定频道的模式。(频道模式的含义请参照/MODE命令)

Private  设置是否从ChanServ的LIST命令里隐藏该频道(使用/msg chanserv list命令时,如果不知道该频道的完整名称则无法看到该频道);参数“ON”为隐藏,“OFF”为不隐藏。

Restricted   设置是否打开该频道的限制使用权。当Restricted被设置后,普通用户将被Kick和Ban出频道。这些普通用户包括级别是负数和不在访问权限列表中的用户。参数“ON”表示打开,“OFF”表示关闭。

Secure   设置是否打开该频道的安全特性。当Secure被设置后,只有已注册、并且使用IDENTIFY命令的用户才可以访问这个频道。参数“ON”表示打开,“OFF”表示关闭。

SecureOPs  设置是否打开该频道的安全管理员特性。当SecureOPs被设置后,没有在频道用户列表中的用户将不会有频道管理员权限(即不会得到帽子)。参数“ON”表示打开,“OFF”表示关闭。

LeaveOPs   设置是否打开该频道的保留管理员特性。当LeaveOPs被设置后,将不会自动DEOP用户,除非有DEOP命令被使用。参数“ON”表示打开,“OFF”表示关闭。

OPNotice   设置是否打开该频道的OP/DEOP通告。当OPNotice被设置后,只要有人在该频道使用了ChanServ的OP或者DEOP命令,ChanServ都将在该频道发送Notice通告。参数“ON”表示打开,“OFF”表示关闭。

【举例】

更改频道创始者:/msg chanserv set #Chat founder 阿奔,这将把频道#Chat的创始者设置为阿奔
设置频道继承人:/msg chanserv set #Chat successor FoOl_BoT,这将把频道#Chat的继承人设置为FoOl_BoT
更改频道描述:/msg chanserv set #Chat desc Welcome to chat here,这将把频道#Chat的描述更改为Welcome to Chat Here
更改主页相关:/msg chanserv set #Chat url http://xirc.yeah.net/%EF%BC%8C%E8%BF%99%E5%B0%86%E6%8A%8A%E9%A2%91….yeah.net/</a>
更改Email相关:/msg chanserv set #Chat email double.j@ynmail.com,这将把频道#Chat的Email信息更改为double.j@ynmail.com
设定EntryMsg:/msg chanserv set #Chat entrymsg Hi,#Chat的世界,就是任你天南地北侃大山的世界,这样当任何人进入频道#Chat时,都将收到由ChanServ发出的“Hi,#Chat的世界,就是任你天南地北侃大山的世界”这条Notice信息
更改频道主题:/msg chanserv set #Chat topic To chat or not to chat, this is a question..,这将把频道#Chat的房间主题设置为为To chat or not to chat, this is a question..
设置保留频道#Chat主题:/msg chanserv set #Chat keeptopic on
锁定频道#Chat的主题:/msg chanserv set #Chat topiclock on
锁定频道#Chat的模式为+nt-ilkmps:/msg chanserv set #Chat mlock +nt-ilkmps
不再锁定频道#Chat的模式:/msg chanserv set #Chat mlock +
在LIST命令里隐藏频道#Chat:/msg chanserv set #Chat private on
不再限制频道#Chat的使用权:/msg chanserv set #Chat restricted off
关闭频道#Chat的安全特性:/msg chanserv set #Chat secure off
关闭频道#Chat的安全管理员特性:/msg chanserv set #Chat secureops off
打开频道#Chat的保留管理员特性:/msg chanserv set #Chat leaveops on
打开频道#Chat的OP/DEOP通告:/msg chanserv set #Chat opnotice on

ACCESS 命令
———————————————————–

【语法】

/msg chanserv access <#频道名称> add <昵称> <级别>
/msg chanserv access <#频道名称> del <昵称 | 权限访问列表行号>
/msg chanserv access <#频道名称> list <昵称掩码 | 权限访问列表行号>

【描述】

用来查看或者修改指定频道的访问权限列表。不同的级别有不同的权限,不在频道权限列表中的用户级别是0。按照ChanServ默认的设置,各种权限如下:

10  可以使用AKICK命令;并在加入频道时自动获得频道管理权(即SOP、Super Operator)
5  在加入频道时自动获得频道管理权(即AOP、Auto Operator)
3  在加入频道时自动获得频道发言权(即VOP、Auto Voicer)
0  没有指定权限(即普通用户);可以被其他人给予@,但要保证SecureOPs没有设置
< 0  不允许有权限@

这些默认的权限级别也可以更改,参见LEVELS命令。

ACCESS ADD命令是增加指定级别的用户名到频道权限列表中,如果用户名已经在频道列表中,则改变用户的访问级别(改变用户的级别时,不能输入高于自己级别的数值)。
ACCESS DEL命令是从频道权限列表里删除指定的用户(可以直接指定用户名或权限访问列表里的行号)。
ACCESS LIST命令则是列出指定频道的权限列表(可以使用通配符来指示昵称,也可以使用权限访问列表里的行号;如果什么都没有指定则列出频道的所有权限)。

【举例】

/msg chanserv access #Chat add TigTag 10,这将把TigTag加入到频道#Chat的权限列表,并设置他的级别为10级(SOP)。
/msg chanserv access #Chat del FoOl_BoT,这将把FoOl_BoT从频道#Chat的权限列表里删除。
/msg chanserv access #Chat del 10-12,这将删除掉频道#Chat的权限列表里的第10-12项。
/msg chanserv access #Chat list,这将列出频道#Chat的所有权限列表。
/msg chanserv access #Chat list *t*,这将列出频道#Chat的权限列表里,包含字母“t”的昵称。

LEVELS 命令
———————————————————–

【语法】
/msg chanserv levels <#频道名称> set <类别名称> <级别>
/msg chanserv levels <#频道名称> <类别名称>
/msg chanserv levels <#频道名称> list
/msg chanserv levels <#频道名称> reset

【描述】
LEVELS命令可以很好的通过数值来更改不同级别所对应的权限。使用这个命令,你可以重新定义ChanServ所提供的默认访问级别。
可以通过LEVELS命令来更改的类别有:

AutoOP  自动频道管理员(AOP)
AutoVoice   自动获取频道发言权(VOP)
AutoDEOP  自动去除频道管理员
NoJoin  自动禁止加入该频道
Invite  允许使用ChanServ的Invite命令
Akick   允许使用ChanServ的Akick命令
Set   允许使用ChanServ的Set命令
Clear   允许使用ChanServ的Clear命令
Unban   允许使用ChanServ的Unban命令
OPDEOP  允许使用ChanServ的OP/DEOP命令
Acc-List  允许查看该频道的权限访问列表
Acc-Change  允许修改该频道的权限访问列表
Memo  允许查看或者阅读该频道的留言
LEVELS SET命令可以改变上述类别所对应的权限级别。
LEVELS DIS命令则可以禁止非创始者使用类别所对应的功能。
LEVELS LIST命令可以查看指定类别所对应的级别。
LEVELS RESET命令则可以重置上述所有类别到默认设置。

【举例】
/msg chanserv levels #Chat dis acc-list,这将禁止非创始者查看频道#Chat的权限访问列表。
/msg chanserv levels #Chat disable set,这将禁止非创始者在频道#Chat使用ChanServ的Set命令。
/msg chanserv levels #Chat set autovoice 0,这将设置频道#Chat的VOP级别为0,即普通用户的级别,这样任何人进入该频道都将被自动+v了。
/msg chanserv levels #Chat list,可以查看频道#Chat的各类别所对应的级别。
/msg chanserv levels #Chat reset,重置频道#Chat的所有类别到默认设置。

AKICK 命令
———————————————————–

【语法】
/msg chanserv akick <#频道名称> add <昵称 | 地址掩码> [原因]
/msg chanserv akick <#频道名称> del <昵称 | 地址掩码>
/msg chanserv akick <#频道名称> list [地址掩码]
/msg chanserv akick <#频道名称> view [地址掩码]
/msg chanserv akick <#频道名称> enforce
/msg chanserv akick <#频道名称> clear

【描述】
用于查看或修改指定频道的自动踢列表。一旦有符合自动踢列表的人加入该频道,都将被ChanServ自动Kick和Ban。
AKICK ADD命令可以增加一个昵称或地址到自动踢列表里,并可以指定踢他/她的原因。
AKICK DEL命令可以从自动踢列表删除指定的昵称或者地址掩码;但已经被BAN了的地址仍然需要被手工删除。
AKICK LIST命令可以查看指定频道的自动踢列表,并可以指定地址掩码以查看对应的信息。
AKICK VIEW命令是AKICK LIST更进一步的命令。
AKICK ENFORCE命令则是通知ChanServ立即执行自动踢,将踢出指定频道里当前所有符合自动踢列表项的用户。
AKICK CLEAR命令可以清空指定频道的自动踢列表。

【举例】
/msg chanserv akick #Chat add *bot*!*@* 禁止BOT入内,这将把“*bot*!*@*”这个地址加入频道#Chat的自动踢列表;这样当昵称中包含“bot”字样的人进入该频道时都将被自动踢出并+b,理由是“禁止BOT入内”
/msg chanserv akick #Chat del *bot*!*@*,这将从频道#Chat的自动踢列表里删除掉“*bot*!*@*”这个自动踢列表项
/msg chanserv akick #Chat list,这将列出频道#Chat的所有自动踢列表项
/msg chanserv akick #Chat clear,这将清除掉频道#Chat的所有自动踢列表项

CLEAR 命令
———————————————————–

【语法】
/msg chanserv clear <#频道名称> <频道设置>

【描述】
用于清除指定频道的设置,这些设置包括:
Modes  复位所有频道模式(例如:清除模式i、k、l、m、n、p、s、t)
Bans   清除频道所有禁止(Ban)信息
OPs  摘掉频道里所有的帽子
Voices   去掉频道里所有的发言权
Users  踢走频道里所有的人

【举例】
/msg chanserv clear #Chat modes,这将复位频道#Chat的模式。
/msg chanserv clear #Chat bans,这将清除掉频道#Chat里所有被禁止了的地址。

DROP 命令
———————————————————–

【语法】
/msg chanserv drop <#频道名称>

【描述】
用来注销指定的频道。
只有频道的创始者可以使用该命令,而且在使用前还必须通过ChanServ的频道验证。

【举例】
/msg chanserv drop #Chat,这将注销掉频道#Chat

INFO 命令
———————————————————–

【语法】
/msg chanserv info <#频道名称>

【描述】
用来查看指定频道的信息。包括频道创始者、注册时间、最后使用时间、频道描述和模式锁等。

【举例】
/msg chanserv info #Chat,将可以查看到频道#Chat的相关信息

LIST 命令
———————————————————–

【语法】
/msg chanserv list <关键字>

【描述】
根据关键字列出相应的已注册定频道,关键字可以使用通配符。
* 如果某个频道设置了Private选项,则在这里将看不到该频道。

【举例】
/msg chanserv list #C*,将列出所有以#C打头的频道

INVITE 命令
———————————————————–

【语法】
/msg chanserv invite <#频道名称>

【描述】
用于让ChanServ邀请你到指定的频道。但默认情况下,只有在该频道权限大于0级别的用户才可以使用。

【举例】
/msg chanserv invite #Chat,这将让ChanServ邀请你到频道#Chat

OP 命令
———————————————————–

【语法】
/msg chanserv op <#频道名称> <昵称>

【描述】
用于在指定频道给指定用户频道管理权限(帽子)。默认情况下,只有在该频道权限大于5级别的用户才可以使用。

【举例】
/msg chanserv op #Chat TigTag,这将让ChanServ在频道#Chat给TigTag帽子

DEOP 命令
———————————————————–

【语法】
/msg chanserv deop <#频道名称> <昵称>

【描述】
用于在指定频道去掉指定用户的频道管理权限(帽子)。默认情况下,只有在该频道权限大于5级别的用户才可以使用。

【举例】
/msg chanserv deop #Chat TigTag,这将让ChanServ在频道#Chat摘掉TigTag的帽子

UNBAN 命令
———————————————————–

【语法】
/msg chanserv unban <#频道名称>

【描述】
用于通知ChanServ取消所有因为Ban而阻止你进入该频道的设置。默认情况下,只有在该频道权限大于0级别的用户可以使用。

【举例】
/msg chanserv unban #Chat,这将让ChanServ在频道#Chat取消所有对你设置的BAN

=============================
● 留言服务(MemoServ)命令
=============================

LIST 命令
———————————————————–

【语法】

/msg memoserv list [#频道名] [留言序号 | 序号范围 | new]

【描述】

用来列出当前你或者指定频道所收到的留言。
参数“new”则表示列出所有未阅读过的留言。

【举例】

/msg memoserv list 1-2,将列出你当前的第1-2条留言
/msg memoserv list new,将列出你当前尚未阅读过的所有留言
/msg memoserv list #Chat 1,将列出频道#Chat的第一条留言

SEND 命令
———————————————————–

【语法】

/msg memoserv send <昵称 | #频道名称> <留言内容>

【描述】

用来给一个已注册昵称或者频道发送留言。

【举例】

/msg memoserv send TigTag Hello, 最近还好吧?,这样就给TigTag发送了个留言,内容是“Hello, 最近还好吧?”
/msg memoserv send #Chat 这是谁的频道?,这样就给频道#Chat发送了个留言,内容是“这是谁的频道?”

READ 命令
———————————————————–

【语法】
/msg memoserv read [#频道名称] <留言序号 | 留言序号范围 | last | new>

【描述】
用来阅读当前你或者指定频道所收到的留言。
参数“new”表示阅读最新的一条留言。
参数“new”表示依次阅读所有未阅读过的留言。

【举例】
/msg memoserv read 2,表示阅读当前你的第二条留言
/msg memoserv read #Chat 2-5,表示阅读频道#Chat的第2-5条留言
/msg memoserv read last,表示阅读当前你收到的最后一条留言
/msg memoserv read new,表示依次阅读当前你尚未阅读过的所有留言

DEL 命令
———————————————————–

【语法】
/msg memoserv del [#频道名称] <选项> <相应参数>

【描述】
用来删除掉当前昵称或者指定频道所接收到的留言。
参数“All”则表示删除所有的留言。

【举例】
/msg memoserv del 5,可以删除掉你当前的第5条留言
/msg memoserv del all,可以删除掉你已经接收到的所有留言
/msg memoserv del #Chat 3-5,可以删除掉频道#Chat的第3-5条留言

SET 命令
———————————————————–

【语法】
/msg memoserv set <留言选项> <相应参数>

【描述】
用来设置各种留言选项,这些选项包括:
Notify  用于改变新留言到来时的通知类型(仅针对昵称的留言)。参数“ON”表示当你登录到你的名字时、当你取消AWAY状态时以及当新留言被发送时,MemoServ都将通知你;参数“LOGON”表示当你登录到你的名字时和当你取消AWAY状态时被通知;参数“NEW”表示当有新留言到来时被通知;参数“OFF”则表示不通知有留言信息。
Limit   用于设置你或者是指定频道的最大留言条目数,如果设置成0,则别人将无法给你发送留言。最大留言条目数不能大于系统规定的20条。

【举例】
/msg memoserv set notify off,将关闭掉自己有新留言时的通告
/msg memoserv set limit #Chat 5,限制频道#Chat所能接收的最大留言条目为5条

P.S: 在很多IRC服务网络上,/msg nickserv、/msg chanserv和/msg memoserv命令都分别可以用/ns、/cs和/ms来代替。

71 comments 四月 16th, 2010

Gnome 去掉九宫格

去掉缩放特效 以及九宫格

/apps/metacity/general/reduced_resources
/desktop/gnome/interface/accessibility

216 comments 四月 16th, 2010

红旗HA镜像数据不一至解决方法

问题现象:

HA不能判断自己镜像磁盘上面数据的是否是最新数据,导致双机均不能挂载镜像磁盘。
系统日志中会有记录:mirror disk hasn’t latest data.
执行:clpmdstat –mirror wcmmd
显示MD状态均为red .
clpmdctrl –active wcmmd
时系统报镜像磁盘数据abnormal

解决办法:
1、执行clpcl -t -a停止HA
2、找到数据最新的机器,把数据相对旧的机器关掉。
3、在数据最新的机器上面执行clpmdctrl –force wcm1 wcmmd (这里假设wcm1数
据最新)
4、上面命令执行成功后,在服务器上面执行clpcl -s -a 启动HA软件。
5、启动wcm2服务器。
6、检查HA状态和MD状态.使用clpstat和clpmdstat –mirror wcmmd 命令.



127 comments 四月 16th, 2010

磁带机使用

Linux下使用磁带机的方式有多种,主要有通过Amanda、Tar等软件进行操作。

Amanda是提供了远程集中备份的功能,通过分别设置客户端、服务器端,实现远程集中存储备份。而Tar主要用于单机环境下,将数据直接写入磁带的备份。针对单一节点的备份,只要简单的使用Tar命令进行备份、恢复即可。
安装
对于目前厂家的HP DAT24/40系列外置SCSI磁带机,都带有自动回卷功能。将其接在外置SCSI的总线上,并重新启动服务器。重新引导后,执行dmesg将可以看到新的磁带机设备叫/dev/st0。

blk: queue ef0d7a14, I/O limit 4095Mb (mask 0xffffffff)audit subsystem ver 0.1 initialized(scsi0:A:3): 10.000MB/s transfers (10.000MHz, offset 15) Vendor: HP Model: C1537A Rev: L805 Type: Sequential-Access ANSI SCSI revision: 02blk: queue ef0e4614, I/O limit 4095Mb (mask 0xffffffff)Attached scsi tape st0 at scsi0, channel 0, id 3, lun 0

磁带操作
装入磁带后,可执行如下操作:

倒带,将磁带卷至起始位置
mt -f /dev/st0 rewind

擦除,擦掉磁带上的内容
mt -f /dev/st0 erase
注意:擦除工作非常慢,并且对磁带有损伤,最好不要执行,当数据写满后,可以继续写入数据并覆盖原有数据,无须执行擦除动作。新磁带打开封装后立刻可以使用,不需要执行擦除。

出带,将磁带卷至初始位置然后从磁带机内弹出
mt –f /dev/st0 offline
数据操作
基本操作如下:
1. 列目录操作tar tvf /dev/st0
假如磁带上没有任何文件,则列目录会报错,这个错误没有关系,不影响磁带的使用。

[root@dev131 /root]# tar tvf /dev/st0tar: /dev/st0: Cannot read: Input/output errortar: At beginning of tape, quitting nowtar: Error is not recoverable: exiting now[root@dev131 /root]#

2. 写入数据操作tar cvf /dev/st0 <要写入的文件名>
写入数据的方法有两种:不打包直接写入文件和打包压缩后写入文件。二者各有优缺点。不打包直接写入文件的方法,看起来效率低,操作复杂,但是可以提高数据的生存率。磁带是一种线性存储的设备,所有数据紧挨着顺序写入。当磁带的某一点损坏的时候,其余位置的磁带还可以继续读取,其中的文件也都能读出。如果采用了打包压缩后写入的方法,则磁带上存储的只有一个文件。当磁带有任何一个地方发生了故障无法读取,则这个压缩文件将缺少一些细节,即使是一个bit的错误,也将导致压缩文件报告CRC错误无法解压。所以,如果是存储大量的数据,建议直接写入。如果是存取小文件,则最好打包并给文件名加时间标记写入。

例如要将/root/test1.tar.gz写入到磁带并覆盖磁带的内容:
tar cvf /dev/st0 test1.tar.gz
磁带机的传输速度比较慢,对于不是很大的文件备份,稍等几秒,写入即可完成。使用参数cvf将覆盖此带上的已有文件。

随后列出磁带上的文件:

[root@dev131 /root]# tar tvf /dev/st0-rw-r–r– root/root 320 2006-12-01 09:29:02 test1.tar.gz[root@dev131 /root]#

可看到数据写入成功。

注意:这个命令只能在磁带是全新的时候写入,在第二次执行的时候,就会覆盖掉磁带上原来的数据。另外,使用tar命令备份,要求备份文件体积必须小于单盘磁带的容量,即一个文件不能跨越两盘磁带。如果遇到这种情况,则不能使用tar命令备份,需要换其他备份程序进行操作。

3. 继续写入数据tar rvf /dev/st0 <要写入的文件名>
磁带存储是线性存储,所有数据是依次写入的。为了不覆盖前边的内容,在写入时候,要使用rvf参数写入内容。
tar rvf /dev/st0 test2.tar.gz

再执行一次rvf继续写入其他的文件:
tar rvf /dev/st0 test3.tar.gz

写入完成后,查看磁带上有哪些文件:

[root@dev131 /root]# tar tvf /dev/st0-rw-r–r– root/root 320 2006-12-01 09:29:02 test1.tar.gz-rw-r–r– root/root 320 2006-12-01 09:44:19 test2.tar.gz-rw-r–r– root/root 320 2006-12-01 09:30:14 test3.tar.gz[root@dev131 /root]#

可以看到,新写入的文件和原文件都存储在了磁带上。

磁带的线性存储特性,使得磁带上可以写入两次相同的文件。例如现在test3文件发生了文件大小的变化,再次写入到磁带:
tar rvf /dev/st0 test3.tar.gz

查看文件列表,可以看到磁带上有如下文件:

[root@dev131 /root]# tar tvf /dev/st0-rw-r–r– root/root 320 2006-12-01 09:29:02 test1.tar.gz-rw-r–r– root/root 320 2006-12-01 09:30:14 test2.tar.gz-rw-r–r– root/root 320 2006-12-01 09:44:19 test3.tar.gz-rw-r–r– root/root 67085 2006-12-01 09:44:19 test3.tar.gz[root@dev131 /root]#

这里可看到,磁带上有两个文件同名的文件写入。这个文件的两次备份大小和时间可以相同,也可以不相同。

注意:在磁带上如果相同文件写入了多次,在恢复时候会比较麻烦,需要先将磁带卷至文件所存储的地方,而后读取磁带当前位置所存储的文件,操作较为复杂,速度也比较慢。所以不建议在一盘磁带上写入相同文件名的文件。备份前,最好将备份文件的文件名上加上时间标记,便于查找备份。例如要备份的文件名是test-20061201-0930.tar.gz和test-20061201-0945.tar.gz,则写入到一盘磁带上。如此在执行备份和恢复操作时候,能够更加便利快捷的进行存取操作。

4. 读取数据tar xvf /dev/st0 <要读取的文件名>
读取数据前,首先查看磁带上的内容,获取要恢复的文件名。例如查看后得到如下结果:

[root@dev131 /root]# tar tvf /dev/st0
-rw-r–r– root/root 320 2006-12-01 09:29:02 test1.tar.gz
-rw-r–r– root/root 320 2006-12-01 09:30:14 test2.tar.gz
-rw-r–r– root/root 320 2006-12-01 09:44:19 test3.tar.gz
[root@dev131 /root]#

现在恢复其中的test3.tar.gz文件,执行如下命令:
tar xvf /dev/st0 test3.tar.gz

读取数据后。

[root@dev131 ~]# tar xvf /dev/st0 test3.tar.gz
test3.tar.gz
[root@dev131 ~]#

随后可以在当前的路径下找到从磁带中读取出来的文件:

[root@dev131 ~]# ls -l test3.tar.gz
-rw-r–r– 1 root root 320 Dec 1 11:12 test3.tar.gz
[root@dev131 ~]#

至此恢复操作完成。

通过上文所介绍的tar命令,使用tvf/cvf/rvf/xvf参数,即可实现对磁带的读取、写入操作。使用预先写好的复制数据脚本,配合上磁带机操作命令,并且放置到/etc/crontab中,即可实现自动备份。

Add comment 四月 16th, 2010

从无到有构建deb包

我希望从零开始制作出一个自己的Deb包,意思是连软件的源码都是自己写的,类似于deb from scratch吧,那么这样的一个制作过程大致由三部分构成:
1 源码的编写和测试
2 使用autotools工具生成符合Gnu编程标准的相关文件,如configure,makefile等。
3 按照Debian的方式制作Deb包文件

现在我编写了一个小软件hb-0.01,意思是hyperbolic,是自己写的一个双曲函数和反双曲函数的小软件,总共只有三个文件,在/home/wen1/hb-0.01/目录下,整个制作hb软件的deb包的过程为:

第一步:源码编写
这个步骤由用户自己编写,我的小软件总共只有三个文件,一个是头文件,一个是函数实现的C文件,还有一个主程序C文件,系统显示为:

wen1@lenny:~/hb-0.01$ ls -l
total 12
-rw-r–r– 1 wen1 wen1 140 2008-01-26 15:17 bolic.h
-rw-r–r– 1 wen1 wen1 369 2008-01-26 15:17 boliclib.c
-rw-r–r– 1 wen1 wen1 300 2008-01-26 15:17 hb.c

第二步:使用Autotools工具生成所有符合Gnu编程标准的配置文件等。
这个过程的步骤比较多,具体来说,包括有:
1 使用autoscan命令来生成一个configure的模板文件。系统操作为:

wen1@lenny:~/hb-0.01$ autoscan
wen1@lenny:~/hb-0.01$ ls -l
total 16
-rw-r–r– 1 wen1 wen1 0 2008-01-26 15:25 autoscan.log
-rw-r–r– 1 wen1 wen1 140 2008-01-26 15:17 bolic.h
-rw-r–r– 1 wen1 wen1 369 2008-01-26 15:17 boliclib.c
-rw-r–r– 1 wen1 wen1 484 2008-01-26 15:25 configure.scan
-rw-r–r– 1 wen1 wen1 300 2008-01-26 15:17 hb.c

可以看到现在生成了一个configure.scan文件。

2 将configure.scan文件改名为configure.in,并进行相应的修改,我的是:

AC_PREREQ(2.61)
AC_INIT(hb, 0.01, wenheping@tom.com)
AM_INIT_AUTOMAKE(hb,0.01)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CHECK_FUNCS([sqrt])
AC_OUTPUT(Makefile)

一般来说,这里只有AC_INIT、AC_OUTPUT、AM_INIT_AUTOMAKE三个参数需要根据自己的情况修改一下,其他自动生成的东西不动。

3执行命令aclocal和autoconf,生成configure文件:

wen1@lenny:~/hb-0.01$ aclocal
wen1@lenny:~/hb-0.01$ autoconf
wen1@lenny:~/hb-0.01$ ls -l
total 184
-rw-r–r– 1 wen1 wen1 31848 2008-01-26 15:36 aclocal.m4
drwxr-xr-x 2 wen1 wen1 4096 2008-01-26 15:36 autom4te.cache
-rw-r–r– 1 wen1 wen1 0 2008-01-26 15:25 autoscan.log
-rw-r–r– 1 wen1 wen1 140 2008-01-26 15:17 bolic.h
-rw-r–r– 1 wen1 wen1 369 2008-01-26 15:17 boliclib.c
-rwxr-xr-x 1 wen1 wen1 130126 2008-01-26 15:36 configure
-rw-r–r– 1 wen1 wen1 434 2008-01-26 15:35 configure.in
-rw-r–r– 1 wen1 wen1 300 2008-01-26 15:17 hb.c

可以看到现在生成了configure文件。

4新建Makefile.am文件,再由automake工具根据所写的Makefile.am文件来自动生成Makefile.in文件。
Makefile.am文件一般定义自己的软件最后生成的可执行程序名字、需要连接的库等,我的该文件内容为:

AUTOMAKE_OPTIONS=foreign #
bin_PROGRAMS=hb # 最后生成的可执行文件的名字
hb_SOURCES=hb.c bolic.h boliclib.c # 所有的源码文件
LIBS = -lm # 需要连接math库

然后用automake生成Makefile.in文件,为了符合规范,先:

wen1@lenny:~/hb-0.01$ touch NEWS README AUTHORS ChangeLog

然后的系统显示为:

wen1@lenny:~/hb-0.01$ automake –add-missing
wen1@lenny:~/hb-0.01$ ls
aclocal.m4 bolic.h configure.in INSTALL missing
AUTHORS boliclib.c COPYING install-sh NEWS
autom4te.cache ChangeLog depcomp Makefile.am README
autoscan.log configure hb.c Makefile.in

5执行configure生成Makefile
这一步很简单,生成Makefile之后,还可以使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。

以上的例子很简单,更为复杂的Autotools的运用和Makefile的编写等内容请参照:
http://www.gnu.org/software/autoconf/ (最权威的了)
http://sourceware.org/autobook/ (很详细的一本书)
http://www.lrde.epita.fr/~adl/autotools.html (这个演示文稿做得相当不错)

第三步:生成Deb包。
生成deb包,有两种方法,一种很简单,直接在软件源码目录内运行checkinstall再回答几个简单的问题就可以了,但一般不推荐使用该办法;二是按照Debian的New Maintainer Guide一步一步制作deb包,详细的过程请参照:
http://www.debian.org/doc/maint-guide/

我的制作过程大致为:
1 下载安装必须的软件:
#apt-get install build-essential dpkg-dev dh-make debhelper fakeroot gnupg lintian Linda pbuilder

2 生成tar.gz文件并把该文件移动到源码的父目录:
wen1@lenny:~/hb-0.01$ make dist
wen1@lenny:~/hb-0.01$ mv hb*.gz ../

3运行dh_make命令。

wen1@lenny:~/hb-0.01$ dh_make -e wenheping@tom.com -f ../hb-0.01.tar.gz

运行该命令之后,原来的软件包将会被打包为hb-0.01.orig.tar.gz并放在父目录中,注意文件名中包名称和版本是以_分割的而且tar.gz之前有orig.。

4 修改Makefile、control等文件。
Debian要求可执行文件不能安装在/usr/local目录下,所以然后要检查Makefile文件的相应的安装位置,我的这个小软件本来就是安装在/usr/bin下,所以不用修改Makefile文件。
至于control copyright等文件,如果只是自己做一个自己用的deb包文件,不改也可以,但是如果是为Debian做的准备上传到Debian apt源中的话,就要按照规范认真地填写。

5 生成deb包文件,我是这样的:
wen1@lenny:~/hb-0.01$ ./configure
wen1@lenny:~/hb-0.01$ make
wen1@lenny:~/hb-0.01$ dpkg-buildpackage –rfakeroot

这样,我的hb软件的deb包文件及其他相关文件就生成了—但是生成于源码目录的父目录中。

106 comments 四月 16th, 2010

zssh使用方法

zssh的全名叫ZMODEM SSH.看名字就知道,使用的zmodem,我们习惯了SecureCRT,直接就可以用来发送文件,比使用scp方便很多。

zmodem协议方便主要表示在以下点

其一,不需要输入很长的命令和密码,直接使用rz,sz加文件名,就能实现文件的收发。速度还很快。

其二,在中转了一台主机时,要在目标主机和本地主机之类,要传送文件,scp相当的麻烦,需要输入多次命令用户密码.但sz直接可以穿透。

好了,讲使用,如下,和使用ssh完全一样,只是打命令时,变成了zssh

#zssh root@www.php-oa.com

好了,在进入后,你需要上传文件的话。先
#ctrl+@
>sz filename

下载文件的话

#sz filename
然后在
#ctrl+@
>rz
zssh> exit 回到远程服务器
使用也是相当的方便

52 comments 四月 16th, 2010

Previous Posts


分类目录

 

五月 2012
« 四    
 123456
78910111213
14151617181920
21222324252627
28293031  

标签