瑞星卡卡安全论坛

首页 » 技术交流区 » 系统软件 » =====Linux/Unix 应用宝典=====
安德倚天剑 - 2005-3-17 16:38:00
Linux应用
1.如何获得内核版本号?
2.如何获得glibc的版本号?
3.如何获得Xserver的版本号?
4.如果检测到NIS域,但是home目录不能mount(缺少automounter),我该怎么办?
5.如果网卡安装正常,但是ping不通jumbo等服务器,是什么问题?
6.我如何在本机上设置cups的默认打印机?
7.我试图用grub启动系统时, 出现的信息提示:不能mount引导分区,我该怎么办?
8.我的机器上有cups和lprng,但是我卸载lprng后, cups不能工作了。
9.如何切换consoles?
10.我不能从CD上开始staroffice的安装,出了什么毛病?


1.) 命令为:uname -a

2.) cd /lib; ./libc.so.6

3.) XFree86 -version (debian系统中无效)

4.) 必须创建对应的home目录。例如:mkdir -p /home/fh99191 (适用于NIS user fh99191)。重新登陆后,缺省进入该目录

5.)网关设置错误。网关用于在不同子网间进行路由。多数linux发布版中,该文件为/etc/route.conf。 SuSE 7.2中该文件内容如下: 129.157.138.0 0.0.0.0 255.255.255.0 eth0 default 129.157.138.9 0.0.0.0 eth0

在缺省项之后,你可以发现网关地址。由于不同发行版中该文件的结构不同,没有必要详细描述该文件的细节。

6.)一般来说缺省打印机会设置为cups的系统范围,这个打印机就是所有用户的缺省打印机。如果你要设置 自己的打印机,可以执行:lpoptions -d ,例如:lpoptions -d xm1sof(用于xm1sof打印机)

7.)grub的这个错误信息告诉我们该OS的文件系统未知。缺省直接支持的文件系统是Ext2fs, Reiserfs, Fat16, Fat32, FFS (Fast file system)以及Minix,带有这些文件系统的OS可以直接装载,带有未知文件系统的OS可以用选项chain加载。 这就是说,它们自己的bootlaoder可以引导它们自己。在menu.lst文件中必须加入chainloader +1一行。在linuxfibel可以获取grub的详细信息

8.)cups需要的包很可能在卸载lprng的时候被删除了。为避免冲突,你应该删除printer的所有包。删除完毕后,必须重新安装cups和cups-client的包

9.)你可以按CTRL+ALT+F<2-6>,从X11切换到console。如果你已经在一个console中,按ALT+F<2-6>就可以了。如果你想切换回X11,你可以按ALT+F7,console的编号7就是X11.

10.) 如果你从CD上执行程序,你应该检查,fstab文件中是否有下面一行: /dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0 (/dev/cdrom和/media/cdrom都是SuSE的条目,别的发行版可能会有不同)。 如果缺少该行,程序就无法从CD上执行。


^V^^V^^V^^V^^V^^V^

Fortran,在 Linux 上安家

您的公司除了为过时的小型计算机通常需要的特殊电能和通风付费以外,是否还要为运行旧的Fortran程序所需的软硬件支付繁重的许可证费用和支持费用?如果是的话,那么可以开始试着将那些程序重新部署到Linux服务器上,并了解一下在提高这些应用程序性能或有效性的同时,能砍掉多少那样的费用。

    Linux还主管了许多基于Fortran的新工作(比您可能意识到的还要多)。Linux程序员之间的语言之争通常涉及像Java、Python、C++或甚至C#这样的流行语言。在这种情况下,于二十世纪五十年代末最早发明的 Cobol、Fortran 和 Lisp 这些语言所做的有用工作量可能会出乎您的意料。

    特别是,Fortran已在Linux下找到了快乐的家园。本月的“服务器诊所”概述了您应该了解的在 Linux 上使用 Fortran 的重要性以及如何了解更多信息。

求助于 Linux

    不要认为一谈到Fortran就一定要追溯历史。围绕Fortran开展的行动有很多:国际 J3 委员会起草了新的Fortran2000标准、编译器工程方面已经取得令人瞩目的发展以及每年产生了大量新应用程序。有关 Fortran 的各种消息都暗示Linux在新的开发中所占比例在不断增加;例如,在高性能面向科学的群集上通常都少不了 Fortran和Linux。Linux4chemistry目录,以及科学和工程方面最类似的目录以拥有许多用Fortran编码的程序为特色。程序员对Fortran很熟悉而且Fortran在性能方面优于C,这使它继续受到技术程序员的青睐。

    Linux对旧的应用程序所起的作用虽然不太明显,但经论证更有趣。有一个用Fortran 编码的庞大“骨干”程序累积,其中的一些程序已有长达三十五年的历史了,支持全世界范围的企业和实验室中日常的操作。在某些领域中,与“旧”相关联的只有Y2K泡沫。但是与它相关的远不止这些;成千上万个用Fortran编码的程序在每个工作日都报告财政状况、控制工厂设备、分析实验数据、管理人事记录、切换通信硬件以及执行类似的重要功能。这些程序中的许多在其所担当的角色中都完美地运作着,而且除了运行它们的硬件发生老化以外,并不需要特别更改。例如,Hewlett-Packard的MPE和OpenVMS产品线的退休向客户发出了一个严峻的挑战,因为在过去的几十年中,他们一直依赖这些小型计算机品牌。

    Linux能解救这些问题。服务器级别的Linux机器很可靠,能长时间正常运行,提供了良好的系统服务(包括异构网络中的互操作性),主管各种高质量的Fortran编译器并且很安全(至少可与其它准备向企业提供的系统相比拟)。银行、制造商和政府机构通常为了“整合”,正悄悄地将他们的许多旧程序移到 Linux 上。

    对于这样的迁移,Linux服务器的质量和可用性是让人非常满意的;在我访谈过的组织中,这些项目的结果通常都比预期的好。但是,由于竞争、安全性和通常在法律方面的原因,在我遇到的所有人中,没人愿意“公开发布”访谈。金融公司和制造公司如果透露他们内部过程的细节,不仅得不到任何好处,反而有许多风险。但是,军事计算的相对开放与此形成了鲜明的对比。例如,大家都知道许多武器系统和战役的模拟都是用 Fortran 编写的。英国国防部在 Linux 上主管了 F3 狂风(Tornado)战斗机的分析程序。

    如果您在处理这样的旧应用程序迁移或向正从事Fortran开发的团队提供支持,以下是您应该知道的用于Linux的Fortran参考资料:

大量可用的标准和工具

    流行的各个Linux分发版一般包含GNU项目的免费G77Fortran编译器副本。这个编译器提供了命令行参数,这些参数允许该处理器处理范围很广的Fortran(根据66、77、90和95标准及几种变体编码)。G77 在灵活性和可移植性方面占优,但却以性能为代价,所以良好调优的商业编译器的市场依旧会很繁荣。请注意 G77 通常被安装成名为“f77”的可执行文件,其它几个 Fortran 编译器也是如此。

    甚至在专有编译器和工具之中,也可以免费获得几个,包括一种用于 Linux 的 Intel 7.0Fortran编译器的可下载形式。这个编译器性能极佳,看来它在x86和Itanium级Linux主机上会有光明的未来,因为 Intel 的编译器组整合了曾在 DEC、Compaq 和 HP 确立声誉的工程团队。

    有几家公司提供了各种转换程序。这些工具可能会映射源代码,例如可以将符合F77的源代码映射成F95文本。尽管转换程序在过去一直很重要,但在当前的LinuxFortran用户中,我已经很少碰到依赖它们的用户。只要通过调优他们的Fortran编译器,当前的项目似乎就满足了他们的需求。比使用命令行参数时遇到的难题更棘手的通常涉及专门和专有语言扩展;处理它们需要人类程序员具备熟练的转换技能。不管哪种情况,自动源代码转换程序在当前已没有多少优势。

    其它工具现在似乎更流行。有几种交互式开发环境(IDE)(包括Absoft的ProFortran)可以处理 Fortran。概要分析也是一项成熟的技术,对于重视性能的人很有用。






安德倚天剑 - 2005-3-17 16:40:00
在LinuxShell程序中进行身份验证
一.缘起

Linux系统管理员常常碰到的头痛问题是,在确定系统没有被入侵的前提下,不知道哪个人不小心运行了某个特定用途的Shell程序,把系统搞得一塌糊涂。而且,系统记录显示该人使用的是公用帐号(root或者admin),你无法知道这个人在现实生活中具体对应的是哪一人。

二.开场

针对以上问题,解决方案有二:其一,追查时间和ip,根据时间和ip,可以追查到该人是从哪里出来的。这套解决方案只能确定以某人为首的一群可疑人。if大家都是通过代理连服务器的话,那除了one by one查log之外更无良策了。其二,在Shell程序中通过身份验证记录log,明确责任。

三.求解

本文利用Qmail作者D. J. Bernstein大师编写的checkpassword工具进行身份验证。

1. 下载:
http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz

2. 安装:
tar xvfz checkpassword-0.90.tar.gz
cd checkpassword-0.90
make
make setup check

3. 如果可执行文件checkpassword没有在/bin下出现的话,goto 1

再加上下面这段程序就大功告成了:

--------------------------------
#!/bin/sh
#
# Filename: auth.sh
# Author: hutuworm
# @Copyleft 2003 hutuworm.org
#
function auth_failed () {
echo "你耍我啊?"
exit 1
}
echo "※※※※※※※※※※※"
echo "※猪圈重地 闲人莫入※"
echo "※※※※※※※※※※※"
printf "请输入帐号:"
read ACCOUNT
if [ $ACCOUNT = 'admin' -o $ACCOUNT = 'root' ]
then
echo "本圈不欢迎admin&root!"
exit 1
fi
printf "请输入密码:"
stty -echo
read PASSWORD
stty echo
echo ""
printf "$ACCOUNT\0$PASSWORD\0Y123456\0" | /bin/checkpassword logger "$ACCOUNT used auth.sh" 3<&0 || auth_failed
echo "欢迎光临糊涂馋寺附属斋堂之猪圈! :P"
--------------------------------



四.验收

$ chmod +x auth.sh
$
$ ./auth.sh
※※※※※※※※※※※
※猪圈重地 闲人莫入※
※※※※※※※※※※※
请输入帐号:hutuworm
请输入密码:
你耍我啊?
$
$ ./auth.sh
※※※※※※※※※※※
※猪圈重地 闲人莫入※
※※※※※※※※※※※
请输入帐号:admin
请输入密码:
本圈不欢迎admin&root!
$
$ ./auth.sh
※※※※※※※※※※※
※猪圈重地 闲人莫入※
※※※※※※※※※※※
请输入帐号:hutuworm
请输入密码:
欢迎光临糊涂馋寺附属斋堂之猪圈! :P
$
$ tail -1 /var/log/messages
May 5 13:51:45 hutuworm.org 5月 5 13:51:45 logger: hutuworm used auth.sh

安德倚天剑 - 2005-3-17 16:42:00
Linux应用问答=========!!!!!!!!
桌面


问:我在编译Linux 2.6内核时没编译intel815的显卡驱动模块,是否有办法可以补上?

答:方法很简单,只需运行make menuconfig,选上驱动模块后,再运行make modules和make modules_install即可。

问:系统安装时有三个区,分别挂载了hda9(/)、hda10(/home)和hda5(swap),现在想把/home并到hda9里面去,从而空出hda10,我该怎么做?下面是我的/etc/fstab文件的内容:

LABEL=/ / ext3 defaults 1 1
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda5 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0



是不是只要把有/home那行删掉就可以了?
机器上安装有三个操作系统:Red Hat 9.0(Kernel:2.4 & 2.6.4)、Windows 2000、Windows XP。

答:请按以下步骤进行操作:

#cp -a /home/* /mnt/temp
#umount /home
#mv /mnt/temp/* /home
#fdisk /dev/had



按d删除分区,按10选分区号,即删除hda10。按w使之生效并退出。然后重启用QtParted或PM之类的软件把hda9扩大它。你的fstab有两行应该是这样的:

/dev/hda9 / ext3 defaults 1 1
/dev/hda10 /home ext3 defaults 1 2



问:我不需要最新的内核,只想知道稳定的内核有哪些版本?

答:Linux内核版本号的格式如A.B.C,其中B为偶数的的版本是稳定的版本,并且C越大的越新,相对而言bug越少,越稳定。

问:我本来的系统是Windows 2000,安装Linux后mount上FAT32的分区,里面的文件的所有者都为root。我想把这些文件的属主改为另一个用户,我试过以下的方法,但失败了:
chown 用户名:组名 文件名
我该怎么办呢?

答:原因是你一旦将分区mount 上以后就不可以改了,因此你可以在mount时候指定,比如:
mount -t vfat -o uid=500 /dev/hda1 /mnt/c
更多选项,参见 man mount。

问:我使用的是Red Hat AS 3.0,每次启动时都有Checking for new hardware项,会停留很长时间,不知道怎么把它给关闭了,必竟不是每次都有新的硬件被添加啊?

答:你可以按照以下步骤将其关闭:#setup
打开System Services项,并将其中的kudzu选项勾掉,或者直接运行以下命令即可:#chkconfig kuduz off

问:我的笔记本具体配置如下:
硬盘:5GB
内存:48MB
CPU:奔腾100MHz

没有光驱,开机启动时候只能设置成从C盘启动,或者从软驱启动。有一个网卡和一个红外线接口,现在上面已经有Windows 98了,如果Linux装好的话,Windows 98没有也没有关系的。我就不知道到底能不能够安装Linux?

