Gih's Blog

只言片语
Archive for June 2011

扩大AIX的(errpt)error log空间

2011-06-17 by gihnius, tagged as aix

默认的AIX error log空间比较小,如果报错很多,早前的就会被覆盖.

列出当前的error log属性:

#/usr/lib/errdemon -l
Error Log Attributes
--------------------------------------------
Log File                /var/adm/ras/errlog
Log Size                491520 bytes
Memory Buffer Size      32768 bytes
Duplicate Removal       true
Duplicate Interval      10000 milliseconds
Duplicate Error Maximum 1000 
当前值太小了,480KB,远远不够. 我要把它扩大为 48MB.
#/usr/lib/errdemon -s 50331648 
再确认:
#/usr/lib/errdemon -l
Error Log Attributes
--------------------------------------------
Log File                /var/adm/ras/errlog
Log Size                50331648 bytes
Memory Buffer Size      32768 bytes
Duplicate Removal       true
Duplicate Interval      10000 milliseconds
Duplicate Error Maximum 1000 
Memory Buffer Size通常都够用, 但不排除有些报错日志包含很多信息(比如自动diag的信息),这时系统会报出类似以下的错误:
syserrlg       ERROR LOGGING BUFFER OVERFLOW 
可以通过
#/usr/lib/errdemon -B BufferSize 
来修改Memory Buffer Size的值. 注意的是,BufferSize 必须是存储页大小(4KB)的整数倍.

删除AIX中的多重默认路由

2011-06-15 by gihnius, tagged as aix

很少人会在明知己有默认路由后还继续添加默认路由, 多重默认路由会造成系统来回轮询而影响性能. 这种情况多数是有一些脚本包含了添加默认路由的命令: route add 0 xxx.xxx.xxx.xxx. 所以平时执行脚本前要搞清楚脚本会产生哪些行为. 尽可能保证你 do 的还能够 undo !.

多重路由可在 netstat -nr 里看到, 多个 default 的路由表. 也可以在 ODM里看:

# odmget -q "attribute=route" CuAt

CuAt:
        name = "inet0"
        attribute = "route"
        value = "net,-hopcount,0,,,,,,-static,0,172.11.2.1"
        type = "R"
        generic = "DU"
        rep = "s"
        nls_index = 0

CuAt:
        name = "inet0"
        attribute = "route"
        value = "net,-hopcount,0,,,,,,-static,172.11.12.4,172.11.9.1"
        type = "R"
        generic = "DU"
        rep = "s"
        nls_index = 0

CuAt:
        name = "inet0"
        attribute = "route"
        value = "net,-hopcount,0,,0,172.11.2.1"
        type = "R"
        generic = "DU"
        rep = "s"
        nls_index = 0

CuAt:
        name = "inet0"
        attribute = "route"
        value = "net,-hopcount,0,,0,172.11.2.1"
        type = "R"
        generic = "DU"
        rep = "s"
        nls_index = 0 
类似这样的
"net,-hopcount,0,,0,172.11.2.1"
才是默认路由, 这和 lsattr -El inet0 看到的应该是一样的. 上面最后两个就是重复了的默认路由.删除多余的路由表:
chdev -l inet0 -a delroute="net,-hopcount,0,,0,172.11.2.1"
可以用
odmget -q "attribute=route" CuAt
再次确认.

AIX中删除网卡的地址

2011-06-15 by gihnius, tagged as aix

很多人删除ip地址都是用 ifconfig + rmdev. 不过我觉得 rmdev 就太折腾了.

可以使用chdev更改网卡接口的属性. ip地址,网络掩码,网卡状态等都是属性:

# chdev -l en0 -a state=down
en0 changed
# chdev -l en0 -a netaddr=''
en0 changed
# chdev -l en0 -a netmask=''
en0 changed
# 
# lsattr -El en0
alias4                      IPv4 Alias including Subnet Mask           True
alias6                      IPv6 Alias including Prefix Length         True
arp           on            Address Resolution Protocol (ARP)          True
authority                   Authorized Users                           True
broadcast                   Broadcast Address                          True
mtu           1500          Maximum IP Packet Size for This Device     True
netaddr                     Internet Address                           True
netaddr6                    IPv6 Internet Address                      True
netmask                     Subnet Mask                                True
prefixlen                   Prefix Length for IPv6 Internet Address    True
remmtu        576           Maximum IP Packet Size for REMOTE Networks True
rfc1323                     Enable/Disable TCP RFC 1323 Window Scaling True
security      none          Security Level                             True
state         down          Current Interface Status                   True
tcp_mssdflt                 Set TCP Maximum Segment Size               True
tcp_nodelay                 Enable/Disable TCP_NODELAY Option          True
tcp_recvspace               Set Socket Buffer Space for Receiving      True
tcp_sendspace               Set Socket Buffer Space for Sending        True
# 

