Gih's Blog

只言片语
Archive for June 2011

AIX中如何查看设备有哪些属性是可以更改的

2011-06-28 by gihnius, tagged as aix

lsattr可以查看一个设备的属性, 其输出中的最后一栏总是 True 或者 False, True代表那个属性允许修改, False表示那个属性是 Read Only 的.

-$ lsattr -El hdisk0
PCM             PCM/friend/scsiscsd                         Path Control Module           False
algorithm       fail_over                                   Algorithm                     True
dist_err_pcnt   0                                           Distributed Error Percentage  True
dist_tw_width   50                                          Distributed Error Sample Time True
hcheck_interval 0                                           Health Check Interval         True
hcheck_mode     nonactive                                   Health Check Mode             True
max_transfer    0x40000                                     Maximum TRANSFER Size         True
pvid            000b45c0688a5c5d0000000000000000            Physical volume identifier    False
queue_depth     3                                           Queue DEPTH                   False
reserve_policy  single_path                                 Reserve Policy                True
size_in_mb      73400                                       Size in Megabytes             False
unique_id       2B08004F478B0FHUS153073VL380008IBM   H0scsi Unique device identifier      False
对于可修改的属性,一般都具有一个取值范围:
-$ lsattr -Rl hdisk0 -a dist_tw_width
10...1000 (+1) 
知道设备有哪些可更改属性后就可以使用 chdev 根据需求来修改相应的属性的值.

利用AIX工具排除网络故障

2011-06-27 by gihnius, tagged as aix

网络问题,包括网络连接和网络性能两大方面,各自又包括配置错误或物理故障等原因. 系统管理员可以利用AIX系统自带的工具,对网络的连接及网络性能问题进行检测和排除. 这些工具包括: ping, netstat, tcpdump, iptrace...

我们知道网络通信是由一种网络通信模型: OSI(开放系统互连)来指导的. OSI 把网络从逻辑上分为了7层。每一层都有相关,相对应的物理设备,比如路由器,交换机. OSI 七层模型是一种框架性的设计方法, 建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题, 其最主要的功能使就是帮助不同类型的主机实现数据传输. 

OSI七层模型与那些命令的关联:

Read more »

Quickly create empty buffer (scratch) in Emacs.

2011-06-27 by gihnius, tagged as emacs

By default when Emacs starts up, it contains a buffer named *scratch*, which is provided for evaluating Emacs Lisp expressions interactively. Its major mode is "Lisp Interaction mode". 

The “*scratch*” “buffer” is designed for emacs lisp programers. (it defaults to lisp-interaction-mode.) but 99% of emacs users are not lisp coders. 

If you want a scratch pad, how do you open a new(empty) document in Emacs? This way is familiar to all software users. Here is a elisp function to let you do this. It open one or more new buffers and set major to text-mode.

(defun new-empty-buffer ()
  (interactive)
  (let ((n 0)
        new-buf)
    (while (progn
             (setq new-buf (concat "-untitled-"
                                       (if (= n 0) "0" (int-to-string n))
                                       "-"))
             (incf n)
             (get-buffer new-buf)))
    (switch-to-buffer (get-buffer-create new-buf))
    (text-mode)))

You can change the major mode from the last line to yours, eg. lisp-mode, ruby-mode, html-mode.

Bind this function to Win + n or CMD + n, just like what we do in other softwares.

