Gih's Blog

只言片语
Archive for July 2011

AIX下df 与du 显示不一致问题

2011-07-29 by gihnius, tagged as linux, unix

df命令:通过文件系统中未分配的空间来确定文件系统中已分配空间的大小. 

例如: 如果一个文件系统中有 8192 个512-byte 块, 并且4096 个块没有被分配出去, 那么已分配的空间就是4096 个512-byte 块.已分配空间 = 空间总数 - 未分配空间因为基于文件系统总体来计算, 所以df 命令是报告文件系统空间使用情况最可靠的命令.

du 命令:是面向文件的命令, 它计算分配给指定文件或者目录的空间. du 命令只计算被文件占用的空间, 不计算文件系统metadata 占用的空间, 如inodes, inode maps, 或者disk maps.du 命令只计算那些可以访问的文件所占用的存储空间, 有下面两种情况 du 命令不会计算已经分配给文件的空间.

1. 文件被隐藏了.例如: 如果一个文件存放在 /bobby 目录下, 接着有文件系统安装在 /bobby 目录下, 那么, du 命令将不会计算 /bobby 目录下的文件所占用的存储空间,

2. 文件被其他的应用打开了, 接着文件被删除了. 在这种情况下, 文件所占用的存储空间将维持着被分配的状态直到所有对这个文件的访问都被关闭.由于目录中没有这个文件的相关纪录, du 命令将不会计算这个文件的被分配空间, 然而df 命令将计算这部分已分配的空间.系统中经常会出现上面陈述的第二种情况, 结果是df 显示的比 du 统计的, 可以使用fuser命令查找出"占用空间"的进程:

# fuser -dV /Filesystem 
上述命令会给出进程的工作目录,占用的inode,进程号等相关信息.
# df -m
Filesystem    MB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4       10240.00    600.42   95%    10580     1% /
/dev/hd2        4096.00   2105.22   49%    40503     4% /usr
/dev/hd9var     1024.00    423.75   59%     1125     1% /var
/dev/hd3        4096.00   3668.99   11%      278     1% /tmp
/dev/fwdump      384.00    371.91    4%       17     1% /var/adm/ras/platform
/dev/hd1        1024.00    990.42    4%      489     1% /home
/proc                 -         -    -         -     -  /proc
/dev/hd10opt   30720.00  18911.46   39%    28647     1% /opt
/dev/lv_mms1  555776.00 234959.96   58%    24317     1% /ShareDisks1 

# du -xsm /
18.23   /

# fuser -dV /
/: 
inode=40     size=44           fd=0      290822
inode=40     size=44           fd=0      327928
inode=36     size=16802        fd=0      401642 
上面的情况由于出现在 / 根文件系统, 使用du 时记得加 "-x" 选项, 这样才统计根文件系统所在 LV 的空间使用. 发现多个进程时, 可用 ps 找出具体的程序或脚本, 根据程序或脚本的特点判断是哪个"占用空间"!如果AIX上已安装 lsof , 可用结合使用.

一个人工智能聊天机器人

2011-07-29 by gihnius, tagged as lisp

Alan

听说是 lisp 写的.比较有趣, 有空不妨跟它聊几句!

有用的 AIX 链接

2011-07-28 by gihnius, tagged as aix

网上收集的AIX链接:

AIX书签 有些文件链接可能会失效, google文件名一般还可以找到镜像的. 

欢迎分享! 

欢迎补充!

mksysb时不备份镜像

2011-07-27 by gihnius, tagged as aix

当对已经做 mirror 的rootvg进行 mksysb 时, 备份文件里会保留rootvg的镜像信息. 有时只是克隆系统, 新系统可能只有一块内置盘, 还原时也只能用只备份一块盘的备份文件. 

可以通过配置 /image.data 文件, 让 mksysb 不保留镜像信息.创建 /image.data:

# mkszfile -m 
以上命令新建一个/image.data文件, 编辑:
# vi /image.data 
将每个 lv_data 段的 COPIES= 改为原来的一半, 并且修改 PPs 的数目等于 LPs的. 保存.然后备份系统:
# mksysb /dev/rmt0 
注意这里不能使用 "-i" 参数, 否则mksysb会创建新的/image.data, 覆盖之前创建的那个. 也不建议使用 smitty, smitty 会带 "-i" 参数.使用这个备份映像就可以恢复到单盘rootvg的系统.

smitty hacmp 配置 HA 备忘

2011-07-25 by gihnius, tagged as aix

配置2节点 HA cluster 的smitty配置过程:

准备:参考: HACMP规划的一般步骤步骤:

  • 创建cluster以及节点:
  • # smitty hacmp
    Initialization and Standard Configuration
    Configure an HACMP Cluster and Nodes 
    输入cluster的名字, 根据/etc/hosts的配置, 选择相应的节点.
  • 添加服务ip地址:
  • # smitty hacmp
    Initialization and Standard Configuration
    Configure Resources to Make Highly Available
    Configure Service IP Labels/Addresses
    Add a Service IP Label/Address 
    输入ip 地址以及网络名.
  • 建立资源组:
  • # smitty hacmp
    Initialization and Standard Configuration
    Configure HACMP Resource Groups
    Add a Resource Group 
    输入资源组名称. 习惯上给资源组的名称加上"_rg"方便识别. 同时选上所在的节点. Fallback Policy: 选 "Nerver Fallback", 这样当资源组已经在备节点运行时, 启动主节点就不会自动接管. 主备的次序取决于添加的节点名的次序.
  • 向资源组里添加服务ip地址:
  • # smitty hacmp
    Initialization and Standard Configuration
    Configure HACMP Resource Groups
    Change/Show Resources for a Resource Group (standard) 
    选择之前刚建立的资源组, 添加上服务ip地址.
  • 检验与同步:
  • # smitty hacmp
    Extended Configuration
    Extended Verification and Synchronization 
    结果显示"Ok"就ok. h还可以尝试选上 "Automatically correct errors".
  • 启动 HACMP cluster:
  • # smitty hacmp
    System Management (C-SPOC)
    Manage HACMP Services
    Start Cluster Services 
    选择要启动的节点, 同时启动 clinfo "Cluster Information Daemon".
  • 检查状态:
  • # clstat -ao
    # cldump 
    显示 cluster STABLE 以及节点 Up.扩展: 配置磁盘心跳在节点连接的 SAN 存储上选择一个比较小的 disk (hdisk OR vpath OR hdiskpower). 记下其 PVID.
  • 建立 concurrent VG:
  • # smitty hacmp
    System Management (C-SPOC)
    HACMP Concurrent Logical Volume Management
    Concurrent Volume Groups
    Create a Concurrent Volume Group 
    选择两个节点, 添加刚才选好disk的 PVID, 起一个vg名跟其它vg区别大一点, 比如 heartbeat_vg.
  • 添加磁盘心跳网络:
  • # smitty hacmp
    Extended Configuration
    Extended Topology Configuration
    Configure HACMP Networks
    Add a Network to the HACMP Cluster 
    选择刚才的"heartbeat_vg"为默认网络名.
  • 自动添加相关信息:
  • # smitty hacmp
    Extended Configuration
    Discover HACMP-related Information from Configured Nodes 
  • 添加磁盘:
  • # smitty hacmp
    Extended Configuration
    Extended Topology Configuration
    Configure HACMP Communication Interfaces/Devices
    Add Communication Interfaces/Devices
    Add Discovered Communication Interface and Devices Communication Devices 
    分别在两个节点上选相同的磁盘.
  • 同步配置:
  • # smitty hacmp
    Extended Configuration
    Extended Verification and Synchronization 
    结果显示"Ok"就ok. h还可以尝试选上 "Automatically correct errors".

    HACMP规划的一般步骤 备忘

    2011-07-25 by gihnius, tagged as aix

    简单介绍:

    HACMP初始规划:cluster由哪些结点组成?

    两个结点对于应用而言是什么关系? 

    cluster的名字和结点的名字是什么?

    是否会受到DLPAR的命名限制? 

    每个结点上面放什么应用?

    对于单个结点而言,它是否具备跑多个应用的能力? 

    每个结点有多少张网卡?

    网卡的线是怎样连接到网络上的? 

    IPAT的方式是什么?

    替换(IPAT via replacement)还是别名(IPAT via alias)? 

    当前有哪些IP地址可以使用?

    它们属于哪些网段? 

    结点之间的共享存储如何实现? 

    操作系统的vg用什么方式创建? 

    非TCP/IP网络(点对点网络)用什么方式实现? 

    结点本身的硬件是否实现了冗余性?

    是否存在SPOF? 

    AIX和HACMP的版本分别是多少? 

     接下来是针对各种环境的适应配置: 

    • 硬件规划 
    • 软件规划 
    • 安全性规划 
    • 网络规划 
    • 存储需求 
    • 应用规划 
    • 资源组规划 
    • 测试计划

    PING 应用程序的故事

    2011-07-20 by gihnius, tagged as linux, unix

    偶尔发现这篇文章, The Story of the PING Program . 作者在那里介绍了 ping 的由来. 

    下面是摘文:

    ping 之所以叫 ping, 它的命名的灵感来自于声纳的设计. 在大学的时候我曾经做过一些有关声纳和雷达的建模......

    I named it after the sound that a sonar makes, inspired by the whole principle of echo-location. In college I'd done a lot of modeling of sonar and radar systems, so the "Cyberspace" analogy seemed very apt. It's exactly the same paradigm applied to a new problem domain: ping uses timed IP/ICMP ECHO_REQUEST and ECHO_REPLY packets to probe the "distance" to the target machine. ......

    ping最初为 4.2 BSD 系统设计.伯克利的人们拿走了我对内核的修改和Ping的源代码, 然后成为了伯克利(BSD)发布中的一个标准部分. 因为它是免费的, 所以被移植到了许多的其他系统, 包括MS Windows. ......

    The folks at Berkeley eagerly took back my kernel modifications and the PING source code, and it's been a standard part of Berkeley UNIX ever since. Since it's free, it has been ported to many systems since then, including Microsoft Windows95 and WindowsNT. ......

    在1993年, 也就是我写Ping十年之后, USENIX联合会给了我1993年终身成就奖(the Computer Systems Research Group, University of California at Berkeley 1979-1993.) ...

    In 1993, ten years after I wrote PING, the USENIX association presented me with a handsome scroll, pronouncing me a Joint recipient of The USENIX Association 1993 Lifetime Achievement Award presented to the Computer Systems Research Group, University of California at Berkeley 1979-1993. ``Presented to honor profound intellectual achievement and unparalleled service to our Community. At the behest of CSRG principals we hereby recognize the following individuals and organizations as CSRG participants, contributors and supporters.'' Wow! ...

    摘文完 


    作为系统管理员, 使用ping非常频繁, 我却联想不到它像 雷达 - 声纳. 这本来就是“声纳”。

    从nmon 数据里提取 cpu memory 使用率

    2011-07-19 by gihnius, tagged as aix

    监控主机性能时有个需求, 就是从nmon数据里提取出各个时间点的cpu内存使用率, 以便前端做报告. 使用Perl来干这种事再合适不过了:

    脚本 的使用很简单:

     ./nmon_show_perf.pl *.nmon 
    便输出所有的结果, 保存为 *.nmon_perf.txt.
    #!/usr/bin/env perl
    
    #
    ## Author: gihnius@gmail.com
    #
    
    use warnings;
    use strict;
    
    my @nmons = @ARGV;
    my %month_name = ("JAN"=>1, "FEB"=>2, "MAR"=>3, "APR"=>4, "MAY"=>5, "JUN"=>6, "JUL"=>7, "AUG"=>8, "SEP"=>9, "OCT"=>10, "NOV"=>11, "DEC"=>12);
    
    foreach my $nmon (@nmons) {
        if ($nmon !~ /\.nmon$/) {
            print "$nmon may be not a nmon data!\n";
            next;
        }
        my (@cpu_idle, @mem_used, @month, @day, @hour, @min);
        open (NM,"< $nmon") or die "Can not open $nmon . $!";
        while (<NM>) {
            chomp;
            if (/^CPU_ALL/) {
                my @temp = split/,/;
                if ($temp[1] =~ /T\d+/) {
                    push (@cpu_idle, 100.0 - $temp[5]);
                }
            }
            if (/^MEMNEW/) {
                my @temp = split/,/;
                if ($temp[1] =~ /T\d+/) {
                    push (@mem_used, 100.0 - $temp[5]);
                }
            }
            if (/^ZZZZ/) {
                my @temp = split/,/;
                if ($temp[1] =~ /T\d+/) {
                    if ($temp[2] =~ /(\d\d):(\d\d):\d\d/) {
                        push (@hour, $1);
                        push (@min, $2);
                    }
                    if ($temp[3] =~ /(\d\d)-([A-Z][A-Z][A-Z])-\d+/) {
                        push (@month, $month_name{$2});
                        push (@day, $1);
                    }
                }
            }
        }                           ## end while
        close NM;
        my $len = @cpu_idle;
        $nmon =~ s/\.nmon//;
        my $save_file = $nmon . "_perf.txt";
        if ($len == ($#mem_used + 1) && $len == ($#month + 1) && $len == ($#day + 1) && $len == ($#hour + 1) && $len == ($#min + 1)) {
            open (OUT, ">> $save_file") or die "Can not open $save_file for writing $!";
            for (my $i = 0; $i < $len; $i++) {
                select OUT;
                ##output format: month day time(xx.xx) cpu_perf mem_use
                printf ("%2s\t%2s\t%2s.%2s\t%2.1f\t%2.1f\n", $month[$i], $day[$i], $hour[$i], $min[$i], $cpu_idle[$i], $mem_used[$i]);
            }
            close OUT;
        }
    }
    

    从AIX的 mksysb 备份映像中恢复个别文件

    2011-07-19 by gihnius, tagged as aix

    从映像中查询要恢复的文件路径:

    # restore -T -q -l -f mscp1.mksysb | grep MY_FILE 
    恢复:
    # restore -x -q -f mscp1.mksysb /PATH/TO/MY_FILE 

    FIRMWARE_EVENT 报错

    2011-07-19 by gihnius, tagged as aix

    如果发现 FIRMWARE_EVENT 出现在 errpt 错误日志里, 而且没有相应的 FRU 或 位置码, 这通常可能归因于 AIX 内存页面的 deconfiguration , 就是系统微码检测到内存中存在单个的不可用的内存单元. 这个错误会通过 ECC 处理. 同时会通知系统发现这个错误.

    ECC是"Error Checking and Correcting"的简写, 中文名称是"错误检查和纠正". ECC是一种能够实现“错误检查和纠正”的技术.但AIX发现内存中有不可用的位"bit"时, 就会负责迁移内存中的数据以及释放相关的内存页面. 这个过程由 AIX RAS 功能提供, 在AIX 5.3中开始支持, 内存可自行纠正而不必产生告警或因为一些位错误而需要更换硬件.因此, 可以消除这种 FIRMWARE_EVENT 的错误日志, 执行下面的命令并重启分区使更改生效:

     # chdev -l sys0 -a log_pg_dealloc=false 
    确认更改的状态:
     # lsattr -El sys0 -a log_pg_dealloc