答:完全可以。但建议找老一点的版本装。相对来说,老版本对硬件要求比较低(比如Red Hat 6.2),可以做启动盘从硬盘安装,也可以从网络安装。一般来说你的网卡应该会被识别的。这样的安装主题网上很多,应该先找一个教程看一看。

问:vi可以编辑一个只读文件吗?如果不可以,如何改变文件的只读属性和其它属性呢?

答:可以用“chmod 777 filename”命令直接将文件的属性改为可读写。

问:升级内核用tar版和rpm版有什么区别,各有什么优点?rpm版的是不是只要rpm -ivh kernel-souce-*.rpm就安装完了?这两种形式装完了以后是不是一样的?用rpm包会不会自动检测我的硬件相应配置内核?

答:*.src.rpm与*.rpm包是两个不同类型的包。后者用rpm命令就安装了;前者用rpm命令是无法安装的,需要用rpm-build等方式安装,所以,它跟*.tar.bz2等解压后make、make install差不多。

问:我用ln -s /home/mysql /var/lib/mysql建立了一个链接,现在想去掉该链接,我该怎么做?

答:只需要使用命令“unlink 链接文件”即可。

问:我安装的是Red Hat 9.0,分了一个交换分区和一个根分区。安装之后发现Linux的根分区被使用的一个字节都不剩,但是我选择安装的软件总计也没超过2GB。不知道这是为什么?

答:编辑你的/etc/syslog.conf文件,将下列所示行的“*”改为none即可:

authpriv.* /var/log/secure

问:如何截取Mplayer的播放界面? 我用PrintScreen键截取的图只能看到桌面上一蓝色框(播放界面)?

答:加上-vo x11选项即可。即mplayer -vo x11 mediafile。

安德倚天剑 - 2005-3-17 16:43:00
问:我用Gaim登录QQ,刚装时可以上去,可是最近登录时总是提示:
to server packet PID:0x0105(login2) is resend for 5 times,maybe something wrong in network,do you wanna resend again?
我上网没有问题,不知道是什么原因?

答:应该是防火墙级别的问题,去掉防火墙试一试。

问:从普通用户切换到root:

   [lgg@lgg lgg]$su
  Password:
  [lgg@lgg lgg]#
  [lgg@lgg lgg]#



只是符号从$变成了#,这是怎么了?

答:使用命令:

   [lgg@lgg lgg]$su -
  Password:
  [root@lgg root]#



问:我可以将ext2转成ext3吗?如果可以,我该怎么办?

答:当然可以。要把ext2文件系统转换成ext3,登录为根用户后键入:/sbin/tune2fs -j /dev/hdbX
在以上命令中,把 /dev/hdb 替换成设备名,把 X 替换成分区号码。
以上命令执行完毕后,请确定把 /etc/fstab 文件中的 ext2 文件系统改成 ext3 文件系统。
如果你要转换根文件系统,你将需要使用一个 initrd 映像(或 RAM 磁盘)来引导。要创建映像,运行 mkinitrd 程序。关于使用 mkinitrd 命令的信息,请键入 man mkinitrd。还请确定你的 GRUB 或 LILO 配置会载入 initrd。
如果更改没有成功,系统仍旧能够引导,只不过文件系统将会被挂载为 ext2 而不是 ext3。

问:用root登录时显示you have a new mail,这是什么意思,怎么看这个newmail?

答:/root下有关Mail的目录,root的邮件就放在那里,看邮件用mail命令。
安德倚天剑 - 2005-3-17 16:43:00
网络


问:如何知道某个程序所使用的端口(如telnet),以及如何更改一个程序要使用的端口?

答:只需直接查看并编辑etc目录下的services文件即可:#vi etc/services

问:我使用的是Red Hat,现在想开启telnet服务,我通过setup里的system serivces选项选上该服务,然后重新启动系统,那我能不能使用chkconfig直接把telnet服务从停止状态切换到开启状态?如果这样可以的话是不是就不用直接重启了?我现在还不太清楚Linux这类服务的运行方式,请讲一讲。谢谢!

答:设置服务在定义的运行级别上开启:#chkconfig telnet on
启动服务:#service telnet start
看到ok就说明可以使用了,如果不放心的话,可以看看进程:#ps -ef | grep telnet
有显示的话就说明已经开启telnet服务了。

问:为什么netstat 出来的protocol都是 Unix ? 比如我在我的机器上的运行结果是:

# netstat
……
Active Unix domain sockets (w/o servers)
Proto RefCnt Flags      Type      State        I-Node Path
Unix  12    [ ]        DGRAM                    1599  /dev/log
Unix  3      [ ]        STREAM    CONNECTED    6502
Unix  3      [ ]        STREAM    CONNECTED    6499  /tmp/.X11-Unix/X0
Unix  3      [ ]        STREAM    CONNECTED    6498
Unix  3      [ ]        STREAM    CONNECTED    6446 
……



难道Linux都使用 Unix socket 吗?

答:这是因为socket最早是在Unix下出现的,所以socket protocol应该算是Unix类的。

问:我的ADSL不能上网,adsl-Status如下:

note:you have emabled demand-connection:adls-status may be inaccurate.
adsl-status:Link is up and running on interface ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.32.70.156 P-t-P:61.235.144.200 mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MLLTICAST MTU:1492 Metric:1
RX packets:8 errors:34 dropped:0 overruns:0 frane:0
TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueue len:3
RX bytes:128(128.0 b) TX bytes:50(50.0 b)



运行ping www.google.com显示不通。运行netstat-r则有如下显示:

# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
61.235.144.200 * 255.255.255.255 UH 0 0 0 ppp0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0



到底是什么原因呀?

答:应该是静态路由的问题。看看你的/etc/sysconfig/network-scripts/ifcfg-eth0文件是怎么写的。如果有GATEWAY=192.168.1.1这行的话要去除掉它。
注意ifcfg- eth0文件中的PEERDNS=yes,另外,/etc/ppp/目录下的(有时要改)chap-secrets文件中的“用户名”、“密码”和pap-secrets文件中的内容要一致。默认的情况下会出现用户名是root而不是你的帐号,所以上不了网。    
安德倚天剑 - 2005-3-17 16:43:00
硬件


问:我的系统配置为:

   CPU:XP 2500+S
  主板:技嘉 GA7N400 nForce 2 ultra 400 芯片
  硬盘:希捷 120GB
  内存:512MB DDR
  显卡:七彩虹 FX5200



系统分区情况为:C为主分区,安装Windows XP。D、E、F为Windows分区,共100GB。剩余20GB一个为Linux SWAP,一个为Linux ext2。
在安装Red Hat 9.0 时不能选择图形界面安装,现象是显示器进入省电模式,硬盘灯无反应,重启后选择文本方式安装,未出现任何问题,安装完成后系统启动检测也未出现问题,但是仍然不能进入图形界面。这是为什么呀?

答:Red Hat和七彩虹 FX5200的显卡有兼容性问题。对于这个问题,现在的办法是在文本界面下先安装最新的驱动,然后再启动X。如果这个还不行的话,只好换发行版了。

问:请问如何显示磁盘信息(例如挂载的硬盘数、硬盘的容量、逻辑分区大小等)?

答:可以通过df命令来显示,如:

# df -a
文件系统 1K-块  已用    可用  已用%挂载点
/dev/hda2  20161204  6931108  1220595637%/
none 0  0    0        -/proc
usbdevfs 0  0    0        -/proc/bus/usb
/dev/hda1 101089  9324    8654610%/boot
none 0  0    0        -/dev/pts
none 159444  0    1594440%/dev/shm



也可以通过以下步骤来查看:

#cd /proc/ide/hda
#ls
cache  capacity  driver  geometry  identify  media  model  settings  smart_thresholds  smart_values
[root@myserver hda]# cat cache capacity geometry model settings
2048
240121728
physical    58853/16/255
logical      14946/255/63
Maxtor 6Y120L0
namevalueminmaxmode
acoustic00 254rw
address002rw….



问:刚开始时把硬盘挂在hdc,后来换成了hda,修改GRUB后能正常进入系统,但在加载交换分区的时候显示:load /dev/hdc...failed...。我想可能需要把交换分区的hdc改成hda才行,可是不知道在哪里改?

答:运行vi /etc/fstab,然后添加以下内容即可。
/dev/hdcx swap swap defaults 0 0

问:在Linux下的集成网卡安装不上,我应该怎么办?机器配置:
nVIDIA GeForce4 MX GPU(显卡芯片),可共享64MB的内存,板载网卡;
MCP nVIDIA MAC + Realtek RTL8201BL PHY。
在Windows XP中上ADSL没问题,但在Linux下没办法激活,信息显示是没有网卡设备,请问是网卡安装问题吗?需要在哪里寻找其Linux的驱动?

答:请到nVIDIA的官方网站上下载源码包然后自己编译即可。注意不要下载rpm安装包,否则问题还是无法解决。

问:我有2个硬盘,各装Windows 2000和Linux,启动Windows的速度很慢,在系统消息里面提示我的一个硬盘出现问题,要我更换设备。如果是装Windows 98没有这样的问题。我想可能是Windows发现系统中有2个硬盘,但不认识ext3分区,所以在那里一直检查,有人说把装有Linux的硬盘在BIOS中隐藏起来,但是隐藏后GRUB就起不来,有没有更好的解决方法?

答:那是你硬盘分区时候存在问题,可以用Windows 98引导盘引导,输入:fdisk /mbr,然后进Windows 2000,将Linux分区重新格式化,然后重新分区,重新安装。

问:我现在对我机器的情况和碰到的问题描述如下:
机器使用的是10GB硬盘,分区结构为C盘:4GB(主分区);D盘:6GB(逻辑分区)。一开始安装的是Windows XP PRO,在Windows XP中运行硬盘分区魔术师,将我的逻辑分区(D盘)删除,重新设置两个分区;一个为ext3,另一个为SWAP。在进行Red Hat 7.2安装时选择手动分区,我看了一下显示的内容:有hda1:NTFS,是Windows XP。hda2里有两个分区:hda5:ext3,Linux主分区;hda6:SWAP,交换分区。
我对hda5进行了编辑,选择挂接点为“/”,然后开始安装,正常结束。重新启动后还是进入到Windows XP,没有出现引导选择菜单。另外,我选择的启动管理程序是LILO,其它一切都是默认,只不过在手动分区时选择将Linux安装在ext3分区上。我想知道如何才能够进入Linux?

答:可以试一试以下的方法:
方法1:重新分区,将ext3分区改为主分区。
方法2:从软盘或Windows XP中启动Linux。
方法3:将LILO、GRUB装到MBR。
安德倚天剑 - 2005-3-17 16:44:00
问:如何使系统在停止操作一段时间后能自动退出?

答:当root账户离开计算机时,出于安全考虑,最好能让系统在隔一段时间后能自动退出。为了能做到这一点,必须为一个“TMOUT”的Linux变量设置指定时间(单位是秒)。编辑“/etc/profile”文件,在有“HISTFILESIZE=”字样的那一行的后面加上“TMOUT=300”,加入的这一行含义是5分钟。当把这行内容放入“/etc/profile”文件后,在系统连续5分钟不用时,系统会自动通知系统中的所有用户系统将退出。root用户也可以把该变量设置放在用户各自的“.bashrc”文件中,使得系统在指定的一段时间不用后能自动退出。该变量参数被设置在系统中后,必须先退出系统,然后再以root帐户重新登录后,该项设置才会生效。

问:如何在Red Hat 7.3上加Simsun.ttc字体?

答:Red Hat 7.3安装时选取简体中文安装,先复制一个simsun.ttc到/usr/X11R6/lib/X11/font/TrueType, 改名为simsun.ttf;然后进入/usr/X11R6/lib/X11/font/TrueType目录下,运行ttmkfdir > fonts.dir命令;接着用vi编辑fonts.dir文件,把有simsun.ttf行修改如下:

simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-ascii-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-iso10646-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gb2312.1980-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-m-0-gb2312.1980-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gbk-0



接着运行cat fonts.dir > fonts.scale命令,修改/etc/X11/XF86config-4, 在Section“Files”加上下面这一行:

FontPath “/usr/X11R6/lib/X11/fonts/TrueType”



最后回到KDE桌面里, 在“开始”→“选项”→“观感”→“字体”,将所有字体改为Simsun。

问:Unicon和Zhcon有什么区别,各有什么作用?

答:Unicon是内核态的中文平台,基于修改Linux FrameBuffer和Virtual Console(fbcon)实现的。由于是在系统底层实现的,所以兼容性极好,可以直接支持gpm鼠标。但是相对比较危险,稍有漏洞就可能会危及系统安全。Zhcon是用户态的中文平台,有点像UCDOS那类。

问:请问该如何卸载tar格式的文件?

答:通常编译过程以后都会用make install这条命令将用户的程序安装到相应路径当中。最保险的方法是查看一下Makefile文件,主要是看install部分,从其中找出tar格式的文件被复制到了什么路径,然后进入相应的目录进行删除即可。

问:SOCKS5启动后,一段时间后就停止了。用命令ps auxw | grep socks5查看后,发现有很多SOCKS defunct进程。请问这是什么原因?

答:主要是打补丁的问题。如果socks5-tar.gz是没打过补丁的版本,必须下一个带补丁的v1.0-r11版本,重新安装、运行问题就可以解决了。

问:我在VMware WorkStation 4.0.5中安装Debian 3.0时,提示找不到硬盘,需要SCSI的驱动。但是我用的是IDE硬盘,请问该怎么办?