(global-set-key (kbd "s-n") 'new-empty-buffer)

Then, you can press ⌘+n to create an empty buffer named -untitled-0-, and the next will be -untitled-1-, -untitled-2- ... -untitled-N-.

FreeBSD多路由表的应用

2011-06-24 by gihnius, tagged as freebsd

从FreeBSD 7.1开始,系统支持 multi route tables. 不过还不是默认,需要编译内核才支持. 其实有很多人都希望这个应作为系统默认的功能. 希望在即将到来的FreeBSD 9中出现. 这样可以轻松实现策略路由. 本人在工作中也需要这种功能,所以写个经验总结跟大家分享一下. 错漏之处还请多多指教.

加入内核支持,这个是必需的,希望以后成为默认:

option ROUTETABLES=16
这个值有个范围: 1 - 16, 选最大的吧. 添加进内核后, 可以通过 net.fib=N来修改,比如:
## in /boot/loader.conf
net.fib=4 
还可以通过sysctl 查看当前设置值.
$ sysctl net. | grep fib
net.my_fibnum: 0
net.add_addr_allfibs: 1
net.fibs: 16 
编译内核,参考文档吧:
cd /usr/src; make -j4 kernel KERNCONF=MRT
应用:客户端应用,以我的为例, 上班时我要用wifi上网,又要上维护内网服务器.wifi的路由是 192.168.1.1 192.168.1.0/24, 接口是 wlan0内网服务器的路由是 132.96.20.8 132.96.20.0/26, 接口是 re0先配置ip, wlan0是动态的,常规方法配置即可. re0是静态的:
ifconfig re0 up
ifconfig re0 inet 132.96.20.24 netmask 255.255.255.192
setfib -F 1 route add default 132.96.20.8 
re0的路由表配置在 fib 1 上, wlan0之前已经设置,它会默认使用 fib 0.可以看看路由表:
 netstat -nr
Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.1.1        UGS        20     9905  wlan0
127.0.0.1          link#13            UH          0     4092    lo0
132.96.20.0/26     link#6             U           0        0    re0
132.96.20.24       link#6             UHS         0        0    lo0
192.168.1.0/24     link#15            U           0       43  wlan0
192.168.1.9        link#15            UHS         0        0    lo0
... 
上面是 wlan0的配置,跟 setfib -F 0是一致的:
 setfib -F 0 netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            192.168.1.1        UGS        11    10008  wlan0
127.0.0.1          link#13            UH          0     4098    lo0
132.96.20.0/26     link#6             U           0        0    re0
132.96.20.24       link#6             UHS         0        0    lo0
192.168.1.0/24     link#15            U           0       43  wlan0
192.168.1.9        link#15            UHS         0        0    lo0
... 
re0上的配置:
 setfib -F 1 netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            132.96.20.8        UGS       112     3518    re0
127.0.0.1          link#13            UH          0       75    lo0
132.96.20.0/26     link#6             U           0        0    re0
192.168.1.0/24     link#15            U           0        0  wlan0
... 
路由器应用:接口1 re0, 接外网internet, 通过专用 ISP. fib=2接口2 re1, 接城域网 172.16.1.0/24 fib=1接口3 re2, 接内部局域网 192.168.1.0/24 fib=0fib跟随配置网络的顺序增加.可以在路由器上用setfib启动一个shell,这个shell就处于对应的网络环境下:
setfib -F 1 $SHELL -l
之后就可以接入城域网.具体配置跟上面的差不多,无非是再作一个路由器,就不详细介绍了,因为涉及具体的方案,而且需求不同也可以灵活配置,还可以结合 pf一起使用,功能就不是一般的强大了.

How to delay start a daemon ?

2011-06-22 by gihnius, tagged as freebsd

默认情况下很多系统服务都是在开机过程完成启动的, 但有时我希望一些服务在开机后过一段时间再启动. 在FreeBSD, AIX, Linux都可以通过简单的脚本实现, 不过要注意,有些服务会提供全局的环境变量或者成为其它服务进程的依赖时不能这么做!

以我的笔记本为例, 因为经常会在不同的地方上网, 所以我取消了系统开机自动配置网络,在开机后自己再执行相应的脚本连网. 有些服务比如 ntp(时间同步), pf(防火墙), stunnel, privoxy等等, 我都 delay start了. 方法是在/etc/rc.local里添加:

## rc.local
(sleep 600; service ntpdate onestart) &
(sleep 660; service ntpd onestart) &
(sleep 120; /path/to/other_scripts) &
... 
像ntpdate, 如果在开机时运行, 没有网络就不能校正时间了.我觉得这样还是有好处的, 还可以缩短开机时间.

强制产生core dump

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

core是指进程在内存的映像(image), core对于调试程序非常有用, 所以有时希望主动 dump 进程的 内存映像, 叫做core dump. 下面通过向进程发送信号的方法产生core dump.

在AIX系统中,要设置让内核允许做core:

chdev -l sys0 -a fullcore=true
发送信号,但同时也杀死进程:
kill -6 PID
在FreeBSD系统中,系统默认允许core dump, 也可以通过
sysctl kern.coredump=1
设置允许.如果设置了 limit,要解除:
ulimit -c unlimited
然后是:
kill -6 PID
在Linux系统上的操作类似.下面是FreeBSD man文档对 signal id 6 的描述:
     No    Name         Default Action       Description
     1     SIGHUP       terminate process    terminal line hangup
     2     SIGINT       terminate process    interrupt program
     3     SIGQUIT      create core image    quit program
     4     SIGILL       create core image    illegal instruction
     5     SIGTRAP      create core image    trace trap
     6     SIGABRT      create core image    abort program (formerly SIGIOT) 

FreeBSD系统通过devd/devfs自动挂载USB存储

2011-06-21 by gihnius, tagged as freebsd

因为自己不用KDE/GNOME等桌面系统,也不喜欢Hald提供的挂载方式, 所以写了一个脚本, 实现FreeBSD系统使用devd/devfs自动挂载U盘. 想了解 devd/devfs 就参考man文档吧! 设计脚本的功能大致如下:

插入usb disk后, 创建挂载目录, 检测文件系统类型, 然后使用适当的命令挂载, 把挂载信息记录到syslog里. 支持多个U盘,多分区,多文件系统类型挂载. 默认使用当前桌面用户id进行挂载.脚本的缺点:不能提示用户已经挂载, 不能通过图形界面卸载. 如果你觉得这个脚本有用,就给些建议帮忙改进吧!配置:设置系统运行普通用户挂载设备:在/etc/sysctl.conf加入:

Read more »

很酷的一条命令:比较两个文件特定的行.

2011-06-20 by gihnius, tagged as shell

例如: 比较文件 file1, file2 的前 20行:

diff -u <(sed -n '1,20p' file1) <(sed -n '1,20p' file2) 
以往还折腾awk,perl, 真没想到 diff 能这样用! 从下面的例子看到, diff 是通过两个临时文件进行比较的.
$ diff -u <(sed -n '276,300p' tnrun.pl) <(sed -n '312,350p' tnrun_xml.pl)
--- /tmp/zsh0DiZxS      2011-06-20 17:00:11.000000000 +0800
+++ /tmp/zshFozNfJ      2011-06-20 17:00:11.000000000 +0800
@@ -1,3 +1,22 @@
+
+        (defined $infos[0])?($hosts[$n]->{ip} = $infos[0]):($hosts[$n]->{ip} = undef);
+        (defined $infos[1])?($hosts[$n]->{user} = $infos[1]):($hosts[$n]->{user} = undef);
+        (defined $infos[2])?($hosts[$n]->{pass} = $infos[2]):($hosts[$n]->{pass} = undef);
+        $n++;
+    }
+    close (HOSTS);
+    return @hosts;
+}
+
+## get cmd list in file
+sub get_cmd_from_file {
+    my @cmds;
+    open (CMDS, "<$_[0]") || die "failed to open cmd list file: $!";
+    while (my $cmd = <CMDS>) {
+        chomp ($cmd);
+        push (@cmds, $cmd);
+    }
+    close CMDS;
     return @cmds;
 }
 