RMS真逗:比尔盖茨的慈善理念是想让学生迷上Windows,以赚到更多钱!

2011-06-15 by gihnius, tagged as windows

这个观点看上去真的很逗.该消息还揭示了另一个问题,"自由"逐渐被淡化,取而代之的是"开源".

之前曾有报道RMS攻击盖茨、微软及其慈善基金会, 也有其他人有类似的观点. 对比尔盖茨的慈善理念,我想RMS也并不是出于恶意, 至于实际情况,肯定十分复杂; 他提出应当禁止微软的不正当竞争行为,反软件专利, 也是出于RMS对自由软件的关心和切望, 而且他这份心意是献给全人类的. 他真正去身体力行"科技是无国界的",科技是全人类的. 而专利恰恰是反人类的,阻碍人类社会发展进步的."自由软件"从一开始就很流行,自从RMS推广他的思想,"Free"深入人心. 不过几年后,不见"Free"了,到处都是"OpenSources", 这不是说有什么不好,因为绝大部分"OpenSource"还是"Free"的. 但两者还是有区别的, 具体可以参考: GNU

  • 自由软件:
  • 根据自由软件基金会的定义,自由软件的源代码和文档,可以不受限制地自由使用,复制,研究,修改,以及分发.这方面的不受限制正是自由软件最重要的本质, 与自由软件相对的是非自由软件"proprietary software",也常被称为私有软件,封闭软件"其定义与是否收取费用无关",它们的源代码是不可见的,比如windows操作系统和其上的许多软件.
  • 开源软件:
  • 简单地认为就是:开放了源代码的软件.自由软件是一种要求软件自由的文化现象,是一种哲理,伦理和社会价值观,而开源软件是一种开发模式.

    重新设置AIX用户密码的"最后更新"时间,避免过期

    2011-06-14 by gihnius, tagged as aix

    因为有一大批机器使用脚本自动登录主机执行命令,而每台主机都设置了密码过期的属性.懒得改密码,干脆直接更新密码的 lastupdate 属性.

    该属性登记在/etc/security/passwd里:

    adm:
        password = *
    
    informix:
        password = CLqVIRDs0/klU
        lastupdate = 1288948843
        flags =
    
    sms:
        password = bvpeLs2b3QfZQ
        lastupdate = 1071988131
        flags =
    
    tellin:
        password = D7xh0wTaRiTzw
        lastupdate = 1295440751
        flags = 
    lastupdate的值是一个用秒表示的时间. 可以用以下命令修改:
    chsec -f /etc/security/passwd -s username -a lastupdate=`perl -e 'print time'` 
    当然,这样 maxage就形同虚设了,即等于
    chuser maxage=0 username
    如果你的帐号比较重要,权限较大,建议还是老老实实修改密码吧!

    批量部署crontab

    2011-06-13 by gihnius, tagged as linux, unix

    标题起得太牵强了,其实crontab没有什么要批量的. 只是工作中要在n台机器上部署相同的后台作业.开始还以为要一台一台登录进去跑

    crontab -e
    . 在没有发现crontab这一用法前,还真觉得这差事太离谱啦!
    原来crontab可以直接把一个文件了的cron table install到crontab里面.
    crontab file
    这里file的内容将完全代替crontab已有的内容,即执行
    crontab file
    后, 用
    crontab -l
    看到的与
    cat file
    看到的是一样的. 所以执行前要先备份之前的crontab.
    ## 备份
    crontab -l > cron.bak
    cat cron.bak > file
    ## 编辑 file, 添加新的crontab条目.
    echo '* * * * * /new_crontab' >> file
    ...
    ## 把file里的cron table install到用户的 crontab中.
    crontab file
    ## -l 确认
    crontab -l
    以前没这样用过,还是把它记下来了.

    我认为最好最简单的使用ssh-agent的方法

    2011-06-12 by gihnius, tagged as linux, unix

    以前一直为在哪启动ssh-agent发愁,在网上搜索到也有很多人有类似的问题. 把eval `ssh-agent`放到 .xsession, .xinitrc, .profile 都不是好办法!因为这样很容易启动多个ssh-agent.

    有个开源工具叫 keychian,是一组shell脚本.不过我觉得它还是把问题复杂化了.要是有Apple OSX系统的keychain那样还差不多. 因此我还是自己折腾出下面这种方法,我使用的是zsh,下面的配置应该在bash下也能够使用..zshrc

    ## 启动ssh-agent,并保存agent环境到 $HOME/.ssh/ssh-agent.sh里.
    alias start-ssh-agent='[[ ! -f ~/.ssh/ssh-agent.sh ]] && eval `ssh-agent | tee ~/.ssh/ssh-agent.sh` && ssh-add'
    ## 停用ssh-agent.
    alias stop-ssh-agent='eval `ssh-agent -k`; rm -f ~/.ssh/ssh-agent.sh'
    ## 每个login shell都使用已有的 ssh-agent,重新读取已经启动的ssh-agent信息到当前环境中.
    if [[ -f ~/.ssh/ssh-agent.sh ]] ; then
        eval `< ~/.ssh/ssh-agent.sh` >/dev/null
        ps $SSH_AGENT_PID | grep -q ssh-agent
        if [ $? != 0 ] ; then
            rm -f ~/.ssh/ssh-agent.sh
        fi
    fi 
    通常,我是先打开一个终端,然后执行start-ssh-agent, 其实你喜欢什么时候需要就执行还是很方便的. 然后启动screen 或 tmux. 如果想停用,就跑stop-ssh-agent, 每次开一个新的终端,都会读取ssh-agent.sh的设置,继承已有的ssh-agent环境. 因此在一次启动之后, 新的终端也能使用.

    安全的使用 Windows

    2011-06-10 by gihnius, tagged as windows

    写这个,仅仅是为了推荐一个很多人都不知的Windows XP命令行 runas,它类似linux下的 sudo.

    在cmd命令行里执行 runas 可以看到以下帮助信息:

    RUNAS 用法:
    
    RUNAS [ [/noprofile | /profile] [/env] [/netonly] ]
            /user:<UserName> program
    
    RUNAS [ [/noprofile | /profile] [/env] [/netonly] ]
            /smartcard [/user:<UserName>] program
    
       /noprofile        指定不应该加载用户的配置文件。
                         这会加速应用程序加载,但
                         可能会造成一些应用程序运行不正常。
       /profile          指定应该加载用户的配置文件。
                         这是默认值。
       /env              要使用当前环境,而不是用户的环境。
       /netonly          只在指定的凭据限于远程访问的情况下才使用。
    
       /savecred         用用户以前保存的凭据。
                         Windows XP Home Edition 上没有这个选项。
                         该选项会被忽略。
       /smartcard        如果凭据是智能卡提供的,则使用这个选项。
    
       /user             <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式
       program         EXE. 的命令行。请参阅下面的例子
    
    例如:
    > runas /noprofile /user:mymachine\administrator cmd
    > runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
    > runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""
    
    注意:  只在得到提示时才输入用户的密码。
    注意:  USER@DOMAIN 跟 /netonly 不兼容。
    注意:  /profile 跟 /netonly 不兼容。 
    好像很多人使用MS Windows的时候都是直接跑在Administrator帐号下的. 然而这样很不安全,这样的系统会很受木马病毒欢迎. 建议在系统建一个受限用户帐号,平时就只通过这个帐号使用系统,当需要安装软件或系统配置升级时再切换到管理员帐号,熟悉命令行的可以直接使用 runas 而不用切换管理员登录. 也可以在受限用户下通过: 选中你要运行的程序, 右键->运行方式, 在弹出窗口里选中管理员的帐号.

    FreeBSD LCD屏幕亮度控制

    2011-06-09 by gihnius, tagged as freebsd

    在我的笔记本上,可以通过acpi_video.ko来控制屏幕亮度. 写了一个脚本lcd.sh,通过参数"lcd_up","lcd_down"来调节亮度,并用 osd_cat显示百分比信息.

    ## sysctl MIB of acpi_video
    hw.acpi.reset_video: 1
    hw.acpi.video.ext0.active: 0
    hw.acpi.video.crt0.active: 0
    hw.acpi.video.lcd0.active: 0
    hw.acpi.video.lcd0.brightness: 70
    hw.acpi.video.lcd0.fullpower: 100
    hw.acpi.video.lcd0.economy: 90
    hw.acpi.video.lcd0.levels: 100 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20
    dev.acpi_video.0.%desc: ACPI video extension
    dev.acpi_video.0.%driver: acpi_video
    dev.acpi_video.0.%parent: vgapci0 

    配置sudo,允许wheel组用户通过执行/etc/lcd.sh,调节屏幕亮度.

    %wheel     ALL=NOPASSWD:   /etc/lcd.sh

    我的FreeBSD LCD屏幕亮度控制脚本: 可能你需要修改脚本的获取和设置lcd信息的 MIB.

    #!/bin/sh
    
    action=$1
    DISPLAY=:0.0
    
    xosd_bar_font="-adobe-helvetica-bold-*-*-*-34-*-*-*-*-*-*-*"
    
    lcd_down () {
        levels=$(sysctl -n hw.acpi.video.lcd0.levels)
        top=$(echo $levels | sed "s/\(^[0-9]\{2,3\}\).*/\1/")
        bot=$(echo $levels | sed "s/.* \([0-9]\{2,3\}\)$/\1/")
        curr=$(sysctl -n hw.acpi.video.lcd0.brightness)
        down=$curr
    
        if [ "$curr" -le "$top" ] && [ "$curr" -gt "$bot" ] ; then
            if [ "$down" -ne "$bot" ] ; then
                down=$(echo $levels | sed "s/.*$curr \([0-9]\{2,3\}\).*/\1/")
            fi
        fi
    
        sysctl hw.acpi.video.lcd0.brightness=$down
        killall osd_cat >/dev/null 2>&1
        osd_cat -p middle -A center -f $xosd_bar_font -c green -O 3 -d 1 -b percentage -P $down -T "LCD: $down %" &
    }
    
    lcd_up () {
        levels=$(sysctl -n hw.acpi.video.lcd0.levels)
        top=$(echo $levels | sed "s/\(^[0-9]\{2,3\}\).*/\1/")
        bot=$(echo $levels | sed "s/.* \([0-9]\{2,3\}\)$/\1/")
        curr=$(sysctl -n hw.acpi.video.lcd0.brightness)
        up=$curr
    
        if [ "$curr" -lt "$top" ] && [ "$curr" -ge "$bot" ] ; then
            up=$(echo $levels | sed "s/^\([0-9]\{2,3\}\) $curr.*/\1/" | sed "s/.*\($curr\).*/\1/")
            if [ "$up" -ne "$top" ] ; then
                up=$(echo $levels | sed "s/.*\([0-9]\{2,3\}\) $curr.*/\1/")
            fi
        fi
    
        sysctl hw.acpi.video.lcd0.brightness=$up
        killall osd_cat >/dev/null 2>&1
        osd_cat -p middle -A center -f $xosd_bar_font -c green -O 3 -d 1 -b percentage -P $up -T "LCD: $up %" &
    }
    
    
    ## do
    {
    case $action in
        lcd_up)
            lcd_up
            ;;
        lcd_down)
            lcd_down
            ;;
        *)
            ;;
    esac
    } > /dev/null 

    把脚本绑定到快捷键上, 我的fvwm配置:

    Key XF86Forward A   A       Exec sudo /etc/lcd.sh lcd_up
    Key XF86Back    A   A       Exec sudo /etc/lcd.sh lcd_down 

    知识的重要性

    2011-06-09 by gihnius, tagged as reading

    今天逛博客,看到别人一篇文章,觉得跟自己近来一段时间的心情还有些共鸣.

    原文在这里:小议知识的重要性 

    一直都很仰慕天才那种一眼就看透事物本质的本领. 尽管现实中接触到的"天才"几乎没有, 但接近"天才"的人还是有的. 他们很多不是"不学有术", 而是孜孜不倦地求学,学识渊博的人喜欢读书,并且他们记忆力很好, 从而使他们的头脑更充实. 虽然自己承认知识的重要性, 但学习对我来说不是那么有耐性, 真的是心有余而力不足! 恨不得有一样东西能很快把这个世界的知识一下灌进自己的脑袋. 让自己无所不知,无所不晓. 而且有充足的知识基础,就能很快的吸收新生事物, 通晓一切,势不可挡. 

     但是天真归天真,饭要一口一口地吃,日子要一天一天地过,书也只能一点一点地读!