答:由于VMware将用户划分的硬盘空间虚拟成SCSI硬盘,而Debian安装盘中没有对应的驱动,而安装其它Linux版本时,有的在一开始会加载SCSI驱动,所以没有这个问题。用户可以修改VMware的配置,将其改为模拟IDE硬盘就可以了。

问:安装完Red Hat后,前面的提示符为root@localhost,可以修改吗?

答:当然可以。在bash中提示符是通过一个环境变量$PS1指定的。用export $PS1查看现在的值,比较直观常用的提示符可以设定为export PS1=“[\u@\h \W]\$”。其中\u代表用户名,\h代表主机名,\W代表当前工作目录的最后一层,如果是普通用户\$则显示$,root用户显示#。

问:在vi中搜索了一个单词,该单词以高亮显示,看起来很不舒服,怎么能将它去掉?

答:在vi的命令模式下输入:nohlsearch就可以了。另外可以在~/.vimrc中写上下面的语句就会有高亮显示:

set hlsearch



加上下面的语句就不会有高亮显示:

set nohlsearch


安德倚天剑 - 2005-3-17 16:44:00
问:如何找出系统中所有的*.cpp、*.h文件呢?

答:用find命令就可以了。不过如果从根目录查找消耗资源较高,使用下面的命令就可以:

# :find / -name "*.cpp" -o -name "*.h"



问:安装Debian需要几张盘就够了?7张盘全部都要下载吗?

答:如果经常有网络环境的话,下载第一张就可以了。要是没有网络环境的话不推荐使用Debian,因为Debian主要依赖网络来更新软件。实在要安装的话,要下载全部7张盘,否则可能会出现需要的软件包找不到的问题。

问:Debian第一张光盘为什么有两个版本?debian-30r1-i386-binary-1.iso和debian-30r1-i386-binary-1_NONUS.iso该下载哪一个版本呢?它们有什么区别?

答:因为含有“non-US”(不属美国)的软件不能合法地存放在架设于美国境内的服务器中。 以前,其原因通常是因为软件含有严密的密码编码,而今天,则是因为程序使用了美国专利保护的演算法。每个人应该取用“non-US”来供私人用途所用;而没有这个标识的iso则只对架设在美国的镜像及供应商才有用处。其它二进制的光盘则不会含有任何“US-sensitive”(与美国相关的)软件,它们和其它种binary-1光盘一样运作得很好。因此,个人使用还是下载debian-30r1-i386-binary-1_NONUS.iso版本。

问:为何我使用umount /mnt/cdrom命令的时候出现device is busy这样的语句,不能umount?

答: 在使用umount的时候一定要确保已退出/mnt/cdrom这个目录,退出这个目录就可以使用umount /mnt/cdrom了。

问:我使用的是笔记本电脑,怎么才能在控制台下显示现在还剩多少电量呢?

答: 使用apm -m就可以看到还有多少分钟了,具体参数可以用man apm查看。

问:如何使用Red Hat自动更新软件包的功能?

答: Red Hat 6.1以后有个命令up2date,能自动检测决定哪些软件包需要更新,然后可以使用up2date-config进行配置。第一次使用up2date时,需要root用户执行rpm-import /usr/share/rhn/RPM-GPG-KEY,然后再运行up2date,它会通过SSL验证,如果用户在安装时提供了正确的注册信息,那么就可以自动升级软件包了。其中升级除kernel外的RPM用up2date -u,升级包括Kernel在内的RPM用up2date -u -f。

问:为什么我进入Linux的终端窗口时,man一条命令出来的都是乱码呢?

答:这是因为你的字符集设置有问题。临时解决办法可以使用export LANG=“en_US”。要想不必每次都修改的话,在/etc/sysconfig/i18n文件里面修改LANG=“en_US”就可以了。也可以针对某个用户来做,这样就可以改变个人的界面语言,而不影响别的用户。命令如下:

#cp /etc/sysconfig/i18n $HOME/.i18n



问:从网上的FTP下载Red Hat光盘的时候,右边有个MD5校验码,我怎么才能知道校验码正确呢?

答:通过命令md5sum filename可以得出校验码,然后和给出的进行对比,查看是否相同就可以了。

问:我需要让Linux下面添加的用户在设置密码时必须大于4位数,怎么设置呢?

答:修改/etc/login.defs文件中的PASS_MIN_LEN(此项用于设置密码的位数)值就可以了。

问:怎么查看一个端口上正在运行什么程序呢?

答: 可以使用lsof命令,比如要查看21端口正在运行什么程序时可以执行下面的命令:

# lsof -i:21

安德倚天剑 - 2005-3-17 16:45:00
问:编译内核的时候出错,提示“Too many open files”,请问怎么处理?

答:这是因为file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*下的init脚本):

# echo "65536"  > /proc/sys/最后进入解压后的目录,运行安装命令。
# cd vmware-linux-tools
# ./install.pl



问:本来装有Linux与Windows XP,一次将Windows XP重装后,发现找不到Linux与Windows XP的启动选单,请问如何解决?

答:首先光盘启动,进入rescue模式,运行GRUB,进入grub提示符grub>,然后敲入下面的语句,重启就好了。

root (hd0,2),setup (hd0)



网络

问:请问用户的IP是动态的,如何在Squid中限定在同一时间内同一账户在线的数量?

答:例如限制单个用户只能打开12个HTTP连接,采用下面的方法:

acl all src 0.0.0.0/0.0.0.0
acl limit maxconn 12
acl localnet src 192.168.0.0/24
http_access deny localnet maxconn
http_access allow localnet
http_access deny all



问:如果我用Squid代理的代理服务器在192.168.1.0这个网段里,例如它的IP是192.168.1.1,我有一些客户端在192.168.2.0这个网段内,怎样设置才能通过这个代理服务器出去?

答:如果不用透明代理,直接在浏览器的代理选项里设置就可以了。否则首先是在代理服务器的网卡上再挂一个IP为192.168.2.1,添加相应的路由,再修改Squid的squid.conf文件里的监听地址和端口等,最后在192.168.2.0网段的客户端设置其网关为192.168.2.1,再直接在浏览器的代理选项里设置一下就可以了。

问:我在Windows中通过FTP传一个文本文件到Linux中,但是打开文本文件后每行最后都有^M的标志。由于很长,用编辑器去除太麻烦,有什么解决办法呢?

答:为了解决这个问题,Linux下专门有两个工具可以互换Windows格式和Linux格式,它们分别是dos2unix和unix2dos。比如用下面的命令就可以将文件名为“filename”文件从Windows格式转换为Linux文本格式。

# dos2unix filename



问:安装了一台Linux服务器,想自己编译内核,一步一步做下来,GRUB也添加进去了,但出现“kernel Panic:VFS:Unable to mount root fs on 0:00”的错误,请问是怎么回事?

答:一般情况下initrd这个文件在台式机上不是必须的,但是在有SCSI设备的服务器上却是必须的。有可能因为编译内核的时候没有产生initrd那个文件,所以会有上面的错误提示。用户可以使用mkinitrd命令来生成一个initrd.img文件,然后加入GRUB,重启试一试。

问:如何设置用户登录后的欢迎信息?

答:修改/etc/motd文件,往里面写入文本,就能使用户通过Telnet正确登录后,执行Shell之前得到相应的提示信息。

motd就是“messages of the day”,也就是当日信息的意思。管理员可以往里面写一些需要注意的事项或通知等来提醒正式用户。

问:如何使用netrc文件进行自动FTP?

答:在自己的home目录下建立一个权限为600,后缀名为.netrc的文件,内容如下:

machine 172.168.15.1 login admin password admin



这样用户以后每次登录FTP服务器172.168.15.1的时候,系统都会帮用户以用户名admin、密码admin登录。用户利用这个特征可以实现自动FTP。例如用户想要每天6:00到172.168.15.1机器上面获得/admin目录下的文件admin.txt,可以按如下方法做。

建立一个文件ftp_cmd,内容如下:

cd admin
get amin.txt
bye



然后使用crontab -e设置定时任务:

0 6 * * * ftp 172.168.15.1 < ftp_cmd

安德倚天剑 - 2005-3-17 16:45:00
问:编译内核的时候出错,提示“Too many open files”,请问怎么处理?

答:这是因为file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*下的init脚本):

# echo "65536"  > /proc/sys/最后进入解压后的目录,运行安装命令。
# cd vmware-linux-tools
# ./install.pl



问:本来装有Linux与Windows XP,一次将Windows XP重装后,发现找不到Linux与Windows XP的启动选单,请问如何解决?

答:首先光盘启动,进入rescue模式,运行GRUB,进入grub提示符grub>,然后敲入下面的语句,重启就好了。

root (hd0,2),setup (hd0)



网络

问:请问用户的IP是动态的,如何在Squid中限定在同一时间内同一账户在线的数量?

答:例如限制单个用户只能打开12个HTTP连接,采用下面的方法:

acl all src 0.0.0.0/0.0.0.0
acl limit maxconn 12
acl localnet src 192.168.0.0/24
http_access deny localnet maxconn
http_access allow localnet
http_access deny all



问:如果我用Squid代理的代理服务器在192.168.1.0这个网段里,例如它的IP是192.168.1.1,我有一些客户端在192.168.2.0这个网段内,怎样设置才能通过这个代理服务器出去?

答:如果不用透明代理,直接在浏览器的代理选项里设置就可以了。否则首先是在代理服务器的网卡上再挂一个IP为192.168.2.1,添加相应的路由,再修改Squid的squid.conf文件里的监听地址和端口等,最后在192.168.2.0网段的客户端设置其网关为192.168.2.1,再直接在浏览器的代理选项里设置一下就可以了。

问:我在Windows中通过FTP传一个文本文件到Linux中,但是打开文本文件后每行最后都有^M的标志。由于很长,用编辑器去除太麻烦,有什么解决办法呢?

答:为了解决这个问题,Linux下专门有两个工具可以互换Windows格式和Linux格式,它们分别是dos2unix和unix2dos。比如用下面的命令就可以将文件名为“filename”文件从Windows格式转换为Linux文本格式。

# dos2unix filename



问:安装了一台Linux服务器,想自己编译内核,一步一步做下来,GRUB也添加进去了,但出现“kernel Panic:VFS:Unable to mount root fs on 0:00”的错误,请问是怎么回事?

答:一般情况下initrd这个文件在台式机上不是必须的,但是在有SCSI设备的服务器上却是必须的。有可能因为编译内核的时候没有产生initrd那个文件,所以会有上面的错误提示。用户可以使用mkinitrd命令来生成一个initrd.img文件,然后加入GRUB,重启试一试。

问:如何设置用户登录后的欢迎信息?

答:修改/etc/motd文件,往里面写入文本,就能使用户通过Telnet正确登录后,执行Shell之前得到相应的提示信息。

motd就是“messages of the day”,也就是当日信息的意思。管理员可以往里面写一些需要注意的事项或通知等来提醒正式用户。

问:如何使用netrc文件进行自动FTP?

答:在自己的home目录下建立一个权限为600,后缀名为.netrc的文件,内容如下:

machine 172.168.15.1 login admin password admin



这样用户以后每次登录FTP服务器172.168.15.1的时候,系统都会帮用户以用户名admin、密码admin登录。用户利用这个特征可以实现自动FTP。例如用户想要每天6:00到172.168.15.1机器上面获得/admin目录下的文件admin.txt,可以按如下方法做。

建立一个文件ftp_cmd,内容如下:

cd admin
get amin.txt
bye



然后使用crontab -e设置定时任务:

0 6 * * * ftp 172.168.15.1 < ftp_cmd

安德倚天剑 - 2005-3-17 16:47:00
升级Linux硬件驱动结构
硬件驱动程序是界于硬件和Linux内核之间的软件接口,是一种低级的、专用于某一硬件的软件组件。这种软件组件可以使硬件与更普遍的高级应用程序接口产生互动。为某一具体的子系统或硬件端口(例如SCSI、USB或PCMCIA)提供支持,不同于为所有SCSI、USB或PCMCIA硬件设备提供支持。由于新的硬件每天都在产生,因此测试每一个可能用于某一具体子系统的硬件是不可能的。内核只为具体的一些子系统提供支持,硬件驱动程序也只是为使用这些子系统具体的某些硬件提供支持。新内核保持高级应用程序接口与低级硬件功能的分离。用户可以通过编写合适的硬件驱动程序或修改内核,更容易地为现有系统增加对新硬件的支持。

    Linux硬件驱动可以通过两种方式集成到内核中:一是将其直接编译进行内核从而一劳永逸;二是将其编写成一种目标格式,在需要添加某种硬件时,内核可以将其调入。当用户对Linux内核进行设置时,每个内核设置编译器都可显示各个可用内核设置变量的描述信息,从而使用户决定哪个变量要被消除,哪个需要写入内核,还有哪个可以编写成一种可加载内核模块。

    直接将硬件驱动程序写入内核优点在于,用户可以随时对它进行调用而无需安装。但是这样大大增加内核占用的空间。将硬件驱动程序编写成一种可加载的内核模块,虽然会因为寻找驱动模块而增加系统资源的占用和运行时间,但是与庞大的内核所消耗的资源相比显得微不足道。将硬件驱动程序编写成一种可加载的内核模块,还可为软件开发提供许多便利。当用户需要对某一硬件驱动程序进行开发或纠错时,用户可以动态地卸载旧的版本并加载新的版本,但是如果用户的驱动程序已写入内核,那么必须对内核进行重新编写,并且每次对修改后的程序进行测试时,都必须重新启动系统。另外,将硬件驱动程序视为可加载的内核模块进行开发和配置,这样用户就可以将硬件驱动程序作为一种独立的系统进行升级,而不必对内核进行改动了。

    用户要做的只是编译并安装可加载内核模块,其它的工作由模块自已来完成。当系统首次访问某一硬件设备时,只要存在使用“depmod”命令建立的模块从属关系树,与之对应的模块就可以自动加载。可加载内核模块通常情况下安装在系统/lib/modules目录的一个子目录下。该子目录的名称由建立内核的Makefile中的VERSION、PATCHLEVEL、SUBLEVEL和EXTRAVERSION等变量的值决定。

    Linux 2.6内核为硬件驱动程序带来一个新的、统一的框架。用户对原本运行于旧版本内核下的硬件驱动程序进行定制。新驱动程序框架通过定义各种接口,为硬件的即插即用和电源管理提供全面支持。子系统可以通过这些接口与各个驱动程序进行通信。新驱动程序框架更加明确了总线和驱动程序之间的责任界限。Linux 2.6内核还引入了sysfs文件系统为每个系统的硬件树进行分级处理。Linux 2.6内核还对可加载内核模块规定了新的命名方法,使用的是.ko扩展名,而不是旧版本标准的.o (object)扩展名。

    这里将重点阐述2.6内核下的硬件驱动程序与以往内核下的硬件驱动程序在主体结构上的不同之处。

    升级硬件驱动程序的基本结构

    Linux 2.4内核下的硬件驱动标准模板如下:

#define MODULE
#include linux/module.h>
#include linux/config.h>
#include linux/init.h>
static int __init name_of_initialization_routine(void) {
    /*
    * code here
    */
}
static void __exit name_of_cleanup_routine(void) {
    /*
    * code here
    */
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);



    旧版本内核下的硬件驱动程序有一个普遍的问题,就是对初始化模块和清除功能的名称进行假设。当开发人员编写旧版本内核下的硬件驱动程序时,如果使用缺省的名称init_module()和cleanup_module(),那么就不需要对初始化模块和清除功能的名称进行记录。这种方法经常会出现错误,已逐渐被淘汰。在2.6内核下,用户必须使用module_init()宏和module_exit()宏对初始化和退出规程的名称进行记录。

    另外,在2.6内核下,用户无论是在源代码中还是在Makefile文件中都不再需要对#define MODULE进行描述。内核搭建系统会自动对此类符号进行定义并校验。当用户为2.6内核编写硬件驱动程序时,必然会用到此类搭建系统。

    要想对已有的模块进行编译,并使之加载到2.6内核,必须首先完成一些基本的结构变化。然而,当用户利用此类结构加载模块时,会注意到在标准输出设备和系统日志上会显示一个坏模块的出错信息。为了消除这条信息,用户需要为MODULE_LICENSE()宏增加一个示例,例如MODULE_LICENSE("GPL")。这种2.4内核以后的版本才引入的宏,可以将模块定义为获得GPL Version 2或更新版本许可的模块。其它有效的值还有"GPL v2"、"GPL and additional rights"、"Dual BSD/GPL"(选择BSD或GPL许可)、"Dual MPL/GPL"(选择Mozilla 或GPL许可)和"Proprietary"。

    2.6内核下硬件驱动程序最简单的类属模板如下:

#include img src="/files/misc/lt.gif">linux/module.h>
#include img src="/files/misc/lt.gif">linux/config.h>
#include img src="/files/misc/lt.gif">linux/init.h>
MODULE_LICENSE("GPL");
static int __init name_of_initialization_routine(void) {
    /* code goes here */
    return 0;
}
static void __exit name_of_cleanup_routine(void) {
    /* code goes here */
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);



    除了硬件驱动自身所需要的变化外,在Linux 2.6内核下,与之相应的最重要的变化是在内核搭建过程中完成的。
安德倚天剑 - 2005-3-17 16:48:00
接第十条
模块搭建过程中的变化

    对于所有开发可加载硬件驱动程序的人来说,对他们影响较大的一个基本变化不是源于内核源代码,而是将外部模块编译过程整合为标准的内核搭建机制。如果用户使用的不是集成开发环境(例如TimeSys公司的TimeStorm,它可以检测内核版本并自动建立Makefile),那么用户需要手工为硬件驱动程序建立Makefile。

    在2.4和更旧版本的内核下,模块的开发和编译位置不受限制,只要将适当的编译标记移到命令行或模块的Makefile中就可以了。这些标记包括两个编译模块时必须的符号定义和一个指针。该指针指向包含有内核所含文件的目录。以下面的语句为例,用户可以建立一个名为testmod.o的可加载内核模块:
    #gcc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4.21/include -O2 -c testmod.c

    为2.6内核搭建模块的过程比较简单,但是要想满足所有成功编译所需要的条件就不那么容易。用户既不需要手工指定以模块为导向的说明(例如MODULE, __KERNEL__等),也不必指定新的符号(如KBUILD_BASENAME和KBUILD_MODNAME等),只要对外部模块植入标准内核搭建系统的过程进行整合就可以了。用户也不必指定诸如-O2之类的选项,因为用户编译的模块与其它可加载内核模块一样,进程会自动调用所有的强制性标志。至于Makefile的编写就简单得多了,例如为testmod.ko模块编写的可与2.6内核兼容的Makefile如下所示:
    obj-m := testmod.o。

    然而,为了建立外部模块,用户必须先完成内核源代码树接口的编写。这样可以建立一些临时目录以供编译时使用。下面是一个为2.6内核构建模块的命令行。它可以从包含模块源代码目录下执行:
    # make -C /usr/src/linux-2.6.1 SUBDIRS=$PWD modules

    此示例命令假设用户的模块源代码和Makefile所在的目录与用户正在运行的命令中的相同。如果用户不使用POSIX命令(例如BASH),那么可以通过“SUBDIRS=`pwd`”命令,用$PWD变量代替SUBDIRS参数。这样用户就可以使用“pwd”命令识别工作目录。建立出口的命令如下所示:

#make: Entering directory `/usr/src/linux-2.6.1'
*** Warning: Overriding SUBDIRS on the command line can cause
***          inconsistencies
make[1]: `arch/i386/kernel/asm-offsets.s' is up to date.
  Building modules, stage 2.
  MODPOST
  CC      /home/wvh/timesys/2.6/testmod/testmod.mod.o
  LD [M]  /home/wvh/timesys/2.6/testmod/testmod.ko
#make: Leaving directory `/usr/src/linux-2.6.1'



    "make"命令的成功完成将产生testmod.ko模块。对该模块的命名使用的是新的内核模块命名规则。如果用户已经对系统的启动程序进行了修改,以便通过名称清楚地加载模块,那么用户需要确定在升级到2.6内核后,这些模块的命名是否遵循了新的命名规则。

    适应2.6内核的内部变化

    Linux 2.6内核还带来了许多内部变化,用户需要改变已有的驱动程序以适应这种变化。这些变化包括内核的异步I/O机理、DMA支持层、存储器与页分配机理、数据块硬件驱动程序和新的类属硬盘接口等。例如,用来分配并管理存储器与页的功能就发生了新的变化。在2.6内核下,系统使用了一种名叫mempool的标准接口。对模块参考计数的使用和管理也发生了变化。模块参考计数主要用于决定一个模块是否正在使用,并对没有被使用的模块进行安全卸载。在2.6内核下,命令序列已被工作序列所代替,其中,对大量不同驱动程序产生影响的一个重要变化是参数模块的新接口。MODULE_PARM()宏已由详细的参数说明所代替。这种说明来源于新的module_param()宏。

    Linux 2.6内核的优先能力和对SMP的识别能力,为驱动程序编写人员带来一些新问题。在单处理机系统中,在无优先能力的Linux内核下,一些驱动程序可以假设在两个处理器间不必再提供重入接口,因为它们无法同时运行驱动程序。驱动程序可以使用“spinlock”或“mutex”命令来保护那些可从多进程访问的数据。这些问题的考虑对于为嵌入式环境(如TimeSys Linux)编写高性能和实时硬件驱动程序的人来说尤为重要。

    其它考虑因素

    如果用户较为依赖Linux 2.6内核的工作,那么还需要对驱动程序做一些其它的改动。例如,尽管自从2.3内核诞生后,devfs文件系统已经被写入内核,并且在2.6内核设置中被标注为舍弃指令,但是它却经常在一些特殊领域中使用。例如在嵌入式计算中, devfs可提供较强的灵活性和一个紧缩的/dev文件名。devfs文件系统是介于hardcoded硬件节点间的中间步骤。此类节点主要用于早期的Linux和Unix系统中。同时,它还是udev、hotplug和sysfs文件系统的综合。对udev的支持技术目前正在被写入Linux 2.6内核。TimeSys公司已经开发出了拥有此类技术的商业Linux系统。如果用户正在使用其它的Linux发行版,那么用户也许会发现devfs支持和集成技术对于驱动程序来说十分重要。

    如果用户想使用devfs文件系统,那么必须首先在搭建内核时激活对它的支持。这一步可以在内核设置编辑程序的File systems→Pseudo filesystems中完成。使用devfs还需要改变硬件驱动程序对硬件节点的识别方法。当用户使用传统的/dev目录作为Linux硬件描述符文件的放置位置时,硬件驱动程序通过启动register_blkdev() 或register_chrdev()函数来注册新硬件。具体使用哪一个,要看驱动程序注册的是一个数据块硬件还是字符硬件,而且必须事先知道硬件的主号码和次号码。另外,因为udev是一个可热插拔程序,它可以自动建立并删除/dev目录下的登录项,所以这一方法同样也适用于新的udev硬件机理。

    使用devfs硬件文件系统时,硬件驱动程序必须使用devfs_register()系统呼叫来注册它们的硬件。驱动程序可以继续使用此前指定的主次编码,也可通过为devfs_register()呼叫指定DEVFS_FL_AUTO_DEVNUM 标志,由devfs自动指定编码。
安德倚天剑 - 2005-3-17 16:49:00
在Linux上快速搭建计数器
对外发布网站会有人不断访问,那么怎么来统计访问网站的人数呢?目前有很多方法,例如流量统计和IP统计等。这里介绍的是计数器(Counter)。通过计数器,网站人员能及时掌握浏览网站的人数。现在互联网上的很多服务器采用的都是Linux操作系统,那么如何在Linux上快速搭建属于自己的计数器呢?

    安装与配置

    在Linux平台上有wwwcount-2.6-3.i386.rpm软件包,可搭建基本的计数器,而且很简单。该软件包的安装和配置方法如下:

    1.首先下载wwwcount-2.6-6.i386.rpm。网址是http://speakeasy.rpmfind.net/linux/RPM/PLD/dists/ra/PLD/i386/PLD/RPMS/wwwcount-2.6-6.i386.html。输入下面的命令:
    #rpm -Uvh wwwcount-2.6-6.i386.rpm

    此时,系统会自动在/var/lib/wwwcount/data目录下打开一个my.dat文件。用户需要设置my.dat文件的权限,并在/var/www/html中打开一个范例文件wc-example.html。用户只要察看wc-example.html文件的源代码,即可将计数器挂上网站。

    2.接着下载wwwcount2.6.tar.gz文件。网址是http://www.muquit.com/muquit/software/Count/Count2.6/Count2.6/download/src/wwwcount2.6.tar.gz。下载完后,就开始安装、设置与使用了。

    3.登录Linux主机,进入/usr/local/src目录,对wwwcount2.6.tar.gz文件进行解压操作。命令如下:
    # cd /usr/local/src
    # tar -zxvf wwwcount2.6.tar.gz

    4.接着开始对刚解压的文件进行设置,可以参见下面的过程:

# ./Count-config  //开始设定
……
◆ cgi-bin dierctory [/usr/local/etc/httpd/cgi-bin]:
/usr/local/apache/cgi-bin  //Apache默认的cgi-bin的目录
……
◆ Base directory [/usr/local/etc/Counter]:
/usr/local/Counter // wwwcount安装的目录
You need to enter the directory of the configuration file.
◆ Config directory [/usr/local/Counter/conf]:  //默认按回车键
You will create this file later by running the program “Gen_conf”.
◆ Name of the configuration file [count.cfg]:  //默认按回车键
You need to enter the directory of the counter data file.
◆ Data directory [/usr/local/Counter/data]:  //默认按回车键
You need to enter the directory of the Log file.
◆ Log directory [/usr/local/Counter/Log]:  //默认按回车键
◆ Name of the log file [Count2.6.log]:    //默认按回车键
You entered:
++++++++++++++++++++++++++++++
CgiBinDir=/usr/local/apache/cgi-bin
……
++++++++++++++++++++++++++++++
Everything looks ok [y|n]? y  //确定以上设置没问题后就按y



    5.接下来输入“./configure”命令,开始一些测试主机情况。

    6.如果想要让计数器每点击一次就增加一个数的话,在Makefile文件中找到“Makefile #COUNT_RELOAD= -DCOUNT_RELOAD=1 ”这行(大约在33行),将注解“#”符号取消,保存后退出。

    7.输入命令“make clean”,然后开始编译可执行文件。

    8.接着使用“./Gen-conf”命令设置主机信息,过程如下:

……
Continue [y|n]? y  //按下y确定
Enter your fully qualified domain name [no default]:
game1.com.cn //需要输入主机名与域名
◆ Enter your IP address [no default]: 221.7.128.164 
◆ Does your host have any nickname [y|n]:
? y  //如果主机有多个名称,那就按y,否则按n
◆ Enter your host's nickname (FQDN) [no default]:
www.game1.com.cn  //如果上面按y,才会出现需要填另一个主机名
◆ Do you want to allow automatic file creation [y|n]
? n  //通常不希望自动产生文件
◆ Do you want the program to run in strict mode [y|n]? y 
◆ Do you want to ignore access hits from your own host [y|n]? y
//用户自己访问,如果想计入其内,就按y。
……



    9.开始进行安装,过程如下:

# ./Count-install
Your configuration:
……
Continue [y|n]? y  //查看上面的设置信息是否正确,正确的话就开始安装
◆ Do you know the user and group id of httpd' child process [y|n]:? y 
◆ Enter user id of httpd's child process [no default]:? nobody 
◆ Enter group id of httpd's child process [no default]:? nobody
//如果用户不清楚,可以在httpd.conf文件中查找相关的设置



    到此,安装就完成了。

    应用

    要使用上面搭建的计数器也很简单,只要在网页文件中的任何地方加入下面代码,就可以显示出计数器图形了:

<img SRC=“http://www.game1.com.cn/cgi-bin/Count.cgi?dd=A&ft=0&sh=T&pad=Y&df=test.dat”>



    其中test.dat文件放在/usr/local/Counter/data目录下,用户可以参照下面对这个文件进行一些操作:

#cd /usr/local/Counter/data
#echo 1 > test.dat
#chown nobody:nobody test.dat
#chmod 644 test.dat

安德倚天剑 - 2005-3-17 16:52:00
建造成本为零的超级计算机
无论是中国还是外国,都有一个“石头汤”的寓言。寓言中讲到一个掉队的士兵来到了一个非常贫穷的村庄,他对村民们说他可以只用一个大锅和一个石头就做出一锅可口的汤。刚开始煮的时候,村民对此非常怀疑,但不久以后就有村民为其提供了一些白菜、几个胡萝卜、一点牛肉……最终,这口大锅里盛满了足以让大家喝饱的汤。这个寓言说明,团结一致在有些时候可以做到一些意想不到的事情。即使我们每个人所做的贡献可能是微不足道,但把这些贡献汇集起来就可以做成一些大事。

Hargrove和Hoffman两位科学家正是利用了寓言所阐述的道理来构建自己的超级计算机。通常,功能强大的计算机可以达到每秒数十亿次的处理能力。大部分超级计算机采用的都是并行处理的技术。它们通常配备有很多功能强大的处理器,用来解决天气预报、原子弹爆炸模拟等复杂的问题。这些超级计算机一般由IBM、SGI等业界巨头生产,其价格也高得惊人,大都需要上千万美元。对于经费紧张的科学研究小组来说,这显然过于昂贵。于是一些实验室和大学里就开始使用廉价的PC来自己构建超级计算机,并且自己编写软件来处理一些非常复杂的问题。

问题的提出

