RedHat系统杂谈
对RedHat系统的一些概括性描述.
------------------------
RedHat使用RPM作为软件组织方式, 其启动风格是SYSV的. 我在这里
就我所理解的东东作一个描述.
1. 启动
------
在/etc/rc.d/--有下列目录rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d
init.d
还有下列文件
rc rc.local rc.sysinit
rcn.d (n为1到6) 是对应于不同的runlevel下起不同的服务. 这些目录下都是一些符号连接, 连接到init.d下的一些文件.以S开头的表示要启动, 以K开头的不启动.
第一个字母后面的数值是一个优先级, 这个优先级是用chkconfig来维护的. init.d下的每一个文件都有类似下面的话:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \\
# higher quality random number generation.
看有chkconfig的那一行, 2345表示在runlevel 2 3 4 5下被启动, 20 80 是优先级
20为启动, 80为关闭. 即在rc3.d你可能看到 S20 或 K80. Redhat下的setup也是用
它处理的. 你可以再参考一下man chkconfig. 有一点注意, 优先即是一个两位数.
RedHat下启动网络一定要启动network的服务, 该服务会执行
/etc/sysconfig/network, 并用ifup加载所有的/etc/sysconfig/network-script下定义的网卡. 注意, 在缺省配置中这些定义文件名中不可以有\.\ 象ipforward这样的定义也是在它中完成的. 你可以看看它的源文件. 它还定义了一个重要的变量$NETWORK, 其他的所有网络服务都通过检查该变量来决定是否启动.
另外的三个文件是这样的
先执行rc.sysinit 完成了包括mount分区 激活swap 加载modules等重要的工作.
再执行rc.local 完成一些本地的处理, 缺省情况下, 它几乎什么都没作.
最后是执行rc 启动所有的服务.
2. 文档
------
最常用的是man手册, 在/usr/doc下有一些HOWTO, 和一些软件的文档. 实际上最方便的是info系统, 如果你没用过的话, 执行一下info. 看一看热键的帮助. 里面的文档非常多. 许多的软件的说明文件有多种格式, text-info是很普通的, 特别是在一些大的软件中.
你可以使用 install-info 命令来安装新的text-info文件. 另一种比较通用的格式是SGML,它可以被方便的转化为其他格式的文件 如:html info lyx latex txt rtf.
tex和latex也是一种比较通用的格式, 他们最终被处理成dvi文件来观看.
ps(postscript)使用gv(ghostview)来观看.
pdf 使用xpdf或acroread来看, xpdf的速度要快一些, 但对新的pdf格式不支持.
这三种格式主要是图形格式, 分辨率比较高. 但大部分的说明是纯文本的, 这时, info是最爽的.
3. 关闭
------
halt reboot shutdown Ctrl_Alt_Del这三个命令都完成了那些工作?
它们同属于SysVinit包. reboot是一个连向halt的符号连接.
我这里讲的是RedHat 6.0所带的SysVinit2.74.
先说明几个小问题:
runlevel是从wtmp中找到的. 在启动时, 由init写入.
runlevel 0 是 halt mode,
1 是 single mode or maintenance mode
6 是 reboot mode.
halt(reboot)
如果系统的runlevel不是0或6, halt会exec shutwon -h,
而reboot会exec shutdown -r.
主要的工作都是由shutdown来完成的. halt的参数都被整理后
发到shutdown(exec时的参数).
shutdown
大部分代码用于处理参数等等, 核心工作是由shutdown来完成的.
shutdown主要是调用execv init来修改runlevel. 它也完成
下列工作: warn 系统上的每一个用户. 处理几个文件:
/etc/nologin
/fastboot
/forcefsck
参数-n, 这是, 它自己来完成所有的工作, 而不调用init.
Ctrl-Alt-Del实际上是由init进程直接处理的, 它通知kernel将
Ctrl-Alt-Del信号转化为SIGINT发到它.
4. 口令的长度和加密算法
-------------------
很多人在说Linux使用了DES加密算法, 最多只能用8个字符的口令. 但这是不对的,Linux的认证都是透过pam来作的, 它使用了两种算法 bigcrypt和md5, 前一种支持到128个字符, 后一种是无限长. 事实上在UNIX中只需要一种单向的算法即可, 它并不需要一种可以加密解密的算法. RedHat中用setup来修改级认证机制时, 它只修改了三个文件
/etc/pam.d/login
/etc/pam.d/rlogin
/etc/pam.d/passwd
中的一行:
passwd /lib/security/pam_pwdb.so shadow md5
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pam中的auth并不需要这样的设置, 它会根据crypted passwd中的salt来判断是那一种算法,因此文件中两种算法是可以并存的,
cat /etc/shadow
friday:$1$I92CumQb$I./BJehrqEKIUX9vNmZcL/:10832:0:99999:7:-1:-1:134538420
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
md5以$1$开头, 其salt为$1$I92CumQb$.
5. Shadow 和 Unshadow
---------------------
将当前的passwd状态在两种格式之间转换, 可以用下列命令来完成.
pwconv
unpwdconv
不过, 我实在看不出后者有什么用.
6. make install
---------------
在你安装软件的最后一步往往是make install.
这时, 通常有两种做法:
1. cp execfile /usr/bin/execfile
2. 使用 install 命令 如:
install execfile /usr/bin/execfile
事实上, 后一种更广泛. 它有一些参数可以设定文件的属主, 文件的模
式等.
7. vi 中的颜色
------------
在~/.exrc加入下面一行
syntax on
8. Xemacs 的中文环境
------------------
Emacs使用Mule来处理多国语言.
如果你已经安装好了带Mule的Xemacs. 在你的~/.emacs 加入如下一行.
(setup-chinese-gb-environment)
这样, 每次启动会自动的设制成中文环境.
你可以从Mule->Describe labguage support中来选择一个合适的输入法.
Ctrl-\\ 用于激活或关闭中文输入.
9. ls
-----
ls的颜色: ls --color.
dircolors用于产生一些shell命令, 通常我们这样使用它,
eval `dircolors ~/.dir_colors`
注意, 缺省产生的是bash风格的.
如果, 只想显示目录名而不想列出其下面的文件, 试一下下面的命令
cd \\
ls -d bi*
以\.\开头的文件ls一般不会显示, 用 -a 表示 all.
-h 用加单位的方式来显示文件的大小, 如 1.4K 1.5M等.
-S 按大小排序
-t 按时间排序
如何只显示目录呢? 用下面的包含awk的脚本:
#!/bin/sh
if [ $# -eq 0 ]; then
ls -l --color| grep ^d |awk \{print $NF}\
else
ls $1 -l --color| grep ^d | awk \{print $NF}\
fi
也可以用perl来实现:
#!/usr/bin/perl
open(LS,\"ls -l --color $ARGV[0] |\");
$a = 1;
while($a) {
$a=;
next unless $a=~/^d/;
@a=split(/\\s+/,$a);
print ($a[8],\"\\n\");
};
close(LS);
10. tr
------
tr是Translate的缩写. 它是标准的Unix风格的命令, 简捷而高效.
它通常放在管道中作一些处理, 如:
ls | tr a-z A-Z (注意, 不可加参数 --color)
它从标准输入中都写到标准输出中去, 并可以作下列操作:
1. 转换, 压缩连续的字符串.
2. 压缩连续的字符串.
3. 删除字符.
4. 删除字符, 压缩连续的字符串.
tr [option]... [set1] [set2]
当set1和set2都被设置, 没加-d. 将set1中的字符set2被替换. 如果
set1中的字符有重复的, 以最后一个为准.
如: tr aaa xyz tr和tr a z是一样的.
最常用是大小写的转换
tr a-z A-Z
-d 删除set1中的字符.
-s 压缩set1中的字符.
-d -s 先删除set1中的字符, 再压缩set2中的字符.
11. Dos和Unix下的纯文本格式
------------------------
二者的区别其实很简单, Dos下一行的结束用\\r\\n, 而在Unix中仅使用\\n.
在convert这个rpm包里有两个命令用于格式的转换:
dos2unix filename
unix2dos filename
这个包里还有下面的命令用于文件编码的转换:
gb2big filename
big2gb filename
12. sort
--------
sort这个命令用于排序. 可以从标准输入中读, 也可以从文件中读如:
sort /etc/passwd
cat /etc/passwd | sort
常用的参数:
sort
-c 检查文件是否已经排好序了
-b 去掉前导空白
-f 忽略大小写
-n 按数字来处理, 但不用科学计数法
-(num)n num
-g 使用科学计数法
-t 分隔符
-r 反向排序
-n 表示忽略几个区(用分隔符隔开的)
+4 表示跳过4个区
如: 将当前目录下的文件按大小排序:
ls -l | sort +4
反向排序
ls -l | sort -r +4
13. readline and history
------------------------
一个互交式的程序经常需要读用户的输入, 通常我们使用GNU的readline
库来完成. 同时使用history库来作历史的处理. 这些东东很简单, 知道就会用.
例如:
hist.c
#include
#include
main()
{
char *input;
while ((input = readline(\">>\")) != NULL) {
add_history(input);
printf(\"input : %s\\n\", input);
free(input);
}
}
gcc hist.c -lreadline -lhistory
只有一点要注意, readline返回的东东一定要free掉.
14. static variable
-------------------
许多的glibc的函数会返回一个结构的指针, 那么这些指针指到那里去了呢?
通常他们有下列的结构:
static struct some_structre one;
struct some_strutre *function()
{
........
// some c station
return &one;
}
例如: gethostbyname ctime等通通都是这样. 因此, 下列的用法就是错误的.
struct hostent *host_friday, *host_koun;
host_friday = gethostbyname(\"friday\");
... ...
host_koun = gethostbyname(\"koun\");
... ...
// here is the error
printf(\"%s\", inet_ntoa(*host_friday->h_addr));
// because the pointer host_friday point to info of \"koun\"
15. assert
----------
用于调试程序.
#include
void assert(int expression);
当expression为\假\的时候, 程序被终止运行.
例如:
char *p = malloc(1000);
assert((int)p);
当malloc失败的时候, p = NULL, 这时, 会打印类似下面的信息:
a.out: a.c:9: main: Assertion `p\ failed.
Aborted (core dumped)
这样一来就很方便你调试程序.
对于一个调试完毕的程序, 只要加上
#define NDEBUG
或编译的时候加上如下的参数:
-DNDEBUG
就可以取消assert了.
16. errno
---------
许多的函数在退出的时候, 如果发生错误会置errno.
#include
extern int errno;
对于这个东西, 我想强调两点:
1. 通常如果一个函数工作正常, 它不会去改变errno的值.
2. 在信号处理程序中, 如果有函数调用, 要保留errno的值, 并
在退出的时候恢复.
发布人:netbull 来自:Bricks