当前位置:Linux教程 - RedHat - RedHat系统杂谈

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