1996年,ORNL(Oak Ridge National Laboratory,美国田纳西州橡树岭国家实验室,http://www.ornl.gov/)的Hargrove和Hoffman在工作中就是遇到了一个问题。他们需要绘制一个美国的生态地图,该地图包含的信息有:气候相同的区域、地形和土壤特征等。为了创建美国大陆的高分辨率地图,需要将国家分成780万个小方格,每个小方格代表一平方公里。而每一个方格中需要考虑的变量多达25个。很显然,PC或者普通的工作站不可能完成这样的任务。也就是说,他们需要一个具有并行处理能力的超级计算机来完成这项工作,但这种计算机的价格已经远远超出他们的承受能力。

最后,他们采取的解决办法是使用ORNL准备丢弃的陈旧计算机和捐赠得来的计算机建造一个计算机集群。该集群被命名为“石头汤计算机(Stone Souper Computer,http://stonesoup.esd.ornl.gov)”。之所以采用这样的名字,是为了表示建造它主要依靠的是各界的捐赠。结果这个由废弃PC组成的超级计算机功能非常强大,它为Hargrove和Hoffman绘制出了高分辨率的生态地图。当时,其它的研究小组更是采用同样的方法设计出了可以和世界上最好的超级计算机相媲美的计算机集群系统。由于具有极佳的性价比,这种方法同样也受到了厂商和公司用户的极大关注。事实上,这种集群的概念为所有的研究组织、学校和企业机构提供了非常强大的处理能力,从而引起了一场观念上的变革。

集群系统的起源

把计算机连接起来提供强大的计算机能力的方法由来已久。早在20世纪50年代,美国空军就建立了一个名为SAGE的网络真空管计算机,用于预防前苏联的核攻击。20世纪80年代中期,DEC公司将其中端VAX小型机整合到了更加大的系统中,并且最终提出了“集群”一词。当时,网络工作站(一般比小型机慢但比PC机快)在研究机构中得到了非常广泛的应用。到20世纪90年代,由于微处理器芯片和以太网设备的价格大幅下降,科学家们开始考虑建造一个PC集群。

而软件的发展也为建造PC集群做好了充分的准备。20世纪80年代,Unix成为了科研领域应用最为广泛的操作系统。不幸的是,该操作系统缺乏在PC上应用的灵活性。1991年,Linux诞生,当时Linus Torvalds将其免费放在Internet上供人下载。在很短的时间里,成千上万的程序员开始为Linux的发展做出贡献。现在Linux已经成为了举世瞩目的操作系统,而它也是建造PC集群的理想操作系统。

第一个PC集群于1994年诞生于NASA戈达德空间飞行中心(NASA Goddard Space Flight Center)。此前,NASA一直在寻找一种廉价的,可以解决地球和太空科学领域里有关计算的一些问题的方案。科学家们需要一台可以达到gigaflops(每秒可以达到10亿次浮点运算,一次浮点运行相当于进行一次加或者乘的简单运算)运行级别的计算机。在当时,能够达到这个运行能力的超级计算机的价格大约是100万美元。这对于从事某一领域研究的科研小组来说实在是太贵了。

当时,一个名叫Sterling的科学家决定自己购买PC然后建造一个集群。Sterling和他在戈达德研究中心的同事Donald J. Becker总共连接起了16个PC。每个PC包含有一个Intel 486处理器,使用的操作系统是Linux,连接设备也是普通的网卡。当时,这个PC集群达到了70megaflops的运算能力,即每秒钟可以进行7千万次浮点运算。虽然从今天的标准来看,这算不了什么,但在当时,这已经达到了一些商业小型超级计算机的运算能力。而当时这个集群只花费了4万美元,只相当于1994年时具有同等计算能力计算机十分之一的价格。

安德倚天剑 - 2005-3-17 16:53:00
接上
NASA的研究人员将他们建造的集群称之为Beowulf(http://www.beowulf.org)。从此以后,这个名字就成为了使用PC的低成本集群系统的代名词。1996年,出现了Beowulf的两个继承者:Hyglac(由加利佛尼亚技术学院和美国Jet Propulsion Laboratory的研究人员建造)和Loki(它由美国的Los Alamos National Laboratory建造)。这两个集群分别使用了16个Intel Pentium Pro 200 CPU,网络为100Mbits/s Fast Ethernet,操作系统采用 Linux,数据传输用 MPI (Message Passing Library) 。它们的性能都达到了1gigaflops,而价格则都低于5万美元。

“石头汤计算机”的构建

看起来,采用Beowulf的方法似乎可以满足Hargrove和Hoffman绘制美国生态地图的要求。因为每一台单一的工作站只能处理几个州的数据,而他们不可能将不同的区域分配给不同的工作站来处理(因为整个国家中每个部分的环境数据都必须同时进行比较和处理)。换句话说,他们需要一个能够进行并行处理的系统。于是,在1996年,Hargrove和Hoffman向自己的上级部门提交了一个申请,准备购买64台包含奔腾2处理器的PC来建一个和Beowulf类似的集群系统。然而,这个计划却没有得到批准。出于无奈,他们决定寻求替代的方案。他们获知美国能源部橡树岭办公室经常会使用一些新的PC来替代旧的PC,而这些旧的PC则会在内部网上作为废弃的设备进行拍卖。而现在就有数百台被废弃的机器等着处理。于是,他们开始在ORNL一个闲置的房间里通过收集废弃的PC来建造“石头汤计算机”。

并行计算系统的设计理念是“各个击破”,也就是并行系统将一个复杂的问题分解成了一些小的任务。然后这些任务被分配到了系统的各个节点(比如Beowulf集群中的PC),而这些节点可以同时处理问题。并行处理的效率在很大程度上取决于所要处理的问题。一个需要考虑的非常重要的因素是各个节点之间以什么样的频率进行中间结果的共享。有些问题必须被分成无数细小的任务,而这些过于细化的分配需要各节点间进行频繁的通信,因此并不适于进行并行计算。与之相比,一些问题可以被分成比较大的子问题,而这些子问题间无需频繁的通信,因而通过并行系统处理起来就要快得多。这样的问题就比较适于使用这种系统来处理。

在构建任何一个Beowulf集群之前,都要对所要构建的系统进行一些设计。连接PC的方法可以选择普通的以太网,也可以选择更加专业快速的网络。由于缺乏预算,Hargrove和Hoffman采用了普通的以太网进行连接,因为这是免费的。他们选择其中一个PC作为前端节点,并且在其中安装了两个网卡。其中一个网卡用于和外面的用户通信,另外一个则和剩下的节点进行通信,而这些节点则通过自己的专有网络进行连接(如图1)。各个PC之间的合作是通过相互之间传送信息来完成的。现在有两种最流行的信息传送方式,其中一种是MPI,它的全称是Message Passing Interface。另一种是PVM,它的全称是Parallel Virtual Machine。MPI和PVM各有各的优点,PVM虽然应用得比较早,但缺少标准化,它比较适用于异种机环境。比较来看,PVM的性能较低,而且它的函数功能不如MPI丰富。MPI不仅提供大量的函数功能,并且它有一个共同遵守的标准受到广泛的支持。MPI的发展也很快。二者都可以免费从网上获得。在“石头汤计算机”的建造中,两种方式都被使用到了。

很多Beowulf集群系统的硬件组成都很一致,也就是说所使用的所有PC的处理器和其它硬件都一样。这种一致简化了集群的管理和使用,但却并不是必须的。“石头汤计算机”就包含了各种处理器,因为它在建造之初的设计就是使用所有可用的设备。刚开始,“石头汤计算机”包含有一些使用Intel 486的机器,接下来,使用的机器至少都是奔腾以上,且内存至少为32MB,硬盘则为200MB以上。

事实上,在建造这个集群系统的过程中,Hargrove和Hoffman发现很少有机器可以满足这种需求,于是他们就将不同PC的比较好的组件组合在一起。

每为集群添加一个节点,他们就为其安装上Linux操作系统。后来他们更是简化了这个过程,使得每一节点的安装过程更加简便。“石头汤计算机”第一次运行是在1997年。到2001年的时候,其所包含的节点已经达到了133个。这其中包含有75个486 PC、53个奔腾机器和5个Compaq公司产的Alpha工作站(如图2和图3)。

对“石头汤计算机”的升级过程非常简单,只需要将其中最慢的节点进行替换即可。作为集群的一个例行任务,每隔一个小时,每一个节点就会进行一次简单的速度测试。测试得到的值将帮助对集群进行调整。与商业机器不一样的是,“石头汤计算机”的性能一直在持续上升,因为它会不断得到来自各方免费赠送的机器对其进行升级。

安德倚天剑 - 2005-3-17 16:53:00
接上
并行处理问题

与设置和装配Beowulf系统的硬件相比,并行程序的开发更需要技巧和创造力,因而也更具有挑战性。Beowulf集群中最常用的程序模式是Master-Slave。这种模式中,一个节点作为Master,它负责指挥与之相关联的一个或者多个Slave。

另外一个挑战是在集群中的PC间实现负载均衡。因为“石头汤计算机”中包含有各种不同速度的处理器,所以不能将工作量进行平均分配(因为这样将导致快的机器长时间等待慢的机器)。解决这个问题的办法是开发一个算法程序,让Master给那些更快完成数据处理的节点传送更多的任务。这样,那些快的PC就可以做更多的工作,而速度慢的机器也可以被充分利用起来。

最终效果

经过一段时间的努力,Hargrove和Hoffman终于使用“石头汤计算机”成功绘制出了完整的美国生态地图。该地图于1999年在波特兰举行的超级计算机年会上在ORNL的展台上展出(如图4)。

除了绘制当前的生态地图外,功能强大的“石头汤计算机”还可以预测出随着全球气候变暖的影响,2099年时美国生态地图的情况。图5显示的就是分别采用两种模型(British Hadley模型和Canadian Climate Centre模型)得出的结果。

小结

据称,“石头汤计算机”的峰值处理能力曾达到过150gigaflops。不过该集群系统的建造者坦言,他们从来没有对该集群系统做过正式的性能测试。他关心的是能够使用该系统来完成他们的工作,不过他们也表示,该系统的理论处理能力应该达到1.2gigaflops左右。

在写本文的时候,“石头汤计算机”集群系统已经在完成了它的使命之后停止了运行。不过作为开放源码应用的一个经典案例,该集群的网站(http://stonesoup.esd.ornl.gov)至今也没有关闭。目的是让我们能够从中得到更多的启示。

就我国而言,集群系统有极其广泛的应用前景,它将促进我国系统集成的发展和自有软件开发和推广。以前一些在大型机运行的国外大型软件都是国外公司与国外计算机生产厂商的紧密合作开发出来的。而我国由于不可能得到一些计算机厂商的底层技术,因此大大限制了国有软件的发展速度及高性能计算的认识水平。现在许多国外大型软件公司都致力将软件移植到PC机系统上,而Linux的发展更是加速了这种更新的步伐。在集群技术日益发展和更新的今天,我们应紧跟国际发展趋势,研究我国的具体应用,开发出更高性能的自有集群系统,普遍提高我国高性能计算水平。

逍遥狂 - 2005-3-17 17:31:00
这软件用得不太习惯
安德倚天剑 - 2005-3-17 17:45:00
这是因为红旗操作系统在中国好像不太流行。
安德倚天剑 - 2005-3-17 19:40:00
linux应用软件谈之远程桌面控制
这里我要说的不是telnet,rsh之类的远程控制工具,而是指远程控制桌面应用.
X window比MS windows先进的地方是,X window是个基于网络的的图形视窗系统,本身就具有远程控制的强大功能.用户在远程系统上登录执行X 应用程序,并将Xclients执行的结果传回本地主机.这就是我下面要介绍的Remote X


一、Remote X
假设本地主机ip为172.16.1.1,远程的主机ip为172.16.1.2

第一步,在本地主机上的任意一个xterm中执行xhost,用来允许远程的其它主机可以和本地主机的X server联网:
xhost + 172.16.1.2
如果不指定任何ip地址,则表示权限完全放开,这会带来安全问题,要小心!

第二步,确认本地主机的xfs是运行的.用ps检查一下进程.

第三步,从本地主机(172.16.1.1)上通过网络登录到远程主机172.16.1.2上,你用telnet,ssh,rsh都可以.设置DISPLAY变量.
export DISPLAY=172.16.1.1:0

第四步,现在可以使用远程主机上的X 应用程序了.

这么样,很方便吧,但是你还不能掌控整个桌面环境,这个工作就交给vnc吧!Remote X 在局域网上运行效果很不错,普通的电话拨号就不用试了,速度太慢了.


二、vnc
我相信有不少人在windows环境用过pcanywhere,但你想不想用一个免费的,可以在linux,win9x/nt上都可以使用的pcanywhere,这就是vnc.
vnc就是vitual network computing的缩写,它支持许多操作平台,甚至可在浏览器中操作.
我主要介绍vncviewer的用法,以及用linux远程控制linux或nt.
vnc client通过架构在tcp/ip上的vnc协议与vnc server沟通,通过认证后,把X server的桌面环境,输入设备,和X 资源交给vncserver掌控,vnc server将桌面环境通过vnc 协议送给vnc client端.让vnc client来操纵vnc server桌面环境和输入设备.
首先下载到vnc的linux版本和windows版本.
当前的linux版本是vnc-3.3.3r1_x86_linux_2.0.tgz
当前的windows版本是vnc-3.3.3r7_x86_win32.zip

1.安装linux版的vnc
(1)安装
tar zxvf vnc-3.3.3r1_x86_linux_2.0.tgz
cd vnc_x86_linux_2.0
cp *vnc* /usr/local/bin/
mkdir /usr/local/vnc
cp -r classes/ /usr/local/vnc/
(2)设置vnc server的访问密码
vncpasswd
(3)启动vnc server
vncserver
注意运行后显示的信息,记下所用的端口号,一般从1开始,因为0被x server占用了.现在,你就能提供vnc服务了.vnc client的用法等会介绍.

2、安装nt版的vnc
1)安装
解开vnc-3.3.3r7_x86_win32.zip包后,会产生winvnc和vncviewer两个目录.winvnc目录中是vnc server的安装程序,vncviewer目录中是vnc client的安装序.我只关心vnc server,在winvnc目录中执行setup即可.
2)设置
首先执行install default registry settings.
run winvnc(app mode)就是执行vnc server
这时可看到winvnc运行的小图标,用鼠标右键点击图标,在properties/incoming connections中设定密码.默认配置即可.
现在,你的nt就能提供vnc服务了.

3、使用vncviewer
vnc server启动成功后,你就可用vncviewer来远程控制桌面了.
vncviewer xxx.xxx.xxx.xxx:display number
例如,vncviewer 172.16.1.2:1
按要求输入密码就可以看到远程的桌面了.
注意:viewers需要在16位色的显示模式下工作,如果您的操作系统中没上16位色,那么请您及时的调整您计算机的显示模式。不然vncviewer无法正常工作。

4、linux版vnc server的改进.
linux上的vnc server内定的桌面管理环境是twm,实在是太简陋了.
修改$HOME/.vnc/xstartup这个文件.
把所有内容的行前加上#,再在接尾部份加上:
startkde &
你当然可用你喜好的桌面代替.我这是用kde来代替twm,速度会慢少少,但用起来方便不少.
注意要重新启动vnc server.

5、通过浏览器使用vnc
通过浏览器使用vnc,要注意端口号的变化.
假设vnc server是172.16.1.2:1的话,那么,可用浏览器访问http://172.16.1.2:5801
端口号=display number + 5800
好了,心动不如行动,just do it !


安德倚天剑 - 2005-3-17 19:40:00
Linux下的硬盘提速方案


  目前很多朋友都用上了大容量的DMA或UDMA-33标准的硬盘。在微软的Windows98下为了使得DMA或UDMA-33标准的硬盘提高数据传输速率,可以在计算机的CMOS或操作系统中打开IDE硬盘的DMA(直接存储器存取)这项功能。但是在Linux平台中,Linux是不会自动的打开DMA模式,所以在Linux中使用这些IDE接口的UDMA-33标准的硬盘感觉数据传输远远没有在Windows中快。事实上,Linux平台中也可以通过软件来打开DMA模式,以下就是Linux下的硬盘提速的具体做法。


  首先,在Linux下打开DMA模式之前,最重要的事情就是备份硬盘上的数据。因为在开启DMA模式之后谁也无法预料到硬盘是否还能正常工作,数据是否还完整。把Linux下所有的重要数据备份到其他硬盘或是CD-R等存储媒介上是最好的选择,请不要把数据备份在同一块硬盘上,更不能把数据备份到同一个硬盘分区。
第二步需要修改hdparm目录下的一些设备节点参数。但是修改这些参数必须以超级用户(ROOT)的身份登陆Linux系统才行。普通Linux用户没有这个权限修改hdparm目录下的东西。下面就是一个修改硬盘设备节点参数的例子,注意,不同型号,不同容量的硬盘可能列出的参数不太一样,但是修改的过程和方法大体上是一样的。

# /sbin/hdparm /dev/hda
/dev/hda:
multcount = 0 (off)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 629/240/63, sectors = 9514260, start = 0
#

  要注意的是,OFF代表此参数不起作用,ON表示打开此功能或模式。上面的参数列表写的非常清楚,Multcount(多扇区读) 没有打开;此硬盘格式为16位格式;DMA数据传输模式没有打开。很显然,这样的参数并没有使硬盘达到最佳的优化,没有能完全发挥当今高速IDE硬盘的性能。
为了优化硬盘,提高硬盘的数据传输速率,首先还是要了解以下这些参数的含义:

c3 :就是把硬盘的16位格式转换为32位模式。
m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘一次读入16个扇区的数据。但是不是所有的硬盘都支持这个功能。使用hdparm -i /dev/hda 可以察看您的硬盘最大能读写的扇区数目。
d1X34 在支持DMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
d1X66 在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
  了解以上参数的作用和含义之后,现在请您仔细检查硬盘上面上的标签,看看您的硬盘是否支持DMA 或者 UDMA模式,然后才对照这些参数来优化您的硬盘,以防出现不可预见的错误。
优化硬盘的参数,也可以参考下面的例子,注意,不是所有的硬盘都适用一下的优化参数,请按照实际情况来设置参数:


# hdparm -d1X66 -m16 -c3 /dev/hda
# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
I/O support = 3 (32-bit w/sync)
unmaskirq = 0 (off)
using_dma = 1 (on)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 629/240/63, sectors = 9514260, start = 0

  修改完这些参数之后,有时候并不能一次性把硬盘优化成功。如果在硬盘还在正常工作的时候修改这些数据,硬盘会进入“休眠”状态。这就需要等硬盘灯会熄灭,硬盘不处于繁忙状态下优化硬盘参数比较容易成功。

  hdparm的改变是一个临时的状态,下次再次启动Linux系统的时候hdparm将会消失。所以要想永久的保存修改后的信息,就必须把修改后的参数和数据写入/etc/rc.d/rc.local或者/etc/rc.local文件,甚至比启动过程要早运行的程序中。

  最后要提醒大家的是,如果您的主板的芯片组或Linux内核kernel(比如内核kernel版本过于陈旧,2.2版以前)如果不支持UDMA模式,那就没有必要去修改硬盘设备的参数了。升级主板或者kernel是解决这个问题的较好选择。

安德倚天剑 - 2005-3-17 19:42:00
实现自动登录Linux
开机自动登录linux,并自动运行X window应用程序,有其特殊的应用背景,如基于linux平台的监控系统,linux启动后不需要身份验证,而直接运行监控程序等等。本文以Redhat7.2为平台,结合linux启动过程,介绍了如何避免身份验证自动登录,并直接进入X window自动运行应用程序。

一、linux启动的最后阶段的工作

linux 在启动过程的最后阶段(具体启动步骤略),init 会根据 /etc/inittab文件的最后一行x:5:respawn:/etc/X11/prefdm -nodaemon运行/etc/X11/prefdm脚本,(Red hat 7.2缺省时是这样的)。prefdm脚本的主要任务是完成X window的启动,可以有几种启动X window的方法,都包含在prefdm脚本中,几种主要方法有:

运行xdm启动X window;
运行gdm,进入gnome桌面环境;
运行kdm进入kde桌面环境;
自动登录进入linux;

prefdm脚本框架大致如下:


#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
. /etc/profile.d/lang.sh
# 第一步:查看是否为自动登录
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
if /usr/sbin/autologin; then
exit 0
fi
fi
# 第二步:如果不是自动登录方式,就会在/etc/sysconfig/desktop中搜寻用户偏爱的登录方式
......
# 可以是kdm、gdm以及xdm,并运行相应的kdm、gdm以及xdm。
......




二、自动登录的实现(autologin的实现)

在/etc/X11/prefdm脚本中,是否实现自动登录有一个条件测试开关,事实上,可以在这里注释掉测试开关,直接执行启动X window的操作。

自动登录实质上就是绕过身份验证,直接启动X window。X window的启动可以由xinit来完成。

Xinit用来启动X window系统服务器以及系统上的第一个客户程序,可以通过为xinit传递命令行参数的形式指定要启动的服务器及客户程序。如果不传递参数给xinit,它将在用户的根目录下寻找并运行 .xinitrc脚本来启动客户程序;在用户的根目录下寻找并运行 .xserverrc脚本来启动服务器。如果xinit在用户的根目录下找不到.xinitrc、.xserverrc,xinit将使用缺省的X :0。
实际上,用startx来启动X更为方便。对于运行单一会话的X window 系统,startx提供了更为良好的用户接口。同样,startx首先在用户的根目录下寻找 .xinitrc及.xserverrc脚本,如果找不到这两个脚本,startx将使用/etc/X11/xinit/xinitrc以及/etc/X11/xinit/xserverrc脚本。
startx脚本的最基本框架是:

a、 寻找.xinitrc,如果没有则使用xinitrc;
b、 寻找.xserverrc,如果没有则使用xserverrc;
c、 根据找到的脚本确定xinit的参数;

由此可看出,startx在不需要传递任何参数的情况下,可以完成启动X的任务,因此,可以如下修改/etc/X11/prefdm脚本来实现自动登录:


#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
. /etc/profile.d/lang.sh
# 第一步:查看是否为自动登录
#if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
#注释掉上边的条件测试,直接运行startx
if /usr/X11R6/bin/startx; then
exit 0
fi
#fi




当然,应确保/etc/inittab中的启动级别为5。


重新启动系统,会发现系统不验证用户身份,直接进入X window,此时的用户身份为root。但是,如果原来root有自己的桌面、默认shell时,上述方法启动X不一定保证还能拥有原来的设置。为了在启动X后,在避免验证身份的同时,又不改变用户原来的设置,那么在运行startx之前,还有工作要做。


安德倚天剑 - 2005-3-17 19:43:00
接上
三、自动登录后,保持用户原来的配置(桌面、shell以及其它的一些环境变量)。

观察原来/etc/X11/prefdm脚本的自动登录部分:


......
# 第一步:查看是否为自动登录
if [ -f /etc/sysconfig/autologin -a -x /usr/sbin/autologin ]; then
if /usr/sbin/autologin; then
exit 0
fi
fi
......




不难看出,脚本中保留了自动登录的接口:一个可执行文件/usr/sbin/autologin以及一个配置文件/etc/sysconfig/autologin。

1、/etc/sysconfig/autologin配置文件的实现:


#config for autologin
USER=root
EXEC=/usr/X11R6/bin/startx
说明,USER指定自动登录时的用户名;EXEC指定启动X要运行的程序。





2、/usr/sbin/autologin可执行文件的实现:


/*********************
****  autologin.c  ****
*********************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
int main(int argc, char **argv)
{
struct stat st;
FILE *f;
char *cfg;
struct passwd *pw;
uid_t uid;
gid_t gid;
char *dir, *shell;
char *user=NULL;
char *cmd=NULL;
user="root";
/*为了能说明问题又保持程序简洁,这里默认登录用户为root,实际上,
登陆用户名应该从/etc/sysconfig/autologin中得到,
程序实现时要注意过滤掉/etc/sysconfig/autologin中的无效用户名*/
cmd="/usr/X11R6/bin/startx";
/*同样,这里直接指定启动X window的程序,实际上,该程序应该从/etc/sysconfig/autologin中得到*/
pw = getpwnam(user);
//getpwnam返回包含用户信息的passwd结构(该结构在pwd.h中定义)。
if(pw) {
uid=pw->pw_uid;
gid=pw->pw_gid;dir=strdup(pw->pw_dir);
shell=strdup(pw->pw_shell);
}
//获得用户相关信息
else {
printf("ERROR: No such user %s!\n", user);
return 1;
}
chown("/dev/console", uid, gid);
chown("/dev/tty", uid, gid);
//为控制台和终端设置用户ID及组ID

//下面是设置用户相关ID
setregid(gid, gid);
setegid(gid);
setgid(gid);
setreuid(uid, uid);
seteuid(uid);
setuid(uid);
setenv("HOME", dir, 1);
setenv("SHELL", shell, 1);
setenv("USER", user, 1);
setenv("LOGNAME", user, 1);
//设置用户相关环境变量
chdir(dir);
//切换到用户根目录
user=NULL;
execvp(cmd, argv);
/*在配置完用户的相关信息后,执行启动X window操作。注意这里默认执行/usr/X11R6/bin/startx */
printf("ERROR: Couldn't exec %s: %s\n", cmd, strerror(errno));
return 2;
}




运行gcc -o autologin autologin.c,拷贝autologin可执行文件到/usr/sbin/autologin,拷贝autologin配置文件到/etc/sysconfig/autologin。 重新启动系统,会直接进入X window并保留用户原来所有的风格。


如果不需要自动登录的配置文件/etc/sysconfig/autologin,所有的操作都在/usr/sbin/autologin以默认的方式实现(比如,默认登录身份为root,默认执行操作为/usr/X11R6/bin/startx等),那么,/etc/X11/prefdm脚本的自动登录部分可简化如下:


......
# 第一步:查看是否为自动登录
if /usr/sbin/autologin; then
exit 0
fi
//第二步......
......




即在脚本中去掉条件测试开关,直接执行/usr/sbin/autologin,这时,只需要拷贝autologin可执行文件到/usr/sbin/autologin,不再需要拷贝autologin配置文件到/etc/sysconfig/autologin。

四、选择进入kde或者gnome,并自动启动X window应用程序

如果重新启动后系统进入了kde,而用户需要进入gnome,只需运行switchdesk gnome在重新启动系统即可,以后每次启动时会自动进入gnome;反之亦然。
一般系统自动登录的目的是启动X window 后自动运行某个X window程序。如果系统默认的启动级别为3,那么如果要在系统启动后自动运行某些应用程序,只需要在某些脚本中加入相应命令即可,不再详述。在X window启动后自动运行应用程序要复杂一些,幸好,kde和gnome都为此留下了自动启动接口。如果在kde桌面环境下自动启动应用程序,只需要把应用程序名字加入/root/.kde/Autostart/目录下即可(这里注意不同用户的根目录可能不同,如用户zyx的根目录可能为/home/zyx)。如果在gnome桌面环境下自动启动应用程序,只需把应用程序的名字加入/主菜单/程序/设置/会话/会话特性及启动程序的startup programs属性页中即可。
安德倚天剑 - 2005-3-17 19:43:00
对光驱、软驱实现AutoMount
软件环境:Redhat Linux 6.0
目 的:在使用Linux的过程中,我们经常需要使用光盘和软盘,每次使用时都要mount,用完还要umount非常麻烦,可以使这些工作变得自动化。

实现方法:

1. 安装完Redhat Linux 6.0之后,运行ntsysv,选中服务后台程序autofs.autofs的两个配置文件在/etc/auto.misc 和 /etc/auto.master

2. /etc/auto.master定义了mount目录和mount所需的配置文件名及其空闲时自动umount的时间。 下面是默认配置。

[jephe@sh3 /etc]$ more auto.master
/misc /etc/auto.misc --timeout 60

3. 下面是我的/etc/auto.misc配置文件:

[jephe@sh3 /etc]$ more auto.misc
cdrom -fstype=iso9660,ro :/dev/cdrom
floppy -fstype=vfat :/dev/fd0
e2floppy -fstype=ext2 :/dev/fd0

注:
a.确保/dev/cdrom作为符号链接指向你的光驱所在的分区,作为我的情况:

[jephe@sh3 /dev]$ ls cdrom -l
lrwxrwxrwx 1 root root 3 Aug 26 08:44 cdrom -> hdd

b.当软盘为windows 95格化化的vfat分区类型时,设定了安装目录/misc/floppy
c.当软盘为Linux格式化过的ext2分区类型时,设定了安装目录/misc/e2floppy

4. 至此,若还未启动autofs,则运行/etc/rc.d/init.d/autofs start, 若对上述两个文件中做过任何更改,运行/etc/rc.d/init.d/autofs restart即可。

5. 放入一片光盘进入光驱后,不需任何动作,直接进入目录/misc/cdrom,autofs 将自动先为你mount光驱同样,若放入一张vfat格式的软盘,你可以
cd /misc/floppy,
若是ext2格式的软盘,则cd /misc/e2floppy. 在超过一分钟未使用它们,且当前目录不是自动mount目录/misc/cdrom,/misc/floppy,/misc/e2floppy,系统将自动umount它们。


安德倚天剑 - 2005-3-17 19:44:00
Linux下面光盘刻录
在linux下刻盘分四部曲:

1.编译内核(依系统情况可以略过).
2.加载相应驱动模块.
3.制作iso9660文件系统的映象文件
4.刻盘

缺省情况下,你的linux内核或许不支持SCSI设备,而现在的刻录机却许多接在一个scsi卡上的.因此,在这种情况下,需要从新编译内核,让它支持SCSI设备,并且要根据SCSI卡所采用的芯片,将其编译到内核或编译成模块.此外,为方便测试将要刻录的映象文件,还应该编译时在块设备里面选择支持"LOOPBACK DEVICE SUPPORT".最后,还要选择"SCSI generic support",将其编译成模块,这专门是为支持这种连接在一块SCSI卡上的刻录机刻录时用的.

然后,重新启动系统,启动过程中会检测SCSI设备,因为检测的特别快,可能看不清. 没有关系,登录后用"dmesg"命令来看系统查到了什么东西,比如屏幕上打印了这么一块信息:

sym53c8xx: at PCI bus 0, device 9, function 0
sym53c8xx: setting PCI_COMMAND_PARITY...(fix-up)

sym53c8xx: 53c810a detected
sym53c810a-0: rev=0x23, base=0xe6000000, io_port=0xe400, irq=11
sym53c810a-0: ID 7, Fast-10, Parity Checking
sym53c810a-0: restart (scsi reset).
scsi0 : sym53c8xx - version 1.3c
scsi : 1 host.
Vendor: MATSHITA Model: CD-R CW-7502 Rev: 4.17
Type: CD-ROM ANSI SCSI revision: 02

当然了,这是在我的系统启动时打印的信息,如果你没有看到类似的信息,说明你没有把SCSI卡所用芯片编译到内核或在系统启动时没有把自动加载相应的驱动模块(通过配制/etc/conf.modules在启动时加载相应模块).这时候,你可以手工加载模块.当模块加载到系统中后,就应该出现以上类似的信息了.在我用的SCSI卡上采用的芯片BIOS是"SYMBIOS 53C810AE",因此在编译内核时选择了"SYM53C8XX SCSI SUPPORT",并把它编译成模块.下面简单介绍一下以上信息:

首先它显示在PCI插槽上发现了SCSI卡,紧接着,发现了SCSI卡上连接的设备,它的ID号是7,在scsi0上.

当找到设备后,剩下的事情就简单了,现在需要找的就是一些制作ISO映象程序刻录时用的软件.我用的软件是cdrecord,软件很不错,本身可以在SCSI卡上检测所连接设备,也支持multi-session刻录(允许你一次刻不完下次再刻).制作ISO映象文件用的是mkisofs这个程序,一般的linux都带这个包,在redhat中包的名字和文件的名字一样.

假如我有一个整理好待刻的目录,里面有一堆很好的收藏.我首先把用下面的命令作成一个ISO格式的映象文件(这并不是刻录,只是在硬盘上按1:1的比例将要刻的东西作并不是刻录,只是在硬盘上按1:1的比例将要刻的东西作成一个映象):

mkisofs -r -o cd_image my_private/

"-r"指明将所有的文件属性变成对所有人是可读属性的,"-o"是输出, my_private是要刻东西所在的目录.

作完映象文件后,可以检测它是否正确,此时要加载曾经编译的loop模块,将此映象文件作为一个文件系统"mount"上来.

mount -t iso9660 -o ro,loop=/dev/loop0 cd_image /mnt/cdrom

进入/mnt/cdrom就可以查看文件是否正确.主意的是,用mkisofs可以制作带光盘启动的映象,这要通过"-b"参数,"-b"后面紧接着的是可以启动的内核文件,它的大小是有限制的,必须是1.2或1.44或2.88MB,它的路径也是相对于my_private目录而言的.

最后一步,"天下无盘",你可别刻费了吆.:-) 现在就开始真正动手了.用下载来的刻录软件进行刻录.