@@ -18,8 +37,3 @@
     my $runh = 0;
 
     if ($by_hosts_file) {
-        @tn_ips = get_ip_from_file($hosts_file);
-    }
-    if ($by_cmd_file) {
-        @cmds = get_cmd_from_file($cmd_file);
-    }
$ 
这就是说, <() 可以建立临时文件, 试试这个命令
 cat <(cat .profile) 
你会看到cat输出的是 .profile的内容. 接着
 echo $_ 
会输出 /tmp/zshOuJC2d 类似的内容, 表示一个临时文件. 也就是说上一个命令等于执行
 cat /tmp/zshOuJC2d 

常用的smit快捷路径及查找方法

2011-06-19 by gihnius, tagged as aix

最常用的无非是下面几个:

  • dev 设备管理
  • diag 诊断
  • jfs 定期档案管理系统
  • lvm 逻辑卷册系统管理员管理
  • nfs NFS管理
  • sinstallp 软件安装及维护
  • spooler 列印队列管理
  • system 系统管理
  • tcpip TCP/IP管理
  • mktipip 配置主机名和IP
  • user 使用者管理
  • mkps 建立交换区空间信息
  • chtz 修改系统时区
  • date 修改系统时间
  • chgaio 修改异步IO
  • chgsys 更改最大进程数
  • chlicense 更改系统用户数
  • 我还用emacs的org-mode整理了一份比较完整的SMIT快捷路径, 该文件是直接把org-mode转换为网页的.还可以即时搜索系统提供的smit fast path. 这些信息一般存放在

    /usr/lib/objrepos
    目录下的ODM数据库里. 可以通过
    odmget sm_menu_opt
    查看. 通过以下脚本可以查找任意一个 fast path:
    ODMDIR=/usr/lib/objrepos odmget sm_menu_opt | perl -e 'while(<>) {print "$2\n" if /(next_id|\bid\b)\s=\s\"(.*)\"/}' | grep -i 'search' 
    用上面的 'search' 替换你要查找的.

    获取 FC HBA 卡的 WWN

    2011-06-18 by gihnius, tagged as aix

    FC HBA卡就是主机跟FC(存储网络)连接时使用的一种接口卡,类似连接以太网的网卡,而WWN(World Wide Name)就是类似于以太网网卡的MAC地址.

    可以使用以下命令查看系统的 WWN:

    for i in $(lsdev -C|awk '/^fcs/ {print $1}');do echo "$i\t$(lscfg -vl $i|awk -F. '/Network Address/ {print $NF}')" ;done 
    
    fcs0      10000000C969963E
    fcs1      10000000C9696EA9