这里只对cdrecord进行简略介绍,还有一些图形界面的刻录工具,各位就自己找吧.关于cdrecord可以在 http://hkt.linuxberg.com这个网站找到.用

cdrecord -scanbus

可以显示出下列类似信息:

Cdrecord release 1.6.1 Copyright (C) 1995-1998 J鲵g Schilling
scsibus0:
        0) *
        1) *
        2) *
        3) *
        3) *
        4) *
        5) *
        6) 'MATSHITA' 'CD-R CW-7502 ' '4.17' Removable CD-ROM

ID号为7的一个刻录机找到,下面开始了.

cdrecord -v speed=2 dev=6,0 cd_image

"speed=2"指明刻盘速度为2倍速, "dev=6,0"指明关于刻录设备的一些信息,完整的形式是"dev=devicename:scsibus,target,lun",我们这里只有一个接在SCSI卡上的设备, 因此只些了简略形式"dev=target,lun",其中devicename是CD-R所对应的设备名,SCSIBUS是SCSI总线号,TARGET就是刚才检测出来的第六项,LUN指的是SCSI设备的逻辑单元号,一般的SCSI设备只支持一个LUN.
安德倚天剑 - 2005-3-17 19:46:00
安装完全解决方案
Qmail_setup-v1.5.tar.gz改进版本Qmail_setup-v1.5.2.tar.gz提供下载,全面支持MYSQL数据库,使得能容纳几十万的用户数据。包内还另付非常详细的设置说明,中英文皆有。
http://www.edge-china.com/~lhg/Qmail_setup-v1.5.2.tar.gz


该包目前有的功能
1、Qmail帐号与系统帐号的分离。
2、Qmail邮件列表功能。
3、Qmail自动回复功能。
4、邮件帐号WEB管理方式。
5、邮件的WEB使用方式,如:WEB发邮件,查看邮件。
6、能任意调整WEB的CGI以及HTML路径。
7、选择性安装apache。
8、SMTP服务的密码验证功能,能有效的防止别人利用自己的服务器发送匿名信。
9、选择性安装webmail。
10、对虚拟域的支持。
11、增加对Linux系统的支持,安装过程中自动的判断系统进行安装。
12、增加qmail的管理脚本,安装后可以运行qmail start|stop|restart来管理qmail。
13、全面支持Mysql数据库,只要在SQL设置区里打开数据库的支持,并设置好数据库密码,就可
以支持数据库了。

安装方法:
1、用编辑器编辑setup文件,设置变量,如:
DomainName,CGI路径,HTML路径。MAIL管理员密码等。
2、设置文件"setup"文件为755。
  chmod 755 install
3、运行setup进行安装。
  ./setup
4、等待安装完毕......

该包对以前版本的比较。
1、解决了以前版本不能用WEB修改密码的问题。
2、解决了SMTP发信无密码验证问题。
3、新加setup文件的高级设置,如果你觉得有些东西有必要修改就可以在高级设置里修改。
比如:对邮件用户邮件大小的限额、是否支持漫游,等高级设置。
4、因考虑到有些情况不必要用到webmail或想使用更好的WEBMAIL,所以增加了WEBMAIL安装
的可选择性。
5、解决了以前不支持Linux系统的问题,能自动判断FreeBSD和Linux系统来进行安装。
6、使用了最新版本的apache。
7、增加qmail的管理脚本,使得qmail的管理更加方便。
8、对数据库的支持,并且是可选择性的。
安德倚天剑 - 2005-3-17 19:48:00
删除具有特殊文件名的文件
假设Linux系统中有一个文件名叫“-ee”,如果我们想对它进行操作,例如要删除它,按照一般的删除方法在命令行中输入rm -ee命令,界面会提示我们是“无效选项”(invalid option),原来由于文件名的第一个字符为“-”,Linux把文件名当作选项了,我们可以使用“--”符号来解决这个问题,输入“rm -- -ee”命令便可顺利删除名为“-ee”的文件。如果是其他特殊字符的话可以在特殊字符前加一个“”符号,或者用双引号把整个文件名括起来。
安德倚天剑 - 2005-3-17 19:48:00
linux环境下的"蚂蚁"-wget使用简介
wget的使用形式是:
wget [参数列表] URL
首先来介绍一下wget的主要参数:
· -b:让wget在后台运行,记录文件写在当前目录下"wget-log"文件中;
· -t [nuber of times]:尝试次数,当wget无法与服务器建立连接时,尝试连接多少次
。比如"-t
120"表示尝试120次。当这一项为"0"的时候,指定尝试无穷多次直到连接成功为止,这个
设置非常有用,当对方服务器突然关机或者网络突然中断的时候,可以在恢复正常后继续
下载没有传完的文件;
· -c:断点续传,这也是个非常有用的设置,特别当下载比较大的文件的时候,如果中
途意外中断,那么连接恢复的时候会从上次没传完的地方接着传,而不是又从头开始,使
用这一项需要远程服务器也支持断点续传,一般来讲,基于UNIX/Linux的Web/FTP服务器
都支持断点续传;
· -T [number of seconds]:超时时间,指定多长时间远程服务器没有响应就中断连接
,开始下一次尝试。比如"-T
120"表示如果120秒以后远程服务器没有发过来数据,就重新尝试连接。如果网络速度比
较快,这个时间可以设置的短些,相反,可以设置的长一些,一般最多不超过900,通常
也不少于60,一般设置在120左右比较合适;
· -w [number of seconds]:在两次尝试之间等待多少秒,比如"-w 100"表示两次尝试
之间等待100秒;
· -Y on/off:通过/不通过代理服务器进行连接;
· -Q [byetes]:限制下载文件的总大小最多不能超过多少,比如"-Q2k"表示不能超过2K
字节,"-Q3m"表示最多不能超过3M字节,如果数字后面什么都不加,就表示是以字节为单
位,比如"-Q200"表示最多不能超过200字节;
· -nd:不下载目录结构,把从服务器所有指定目录下载的文件都堆到当前目录里;
· -x:与"-nd"设置刚好相反,创建完整的目录结构,例如"wget -nd
http://www.gnu.org"将创建在当前目录下创建"www.gnu.org"子目录,然后按照服务器
实际的目录结构一级一级建下去,直到所有的文件都传完为止;
· -nH:不创建以目标主机域名为目录名的目录,将目标主机的目录结构直接下到当前目
录下;
· --http-user=username
· --http-passwd=password:如果Web服务器需要指定用户名和口令,用这两项来设定;
· --proxy-user=username
· --proxy-passwd=password:如果代理服务器需要输入用户名和口令,使用这两个选项

· -r:在本机建立服务器端目录结构;
· -l [depth]:下载远程服务器目录结构的深度,例如"-l 5"下载目录深度小于或者等
于5以内的目录结构或者文件;
· -m:做站点镜像时的选项,如果你想做一个站点的镜像,使用这个选项,它将自动设
定其他合适的选项以便于站点镜像;
· -np:只下载目标站点指定目录及其子目录的内容。这也是一个非常有用的选项,我们
假设某个人的个人主页里面有一个指向这个站点其他人个人主页的连接,而我们只想下载
这个人的个人主页,如果不设置这个选项,甚至--有可能把整个站点给抓下来,这显然是
我们通常不希望的;
ü 如何设定wget所使用的代理服务器
wget可以使用用户设置文件".wgetrc"来读取很多设置,我们这里主要利用这个文件来是
设置代理服务器。使用者用什么用户登录,那么什么用户主目录下的".wgetrc"文件就起
作用。例如,"root"用户如果想使用".wgetrc"来设置代理服务器,"/root/.wgert"就起
作用,下面给出一个".wge
trc"文件的内容,读者可以参照这个例子来编写自己的"wgetrc"文件:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
这两行的含义是,代理服务器IP地址为:111.111.111.111,端口号为:80。第一行指定
HTTP协议所使用的代理服务器,第二行指定FTP协议所使用的代理服务器。
安德倚天剑 - 2005-3-17 19:50:00
Linux开机过程的分析
这篇文章的目的,在将linuxkernel的boot部份做一个介绍,因为笔者觉得很少有这样的文章介绍一个作业系统最最开始的一步--把kernel本身载入至内存中,同时进行一些机器相关(machinedependent)的初始化工作,由于linux刚好使用的是大家最熟悉的386,486系列PC,所以在说明其程序流程时,也刚好可以对其相关的PC硬体架构做探讨,可以说是一举两得,不过,我必须假设读者对于组合语言及PC最基础的架构,如寄存器,分段,分页,中断服务等有大概的认识。
   读者可在linuxsourcecode的/boot子目录下找到几个以.S作为副档名的组合语言档,本文要说明的即是其中的bootsect.S及setup.S两个档案,及尽量简单的说明其所牵涉的相关硬体部份。
bootsect.S
  这个程序是linuxkernel的第一个程序,包括了linux自己的bootstrap程序,但是在说明这个程序前,必须先说明一般IBMPC开机时的动作(此处的开机是指"打开PC的电源"):
  一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROMBIOS中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个jump指令,jump到另一个位于ROMBIOS中的位置,开始执行一系列的动作,包括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试码(systemtestcode)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。
  紧接着系统测试码之后,控制权会转移给ROM中的启动程序(ROMbootstraproutine),这个程序会将磁盘上的零道零扇区读入内存中(这就是一般所谓的bootsector,如果你曾接触过电脑病毒,就大概听过它的大名),至于被读到内存的哪里呢?--绝对位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机磁盘的bootsector上的正是linux的bootsect程序,也就是说,bootsect是第一个被读入内存中并执行的程序。现在,我们可以开始来看看到底bootsect做了什么。

第一步
  首先,bootsect将它"自己"从被ROMBIOS载入的绝对地址0x7C00处搬到0x90000处,然后利用一个jmpi(jumpindirectly)的指令,跳到新位置的jmpi的下一行去执行,关键的assemblycode如下:
.
(搬移bootsect本身)
.
.
jmpigo,INITSEC
go:
.
.
.
  表示将跳到CS为0x9000,IP为offset"go"的位置(CS:IP=0x9000:offsetgo),其中INITSEC=0x9000定义于程序开头的部份,而go这个label则恰好是下一行指令所在的位置。
第二步
  接着,将其它segmentregisters包括DS,ES,SS都指向0x9000这个位置,与CS看齐。另外将SP及DX指向一任意位移地址(offset),这个地址等一下会用来存放磁盘参数表(diskpara-metertable)
  提到磁盘参数表,就必须提到BIOS中断1Eh。先简单的介绍一下BIOS的中断服务:80x86将内存最低的256*4byte保留给256个中断向量(每个interruptvector大小为4byte,所以一共有256*4=1024byte),而其中的第1Eh个向量指向"磁盘参数表",这个表会告诉电脑如何去读取磁盘机,而我们所要做的事是搬移磁盘参数表到刚才所设定的任意地址。
  接着,改变搬移来的参数表的参数,以符合我们的需要。再将中断向量1Eh指向我们所修改过的磁盘参数表,然后呼叫BIOSinterrupt的int13h(function0,即AH=0)重置磁盘控制卡及磁盘驱动器,之后磁盘机就会照我们的意思动作了。如果你曾trace过DOS的kernel,你会发现,上述的动作在DOS中也有类似的对应流程。
现在让我们来看看关键的程序码:.
.
.
push#0
popfs
movbx,#0x78
.
(使GS:SI=FS:BX,指向磁盘参数表,
再将GS:SI所指地址的内容搬移6个
word至ES:DI所指的地址)
.
.
  此段程序是将FS:BX调整成0000:0078,接着再将GS:SI的内容设成与FS:BX相同,此处0x78h即为int1Eh的起始位置(7*16+8=120,(1*16+14)*4=120)。调整ES:DI为刚才所设定的任意地址,从GS:SI搬移6个word(即12byte)到ES:DI所指的位置,显然磁盘参数表的长度就是6个word,(不过事实上,磁盘参数表的确实长度是11个byte)。关于磁盘参数表,有兴趣的读者可自行参阅讲述BIOSinterruptservices的技术手册,会有详细的说明。
  读者可以用debug自行观察自家机器上DOS的磁盘参数表的起始位置(即int1Eh的内容)。以下是笔者机器的情形(笔者使用的作业系统是MSDOS6.2):
C:>debug
-d0000:0000
0000:00008A101601F4067000-1600CB04F4067000......p.......p.
0000:0010F40670000301790E-43EB00F0EBEA00F0..p...y.C.......
0000:002004108E340C118E34-5700CB046F00CB04...4...4W...o...
0000:00308700CB0408079433-B700CB04F4067000.......3......p.
0000:00400C01790E4DF800F0-41F800F0BA165F06..y.M...A....._.
0000:005039E700F01B01790E-70118E341201790E9.....y.p..4..y.
0000:006000E000F085175F06-6EFE00F0EE067000......_.n.....p.
0000:007053FF00F0A4F000F0-220500003E4600C0S......."...>F..
^^^^^^^^
由上图中可知,在DOS中磁盘参数表的起始位置(int1Eh的内容)为0000:0522。接着观察DOS中位置0000:0522开始的11个byte,也就是磁盘参数表的内容
C:>debug
-d0000:0520l10
0000:05204D53DF022502121B-FF54F60F08000000MS..%....T......
^^^^^^^^^^^^^^^^^^^^^^
此11byte即为磁盘参数表的内容(分别是byte00h到0Ah)
  在程序中我们所更动的是第五个byte(byte04h),改为18h(在上图例子中为12h),这个byte的功能是定义磁轨上一个磁区的资料笔数。关键的程序码如下:
.
movb4(di),*18
.
 
第叁步
  接着利用BIOS中断服务int13h的第0号功能,重置磁盘控制器,使得刚才的设定发挥功能。
.
.
xorah,ah
xordl,dl
int0x13
.
.
第四步
  完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup程序,也就是以后将会介绍的setup.S,此读入动作是利用BIOS中断服务int13h的第2号功能。setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存中紧邻着bootsect所在的位置。待setup的image读入内存后,利用BIOS中断服务int13h的第8号功能读取目前磁盘机的参数。
第五步
  再来,就要读入真正linux的kernel了,也就是你可以在linux的根目录下看到的"vmlinuz"。在读入前,将会先呼叫BIOS中断服务int10h的第3号功能,读取游标位置,之后再呼叫BIOS中断服务int10h的第13h号功能,在萤幕上输出字符串"Loading",这个字符串在bootlinux时都会首先被看到,相信大家应该觉得很眼熟吧。
  linux的kernel将会被读入至内存绝对地址0x10000处,键关的程序码如下:
.
.
movax,#SYSSEG
moves,ax
callread_it
callkill_motor
.
.
  其中SYSSEG于程序开头时定义为0x1000,先将ES内容设为0x1000,接着在read_it这个子程序便以ES为目的地的节地址,将kernel读入内存中,至于read_it子程序的详细内容笔者并不想一一介绍,不过聪明的读者们应该已经猜到,read_it一定又利用了BIOSint13h与磁盘有关的I/O中断服务了。
  至于kill_motor子程序,它的功能在于停止软盘机的马达(各位聪明的读者会不会觉得这个子程序的名称取得颇为传神呢?),其程序码如下:
.
.
kill_motor:
pushdx
movdx,#0x3f2
xoral,al
outb
popdx
ret
.
.
  首先利用DX指定要输出的port,而03f2这个port则是代表了软盘控制器(floppydiskcontroller)的所在,再利用outb将资料送出,而我们送出的资料,当然就是归零过的AL了。如此一来,软盘的马达就停止了。
第六步
  接下来做的事是检查rootdevice,之后就仿照一开始的方法,利用indirectjump跳至刚刚已读入的setup部份,程序码如下:
.
.
jmpi0,SETYPSEG
  其中SETUPSEG已在先前定义为0x9020,所以CS:IP会设定为9020:0000,即跳到绝对地址为0x90200,也就是setup的起点。而bootsect也大功告成了。
到此为止,内存的内容应该如下图所示:
比较
  把大家所熟知的MSDOS与linux的开机部份做个粗浅的比较,MSDOS由位于磁盘上bootsector的boot程序负责把IO.SYS载入内存中,而IO.SYS则负有把DOS的kernel--MSDOS.SYS载入内存的重责大任。而linux则是由位于bootsector的bootsect程序负责把setup及linux的kernel载入内存中,再将控制权交给setup。
至于setup.S就不讨论了。
安德倚天剑 - 2005-3-17 19:54:00
在linux的电脑,安装windows2000
首先,你需要重新安装LILO。打开/etc/lilo.conf文件,找到boot=/dev/hda行,把hda改为linux所在分区(比如linux安在第一块硬盘的第二分区,那么就改成hda2,余类推),保存改动,执行lilo命令。用mkbootdisk命令制作一张启动盘(多做几张,以备不测)。在执行 dd if=/dev/hda2 of=/tmp/bootsect.lnx bs=512 count=1; mcopy /tmp/bootsect.lnx a: (软区里要有一张用DOS格过的软盘),取出软盘,插入win98启动盘。重新启动计算机,用win98启动盘进入DOS,执行fdisk/mbr命令。取出软盘,重新启动计算机,应该显示缺少系统盘。插入win2000光盘,重启机子,安装吧。安好后,将bootsect.lnx文件拷到C盘跟目录下,编辑c:\boot.ini文件(是隐藏的和只读的,需要去掉该属性),增加一行 c:\bootsect.lnx="LINUX" 保存,重启机子,应该能选择进哪个系统了吧。
安德倚天剑 - 2005-3-17 19:58:00
Red Flag Linux硬件兼容列表
http://www.redflag-linux.com/ppd/product_user/hardware_table.php

12
查看完整版本: =====Linux/Unix 应用宝典=====