Showing posts with label Unix Linux. Show all posts
Showing posts with label Unix Linux. Show all posts

Nov 9, 2008

How to set the NLS_LANG in Unix Environments

Subject: The correct NLS_LANG setting in Unix Environments

In this Document
Goal
Solution
References
--------------------------------------------------------------------------------
Applies to: Oracle Server - Enterprise Edition - Version: 8.1.7.4 to 10.2.0.0
Information in this document applies to any platform.
GoalHow to set the NLS_LANG correctly in Unix environments:

-1- Check which locale is set and correct this if needed.
-2- Check if the choosen locale is indeed installed and install this if needed.
-3- Check if you telnet/ssh software is properly set up.
-4- Set the NLS_LANG and Test.
-5- What to do if this is not working?
-6- More in depth debugging.

Solution

-1- Check which locale is set and correct this if needed.
---------------------------------------------------------
Please note that the ouput of this command is not exactly the same on all the Unix environments.
Contact your Unix vendor if you have questions.
The example used here is to configure your unix environment so that you can use Unicode (UTF8) with sqlplus on your unix box.
To see your current setup, use the "locale" command like this:

$ locale

example of output:

LANG=fr_FR
LC_CTYPE="fr_FR.iso885915@euro"
LC_COLLATE="fr_FR.iso885915@euro"
LC_MONETARY="fr_FR.iso885915@euro"
LC_NUMERIC="fr_FR.iso885915@euro"
LC_TIME="fr_FR.iso885915@euro"
LC_MESSAGES="fr_FR.iso885915@euro"
LC_ALL=fr_FR.iso885915@euro

Most Unix versions have this as default:
$ locale

LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_MESSAGES="C"
LC_ALL=

"C" means US7ASCII , this implies that you can only display a-z, A-Z and 0-9 and nothing else.

We recommend to use UTF-8 when possible, this should look like:

$ locale

LANG=en_US
LC_CTYPE="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=en_US.UTF-8

When you have choosen a value, for example "en_US.UTF-8" on Linux, you can set it like this:

$ export LC_ALL=en_US.UTF-8
or
% setenv LC_ALL en_US.UTF-8

However you should set the needed variables in the user ".profile" file and then log out an in agian and check if the "locale" command returns the wanted output.
If you have questions on how to configure a user environment on your specific Unix/Linux flavor please consult your OS vendor.

-2- Check if the choosen locale is indeed installed and install this if needed.
-------------------------------------------------------------------------------
Please *do* check that you have the defined locale really installed.
To see all installed locales issue:
$ locale -a
sample output:
$ locale -a
POSIX
common
en_US.UTF-8
C
iso_8859_1
iso_8859_15
en_CA
en_CA.ISO8859-1
en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.ISO8859-15@euro
fr_CA
fr_CA.ISO8859-1
th
th_TH
th_TH.TIS620
ja

This lists all installed locales for the unix box, for example "fr_FR.iso885915@euro" is missing in the list, so if you want to use it then you need to install this first.
If you set the user environment to a locale that is not installed you will not get an error but it will not work.
Please also note that you need to have installed the exact locale , if you have "fr_FR.UTF8" or "UTF-8" installed but want to use "en_US.UTF8" you need to install "en_US.UTF8".
In the example you see that "en_US.UTF-8" is listed , so we can use it on this server.

-3- Check if you telnet/ssh software is properly set up.
--------------------------------------------------------
You will need *also* to check that your TELNET/SSH software is correctly configured.
It's your telnet software is responible for the conversion of the Unix locale to the client's environment (most likly a windows system).
We suggest that you try first with the free PUTTY client.
Putty download site - http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
When using the "en_US.UTF-8" like in our example on the unix side change the following setting in Putty:
Open the configuration window, navigate to "Window" then to "Translation" and set "Received data assumed to be in which character set" to "UTF-8".
Then navigate to "Window" then to "Appearance" and choose a font in the "Font used in the terminal window" that supports the languages you want to use/see.
For non-asian languages you can use the default "Courier New".
On windows you can use the windows tool "character map" to see what characters are know in a font.
Putty UTF8 how to - http://www.laug.org/2004/11/putty-utf8-howto.html
If it works with Putty but not with your telnet/ssh package then please consult the vendor of your telnet/ssh software.
If you do not use telnet but a "real" unix display please see Note 265090.1 - How to check Unix terminal Environments for the capability to display extended characters.

-4- Set the NLS_LANG and Test.
------------------------------
Once you have 1) configured the locale correctly , 2) have checked that the used locale is really installed and 3) configured your telnet/ssh client, then you can use a NLS_LANG set to LC_TYPE values.
In our "en_US.UTF-8" example this means setting NLS_LANG=AMERICAN_AMERICA.UTF8 (note the difference in notation between UTF-8 (unix) and UTF8 (oracle) )
so, login with your Unix user and then
a) check with locale if it's correctly set (assuming here en_US.UTF8)
b) set the NLS_LANG to match the locale settings
$ export NLS_LANG=AMERICAN_AMERICA.UTF8
or
% setenv NLS_LANG AMERICAN_AMERICA.UTF8
c) connect with sqlplus to your database and select some data.
For example "select UNISTR('\20AC') from dual;" will give the euro symbol when selecting using a 9i or up database that can handle the euro (UTF8,WE8MSWIN1252,...) and a correct UTF-8 or ISO8859-15 Unix enviroment.
If this works, then set the NLS_LANG also in the profile of your user.

-5- What to do if this is not working?
--------------------------------------
If you do not see the expected characters then please double check your settings.
However it's also possible that you have wrong data in your database.
The easy way to check:
Use a windows client, download and install SQL developer http://www.oracle.com/technology/products/database/project_raptor/, connect to your database and see if your data is correctly displayed in that tool.
If it is visible in SQL developer then the data is correct in the database, if not then you have wrong data in your database.

The harder way:
If for example "select ename from scott.emp where empno='7369';" is a select that returns one row of your data then do "select dump(ename,1016),ename from scott.emp where empno='7369';".
You can then look up if the codes match the characters you expect for your database characterset
( select value from NLS_DATABASE_PARAMETERS where parameter='NLS_CHARACTERSET'; )
in NOTE.282336 Charts of most current mono-byte Character sets or in case you have a (AL32)UTF8 database use Note:69518.1
Determining the codepoint for UTF8 characters.

If you can't figure out what's wrong log a tar, refer to this note and provide:
* the info asked in Note 226692.1 Finding out your NLS Setup.
* a spool (!not copy paste!) of the output of your version of the
"select dump(ename,1016),ename from scott.emp where empno='7369';" select .

It might also be good to follow Database Character Set Healthcheck,
same here, if you are stuck, log a tar and provide all gatherd information.
note to support: if a ct log's a TAR about this please *do* request a ARE review.

-6- More in depth debugging.
----------------------------
The steps 1-4 should be enough for 99% of the cases, the rest of the note is more in depth debugging
On some platforms, it can be usefull to use the following syntax to have more details about the codepage really used:

$ locale LC_CTYPE | head
example of output in a HP-UX env:
""
""
"iso885915"
""
example of output in a Linux env:
upper;lowe ;alpha;digit;xdigit;space;print;graph;blank;cntrl;punct;alnum;combining;combining_level3
toupper;tolower;totitle
16
1
ISO-8859-15
70
84
1
0
1

$ locale LC_CTYPE | head
upper;lower;alpha;digit;xdigit;space;print;graph;blank;cntrl;punct;alnum;combining;combining_level3
toupper;tolower;totitle
16
6
UTF-8
70
84
1
0
1

On Solaris, AIX, TRU64, this syntax doesn't give interesting complementary information.
To find more details about these settings:
on Solaris, have a look in /usr/lib/locale.
on AIX, have a look in /usr/lib/nls/README
on TRU64, have a look in /usr/lib/nls
on HP-UX, have a look in /usr/lib/nls/config
on Linux, have a look in /usr/share/locale/locale.alias

How to check the codepoints managed by the O.S.:
To know which code point is generated for a character in a Unix Environment,
you can use the "od" command like this (examples with a iso-8859-1 locale):

$ od -xc
é^D^D
0000000 00e9
351 \0
0000001

as you can see the hexa-decimal code point e9 is corresponding to the "é" (lower e acute)
351 is the corresponding Octal value (Octal is the native mode of the od command).
You can also check the character corresponding to a code point using the "echo" command like this:
for Solaris, AIX, HP-UX, TRU64:
$echo '\0351'
é

for Linux:
$echo -e '\0351'
é

As you can see, echo uses the Octal value, so you need to convert in octal the value you want to check.

ReferencesNote 158577.1 - NLS_LANG Explained (How does Client-Server Character Conversion Work?)
Note 179133.1 - The correct NLS_LANG in a Windows Environment
Note 265090.1 - How to check Unix terminal Environments for the capability to display extended characters.
http://www.xfree86.org/4.2.0/xfontsel.1.html - to see which fonts are known in the xwin env
http://www.xfree86.org/4.2.0/xlsfonts.1.html - to see what fonts are installed on the system
http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.aix.doc/aixprggd/nlsgdrf/locale_env.htm - IBM locale settings reference
http://docs.hp.com/en/5187-3605/ch02.html - HP Encoding Characters Reference
http://docs.hp.com/en/UXL10N-90302/UXL10N-90302.pdf - HP Language configuration reference
http://developers.sun.com/dev/gadc/faq/locale.html - Sun Solaris locale reference
http://www.opengroup.org/onlinepubs/007908799/xbd/locale.html - UNIX Open Group locale specifications reference
Note 119119.1 - AL32UTF8 / UTF8 (unicode) Database Character Set Implications



Nov 6, 2008

12 ways to read a file

 
#!/usr/bin/ksh
#
# SCRIPT: 12_ways_to_parse.ksh.ksh
#
#
# REV: 1.2.A
#
# PURPOSE:  This script shows the different ways of reading
#       a file line by line.  Again there is not just one way
#       to read a file line by line and some are faster than
#       others and some are more intuitive than others.
#
# REV LIST:
#
#       03/15/2002 - Randy Michael
#       Set each of the while loops up as functions and the timing
#       of each function to see which one is the fastest.
#
#######################################################################
#
#       NOTE: To output the timing to a file use the following syntax:
#
#          12_ways_to_parse.ksh file_to_process  > output_file_name 2>&1
#
#       The actaul timing data is sent to standard error, file
#       descriptor (2), and the function name header is sent
#       to standard output, file descriptor (1).
#
#######################################################################
#
# set -n  # Uncomment to check command syntax without any execution
# set -x  # Uncomment to debug this script
#

FILENAME="$1"
TIMEFILE="/tmp/loopfile.out"
>$TIMEFILE
THIS_SCRIPT=$(basename $0)

######################################
function usage
{
echo "\nUSAGE: $THIS_SCRIPT  file_to_process\n"
echo "OR - To send the output to a file use: "
echo "\n$THIS_SCRIPT  file_to_process  > output_file_name 2>&1 \n"
exit 1
}
######################################
function while_read_LINE
{
cat $FILENAME | while read LINE
do
        echo "$LINE"
        :
done
}
######################################
function while_read_LINE_bottom
{
while read LINE
do
        echo "$LINE"
        :

done < $FILENAME
}
######################################
function while_line_LINE_bottom
{
while line LINE
do
        echo $LINE
        :
done < $FILENAME
}
######################################
function cat_while_LINE_line 
{
cat $FILENAME | while LINE=`line`
do
        echo "$LINE"
        :
done
}
######################################
function while_line_LINE
{
cat $FILENAME | while line LINE
do
        echo "$LINE"
        :
done
}
######################################
function while_LINE_line_bottom
{
while LINE=`line`
do
        echo "$LINE"
        :

done < $FILENAME
}
######################################
function while_LINE_line_cmdsub2
{
cat $FILENAME | while LINE=$(line)
do
        echo "$LINE"
        :
done
}
######################################
function while_LINE_line_bottom_cmdsub2
{
while LINE=$(line)
do
        echo "$LINE"
        :

done < $FILENAME
}
######################################
function while_read_LINE_FD
{
exec 3<&0
exec 0< $FILENAME
while read LINE
do
        echo "$LINE"
        :
done
exec 0<&3
}
######################################
function while_LINE_line_FD
{
exec 3<&0
exec 0< $FILENAME
while LINE=`line`
do
        echo "$LINE"
        :
done
exec 0<&3
}
######################################
function while_LINE_line_cmdsub2_FD
{
exec 3<&0
exec 0< $FILENAME
while LINE=$(line)
do
        print "$LINE"
        :
done
exec 0<&3
}
######################################
function while_line_LINE_FD
{
exec 3<&0
exec 0< $FILENAME

while line LINE
do
        echo "$LINE"
        :
done

exec 0<&3
}
######################################
########### START OF MAIN ############
######################################

# Test the Input

# Looking for exactly one parameter
(( $# == 1 )) || usage

# Does the file exist as a regular file?
[[ -f $1 ]] || usage

echo "\nStarting File Processing of each Method\n"

echo "Method 1:"
echo "\nfunction while_read_LINE\n" >> $TIMEFILE
echo "function while_read_LINE"
time while_read_LINE >> $TIMEFILE
echo "\nMethod 2:"
echo "\nfunction while_read_LINE_bottom\n" >> $TIMEFILE
echo "function while_read_LINE_bottom"
time while_read_LINE_bottom >> $TIMEFILE
echo "\nMethod 3:"
echo "\nfunction while_line_LINE_bottom\n" >> $TIMEFILE
echo "function while_line_LINE_bottom"
time while_line_LINE_bottom >> $TIMEFILE
echo "\nMethod 4:"
echo "\nfunction cat_while_LINE_line\n" >> $TIMEFILE
echo "function cat_while_LINE_line"
time cat_while_LINE_line >> $TIMEFILE
echo "\nMethod 5:"
echo "\nfunction while_line_LINE\n" >> $TIMEFILE
echo "function while_line_LINE"
time while_line_LINE >> $TIMEFILE
echo "\nMethod 6:"
echo "\nfunction while_LINE_line_bottom\n" >> $TIMEFILE
echo "function while_LINE_line_bottom"
time while_LINE_line_bottom >> $TIMEFILE
echo "\nMethod 7:"
echo "\nfunction while_LINE_line_cmdsub2\n" >> $TIMEFILE
echo "function while_LINE_line_cmdsub2"
time while_LINE_line_cmdsub2 >> $TIMEFILE
echo "\nMethod 8:"
echo "\nfunction while_LINE_line_bottom_cmdsub2\n" >> $TIMEFILE
echo "function while_LINE_line_bottom_cmdsub2"
time while_LINE_line_bottom_cmdsub2 >> $TIMEFILE
echo "\nMethod 9:"
echo "\nfunction while_read_LINE_FD\n" >> $TIMEFILE
echo "function while_read_LINE_FD"
time while_read_LINE_FD >> $TIMEFILE
echo "\nMethod 10:"
echo "\nfunction while_LINE_line_FD\n" >> $TIMEFILE
echo "function while_LINE_line_FD"
time while_LINE_line_FD >> $TIMEFILE
echo "\nMethod 11:"
echo "\nfunction while_LINE_line_cmdsub2_FD\n" >> $TIMEFILE
echo "function while_LINE_line_cmdsub2_FD"
time while_LINE_line_cmdsub2_FD >> $TIMEFILE
echo "\nMethod 12:"
echo "\nfunction while_line_LINE_FD\n" >> $TIMEFILE
echo "function while_line_LINE_FD"
time while_line_LINE_FD >> $TIMEFILE
 


Nov 2, 2008

How to remove a VG and using its space to extend another VG?

**************************************************
test:/tmp>df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/sys_vg-root_lv
48G 26G 20G 58% /
/dev/sda1 99M 13M 82M 14% /boot
none 2.0G 0 2.0G 0% /dev/shm

**************************************************
test:/tmp>pvscan
PV /dev/sda3 VG ifmx_vg lvm2 [222.93 GB / 119.93 GB free]
PV /dev/sda2 VG sys_vg lvm2 [49.97 GB / 32.00 MB free]
Total: 2 [272.90 GB] / in use: 2 [272.90 GB] / in no VG: 0 [0 ]

**************************************************
If i want to remove ifmx_vg,then using the free space to extend sys_vg, How I should do?

**************************************************
step follows:
1,lvremove /dev/ifmx_vg/plogdbs --remove lv
2,vgchange -a n ifmx_vg --stop vg
3,vgremove ifmx_vg --remove vg
4,vgextend sys_vg /dev/sda3 --extend sys_vg
5,lvextend -L +20000M /dev/sys_vg/root_lv --extend root_lv
6,ext2online /dev/sys_vg/root_lv

Is the six step ==ext2online /dev/sys_vg/root_lv ==must done, not sure?




Nov 1, 2008

How to do a full database backup automatically by RMAN -- shell script show

#!/bin/ksh
# function: backup database(cdmaetl) or archive with rman
# usage: crontab on AIX

#env
export ORACLE_SID=cdmaetl
#export SHELL=/usr/bin/ksh
export ORACLE_HOME=/ora9i/OraHome1
export NLS_LANG=american_america.zhs16gbk
export PATH=$PATH:$ORACLE_HOME/bin
#variable
RMAN=$ORACLE_HOME/bin/rman
SQLPLUS=$ORACLE_HOME/bin/sqlplus
TEE=/usr/bin/tee

LOGFILE=/ora9i/logs/rmanback.log

#dictionary structure
DBDEST=/oradata/backup/rmanbak/${ORACLE_SID}/datafiles
CTLFILE=/oradata/backup/rmanbak/${ORACLE_SID}/ctlfiles/${ORACLE_SID}_ctl_`date +%Y%m%d%H%M`.ctl

#start running RMAN to backup database and redo log, also have a log for those actions
echo "----------------backup start----------------------" > $LOGFILE
date
$RMAN <<EOF $TEE -a $LOGFILE
connect target

#allocate channel for backup, and only bak database
Run{
allocate channel c1 type disk format '$DBDEST/%U_%s.bak' maxpiecesize = 2000M;
backup database filesperset = 4;
backup archive log delete input;

}

#save just only one bak
delete noprompt obsolete redundancy = 1 device type disk;
exit;
EOF

#start bak control file
$SQLPLUS "/ as sysdba" <<EOF $TEE -a $LOGFILE
alter database backup controlfile to '$CTLFILE';
exit
EOF
date
echo "-----------------backup end-----------------------" >> $LOGFILE

Oct 28, 2008

AIX 系统安装与维护

Chap2 系统安装和维护
 
2.1系统安装
三种安装方法
2.1.1全新安装
1、        用于新机器安装或者是空硬盘上的全新安装
2、        rootvg被破坏而且没有备份,这时你可以全新安装该系统
3、        如果你想让rootvg变得小一点,可以选择全新安装。
安装完毕后,你必须重新对该新系统进行配置。
2.1.2升级安装(Migration Installion)
用于升级Aix到一个新的版本或发布版本(version or release)并且保留原有的rootvg。
有一下特点:
1、        安装过程中,决定有那些就版本的软件包必须被新版本操作系统的软件包所代替。
2、        除了/tmp文件系统外,其它文件系统,包括root vg,logical volumes和系统配置文件都会被保留,大多数情况下,用户配置文件也会被保留。
3、        非软件产品(Non-software products)保留在系统上。
4、        当从Aix 3.2版升级时,/usr/lib/dirvers, /usr/lib/microcode, /usr/lib/methods和/dev目录下的所有文件都被删除,所以支持非IBM设备的软件包要重新安装。
2.1.3保留安装(要理解为保留用户数据)
是为了保留在rootvg中的用户数据而重新安装BOS。
有以下特点:
1、 /etc/preserve.list文件,用于指定在重新安装BOS时要拷贝和保留的系统文件,在该文件中指定这些文件的全路径名。在3.1版本中,要手工创建该文件,在4.1或更高的版本中,该文件有存在可以直接编辑。
2、确定/tmp文件系统有足够的空间用于保存/etc/preserve.list文件中列举的文件。
3、本安装法缺省情况下重写/ ,/var, /usr, /tmp文件系统,所以任何在这些目录下用户数据都会丢失,这些文件系统被删除并被重新创建,所以你安装的其它软件包可能也会丢失。要把保留安装看作这些文件系统的覆盖安装,所以保留安装后要重新配置系统。
2.1.4轮替(alternate)硬盘的安装法
在4.3或以后版本才可用。
可以通过克隆现有的操作系统到第二块硬盘上,一般采用升级安装法。或者采用安装介质、备份带(mksysb)或者是NIM image,来全新安装操作系统到第二块硬盘上。安装完毕后,会被指示采用第二快硬盘的操作系统,这是重启后即可生效。
采用克隆系统的方法时,要先安装bos.alt_disk_install.rte包才能使用;如果没有采用NIM方法而是采用mksysb备份带来安装的话,则要先安装bos.alt_disk_install.image包。
2.1.5 64位内核安装
1、        先说一下bootinfo命令
-y:检查硬件为32或64位。
-K:检查系统内核,为32位或64位。
-p:检查硬件平台,如果返回32位,为32位的硬件,如果返回chrp,为64位的硬件。
2、如果机器硬件是32位的(32-bit processors),则只能安装32bit的内核,但它也可以支持64位的应用。
3、如果机器是64位的(如P630,P650),则安装时可以选择时候启用64位的内核,也就是说,64位的机器也可以安装32位内核。
4、如何转换内核, 在/usr/lib/boot目录下,有三种内核文件,unix_up, unix_mp, unix_64。
以下命令把内核从32bit转换成64bit:
#ls �sf /usr/lib/boot/unix_64  /unix
#ls �sf /usr/lib/boot/unix_64  /usr/lib/boot/unix
#bosboot �ad /dev/ipldevice
#shutdown �r
解释:ipldevice指的是IPL(initial program load)启动设备,bosboot命令用于创建与机器引导ROS(只读存储器)连接的引导映象。
5、        硬件多线程
#bosdebug �H on/off
2.2lppchk命令,用于确认安装的软件
lppchk命令用于确认安装的软件包是否和SWVPD(software vital product data)数据库信息一致。
2.3installp命令
用于安装、升级、维护软件。
2.4smit.log文件
位于每个用户的根目录下,也就是说,普通用户在其根目录(如/home/sjwh)也会有smit.log文件,只要该用户使用了smit命令。
2.5确定维护版本(maintenance level)
使用oslevel命令
-l Level: 列出早于该命令行Level参数指定的版本号的软件包。
-g: 列出高于目前维护版本的软件包。
-q: 列出已知的维护版本。
2.6升级软件包(使用smit update_all)
可以到IMB网站上下载升级包。
2.7找出包含指定命令的软件包
1、        使用whence(也可以使用which)找出该命令的全路径。
2、        使用lslpp �w命令找出包含该命令的软件包。
3、        使用lslpp �l 命令来查看该软件包的版本。
4、        也可以使用lslpp �f bos.net.nfs.client来查看该软件包包含哪些文件。


Chap3 系统初始化和启动
3.1系统初始化
在系统启动阶段,root文件系统被mount后,系统开始初始化,以下事件顺序发生
1、启动阶段(startup process)最后一步是运行init命令,注意,在系统中,init进程号为1。
2、        init命令试图读取/etc/inittab文件。
3、        如果inittab文件存在,则init命令试图定位initdefault。
a、        如果inittab中有指定,那就按inittab指定的运行级别。
b、        如果没有指定,则要求用户从控制台中输入一个运行级别号。
c、        如果用户输入S,s,M,m,则系统进入维护运行级别。
4、        如果/etc/inintab文件不存在,则init缺省把系统置入维护运行级别。
5、        init命令每隔60秒读取/etc/inittab文件,因此如果/etc/inittab被改动,则60秒后/etc/inittab文件里新的命令行将会被执行。
3.2/etc/inittab文件
    1、格式:Identifier:Runlevel:Action:Command
#cat /etc/inittab
好好研究一下
2、可以使用以下命令来修改编辑/etc/inittab,当然,也可以直接用vi编辑器。
chitab, lsitab ,mkitab,rmitab
3、/etc/inittab各条目的顺序
SRC(system resource controller)尽可能考前;tcp/ip必须在NFS之前。
3.2.1telinit命令
telinit命令和init命令的区别,一样的。
3.3初始化的支持
3.3.1使用bootlist命令
-m mode:指定启动模式,支持三种模式,normal, service, both or prevboot。
但有些机型不支持prevboot模式
F85:/usr/sbin #bootlist -m prevboot -o
0514-220 bootlist: Invalid mode (prevboot) for this model
-o:输出
bootlist用于列出启动或改变启动设备的顺序,但系统启动时,它会从启动设备列表中依次去寻找包含有boot image的设备,并从该设备来启动系统。
#bootlist �m both  �o 
#bootlist �m normal cd0 rmt0 hdisk0
或者创建一个文件,#bootlist �m normal �f filename
3.3.2定位boot逻辑卷所在位置
系统默认的BLV(boot logical volume)为hd5,但可能被改动过。可以查找lv类型为boot的逻辑卷,即为BLV。
3.3.3 进入一个不能启动的系统
如果一个系统不能启动,这时要进入该系统查看原因,必须借助于安装光盘或系统备份带等有包含boot image的可引导的介质。
1、如果是PCI架构,听到滴声后按F5键,如果是早期的产品,有钥匙,则要把钥匙转动service档。
2、插入安装介质后,重新启动机器后,按下F5,这时系统从安装介质启动,几分钟后,系统进入"BOS Installation and Maintenance"界面,这时LED上显示"c31"。
3、选择3"Start Maintenance Mode for system recovery" ->;"Access a root volume group"->;选择"Access this volume group and start a shell"或者"Access this volume group and start a shell before mounting file systems        "
4、采取适当的措施进行系统数据修复,使得系统能够正常启动。
3.3.4启动时LED上的代码
LED上显示的代码根据主机型号不同而不同。
1、        E1F1表示系统定义的控制台已经被激活。
2、        201:破坏的引导映象(boot image)
a、        进入系统维护模式,检查/和/tmp文件系统空间
b、        确定引导硬盘lslv �m hd5
c、        重新生成引导映象bosboot �ad /dev/hdiskn
d、        检查错误日志中是否有CHECKSTOP错误,如果有,可能硬件问题。
e、        重启机器。
3、223-229:无效的启动顺序(bootlist)
a、        先用service模式启动机器,如果可以启动成功并进入系统,则用bootlist来查看和改变启动顺序。
b、        如果还不能进入系统,则用启动光盘进入维护模式,使用bootlist来查看并改变启动顺序。
4、551,555,557:破坏的文件系统、文件系统日志等
a、        采用3.3.3节的步骤,选择"mount文件系统前进入rootvg"
b、        检查和修复文件系统
#fsck �y /dev/hd1
#fsck �y /dev/hd2
#fsck �y /dev/hd3
#fsck �y /dev/hd4
#fsck �y /dev/hd9var
c、        重新格式化文件系统日志
#/usr/sbin/logform  /dev/hd8
d、        查找启动盘lslv �m hd5
e、        重新生成引导映象
#bosboot �ad  /dev/hdiskn
5、552,554,556:破坏的超级块或破坏的ODM数据库
a、        重复第4种中的步骤a和b
b、        如果fsck提示超级块受破坏,则恢复超级块
#dd count=1 bs=4k skip=31 seek=1 if=/dev/hdn of=/dev/hdn
c、        重建文件系统日志设备
#/usr/sbin/logform  /dev/hd8
d、        如果还没解决,则继续
e、        你的ODM被破坏,这时选择3.3.3节中"mount文件系统前进入rootvg"
f、        mount /(root)和/usr文件系统
#mount /dev/hd4 /mnt
#mount /usr
g、        拷贝系统配置信息到一个备份目录
#mkdir  /mnt/etc/objrepors/backup
#cp /mnt/etc/objrepors/Cu*  / mnt/etc/objrepors/backup
h、        从RAM文件系统拷贝配置文件过来到系统
#cp /etc/objrepos/Cu*  /mnt/etc/objrepos
i、        umount所有文件系统#umount all
j、        使用lslv �m hd5来确定启动硬盘
k、        保存干净的ODM到启动卷(boot logical volume)中去
#savebase �d /dev/hdiskn
savebase是将"设备配置"数据库的基本定制设备设备信息保存到引导设备中。
l、        重启,如果还不想,则要重装BOS。
6、        553:破坏的/etc/inittab文件
a、        进入维护模式
b、        检查/,/var,/tmp文件系统空间
c、        检查/etc/inittab文件,看是否是空的inittab文件,或是错误的条目。
d、        检查/etc/environment,/bin/sh,/bin/bsh,/etc/fsck,/etc/profile,/.profile等文件
e、        重启机器。


Chap 4 硬件安装和配置管理
4.1查找硬件架构
RS6000和pSerial服务器有以下架构:
rs6k                Micro Channel-based uni-processor models
rs6ksmp        Micro Channel-based symmetric multiprocessor models
rspc                ISA-bus        models
chrp                PCI-bus models
可以使用#bootinfo �p来确认系统的硬件架构,或者使用#lscfg可以显示"Model Architecture:   "。
可以使用lscfg,lsdev,lsattr来查看系统的硬件设备配置。
4.1.1使用lscfg命令
4.1.2使用lsdev命令
4.1.3使用lsattr命令
4.1.4例子
4.2适配卡和设备的配置
1、支持三招总线类型(bus type):SCSI,PCI,ISA
2、集成的设备(Integrated devices如SCSI设备)在系统启动时自动被配置,它是通过写入NVRAM的有效数据传递到操作系统来生效的。而PCI设备在系统启动时被配置,只要系统上装载有该设备的驱动。而ISA设备则必须手工来配置。
4.3展示安装的设备
使用smit lsdev或lsdev命令来查看。
注意:预定义ODM数据库有定义同样类型的设备的缺省属性,只要系统安装时有一种同类设备安装在系统上,例如,如果系统配有一个磁带机,那么有很多类型的磁带机都会在预定义ODM库中定义。因为他们的驱动都会装载到系统上。
可以使用lsdev �P来查看。
4.4配置新设备
4.4.1PCI设备的配置
1、如果在系统中添加一个PCI设备,那么使用cfgmgr或者在系统启动中就会自动配置该设备,只要该设备的驱动有安装在系统上。
2、热插拔槽和适配卡
首先要确认槽和适配卡都支持热插拔。
在添加、删除或更换热插拔适配卡时,要记住都要使用系统命令先把槽的供电关掉(turn off slot power)。有两个命令:lsslot和drslot,前者展示插槽的属性,后者动态重新配置插槽。
要添加一个热插拔PCI适配卡时,先用drslot命令使插槽处于Action state。然后插入适配卡,在使用该命令使插槽供电。这样,就可以使用cfgmgr来配置该适配卡啦。
在移除适配卡前,要先用rmdev等命令来删除系统中的配置,这样才能够在ODM库中删除该卡的相关定义。
4.4.2ISA设备的配置
    1、系统集成的设备如SCSI控制器和集成的ISA设备如键盘、鼠标(可以使用#lsdev �Cc adapter �s isa来展示) 都会自动被配置。然而,非集成的ISA设备如ISA卡(插在ISA槽中)则必须手工配置。
2、配置ISA设备必须确定BUS I/O range,IRQ等因素,并且可能需要用跳线方式或者采用该卡的管理配置软件来配置。
3、        可以使用#lsdev �Cc adapter �s isa来展示ODM库中预定义的ISA卡类型。
4、        安装ISA适配卡的驱动,使用smit devinst_isa来安装device.isa软件包。
5、        查看并记录已配置在系统里的ISA卡的配置
#lsdev �Cc adapter �s isa
#lsresource �l apm0
#lsattr �El apm0
其中apm0是一块多端口的ISA卡,lsresource命令展示该卡的配置信息。也可以使用lsattr命令。
6、使用smit isa安装配置ISA卡时可以试安装看配置信息是否可用,然后在真正安装到系统中去。
4.4.3 128端口异步适配卡的配置
一个128异步适配卡,最多可以连接8个远程异步节点单元(remote asynchronous node(RUN) units),每个单元可以支持16个设备。
可以采用EIA 422,直连cable,EIA422/EIA232异步modem,或者DSU/CSU设备来连接。菊花链(daisy chain)结构,注意单元要依次按序编号,既靠得适配卡越近编号越小。
RAN指示灯编码:AC(表示activity),En(Error Node表示node number不正确)
4.5添加一个tty设备
使用smit tty来添加,注意要确定终端类型。
添加完毕后,这时/dev目录将会创建该设备特殊文件,同时在/etc/inittab文件中添入该getty条目,以便系统可以激活该终端,而且在系统的customized ODM(CuDv)中也会加入相应的配置信息。
也可以使用mkdev命令,使用#redev �l <tty name>; -d是删除该终端。当然,不能删除正在使用中的终端设备。
4.6添加一个磁带机设备
一般,可以使用cfgmgr命令来自动配置。也使用smit tape来添加一个磁带机设备,注意要确定该设备的Block size大小。当然,可以设置为0,它可以自动找出磁道介质的block大小并读出该磁介质。也可以使用mkdev命令。

Chap 5 Object Data Manager(ODM)
ODM有很多作用,最重要的是维护系统的配置信息、系统组件设备和关键的产品数据库。它比采用文本文件形式更强健、安全并且可以共享。
它管理以下系统数据:
    设备配置信息
    smit的展示信息
    安装和升级过程中的关键产品数据(vital product data)
    通讯配置信息
    系统资源信息
ODM信息保存在以下三个目录:/usr/lib/objrepos,/usr/share/lib/objrepos,/etc/objrepos
在设备配置区域,ODM保存有所有pv、vg和lv等的信息,所有,要理解import和export一个vg时,ODM库关于该vg信息是如何变化的。
5.1ODM命令
关于对objects操作的命令:
odmadd:添加objects到一个object class
odmdelete:删除objects从一个object class
odmget:展示objects信息
odmchange:改变指定的object信息
关于对object classes操作的命令
odmcreate:创建空的object classes
odmdrop:删除整个object class
odmshow:展示一个object class的描述

Chap 6:Storage management,LVM,and file systems
6.1概念
Pv, vg, lv, lp四个概念
6.1.1逻辑卷存储的限制
Storage components        Limitations
Vg        255个/系统
Pv        32个/vg
PPs        1016个/PV,256MB,4.3.1版以后可以设置为1016的几倍。但改动后该vg就不能import到4.3.0或更低版本的系统中去。
#chvg �t 2 datavg  #lsvg datavg (MAX PPs per PV: 2032)
Lv        256/vg
Lp        35512/lv
Aix 5.2L版本有更好的扩展。
6.2管理pv
6.2.1配置新硬盘
3种办法
办法1:关机,插入硬盘,加电开机。
办法2:不用关机,插入硬盘后,运行cfgmgr命令
办法3:确定硬盘的以下信息,用mkdev命令来配置新硬盘
        Subclass, type,parent name,where connected。
        #mkdev �c disk �s subclass �t type �p parentname \ -w whereconnected �a pv=yes
        其中pv=yes参数使disk成为pv并且在硬盘上写了boot  record和唯一的PVID。
    可以用#lsdev �Cc disk
hdisk2 Defined   20-58-L      SSA Logical Disk Drive
#mkdev �l hdisk2
一般我们是采用第二种方法。
6.2.2使硬盘成为PV
Chdev命令通过指定唯一的PVID,来使disk成为系统中的一个PV。
    #chdev �l hdisk1 �a pv=yes
    在HACMP环境下,不能随意更改共享pv的PVID。
6.2.3更改pv的属性
1、设置可分配限制(allocation permission)
#chpv �a    
2、设置可用性(availability)
#chpv �v
   a: avaible
   r: unavaible
chpv其他用法:
-c: clean the boot record
-C HdiskName: clears the owning volume manager from a disk
-h: set hotspare
注意:使用chpv命令时需要使用/tmp目录的空间。
6.2.4删除PV
#rmdev �l hdsik1
6.2.5列举PV的相关信息的几个命令
#lspv
#lsdev �C �c disk          
#lspv hdisk1                  列举PV的属性。
#lspv �l hdisk1                列举PV内的logical volume
#lspv �p hdisk1
6.2.6移植一个PV里的内容
使用migratepv命令,注意只能在一个vg内操作,不能跨越vg来移植一个PV的内容。
基本步骤如下:
把新的pv加入到该vg上,利用migratepv命令或smit migratepv菜单来实现。移植前确认目标pv上有足够的剩余空间。
如果移植的PV中包含有hd5(boot逻辑卷),则必须进行一下操作:
#migratepv �l hd5 SoureDiskNumber DesinationDiskNumber
#bosboot �a �d /dev/DesinationDiskNumber
#bootlist �m normal DesinationDiskNumber
then
mkboot �c �d /dev/SourceDiskNumber
注意事项:
1、        migratepv命令不能使用在concurrent模式下的vg
2、        migratepv命令不能移植条带化的lv,需要采用cplv和rmlv的方式来移植该lv
3、        需要root用户或者是system组成员才能使用migratepv。
4、        移植hd5完毕后,如果是4.2之前的版本,要记得用mkboot �c 来清理源盘上的启动记录(boot record)。对于Aix 4.3或5L 5.2版,是或可以不用。
6.3管理vg
6.3.1添加一个vg
创建一个vg应确定的要素:
vg名称,vg里包括的pv,vg里pv的最大数,pp size,系统重启时是或激活。
可以使用smit mkvg菜单或者使用mkvg命令。
但smit mkvg没有提供一下选项:
1、        命令行提供 �d参数指定最大数量的pv数,smit采用默认值32
2、        命令行提供 �m参数指定pv的最大大小,这将决定有多少个PP可以使用,smit采用默认的1016(MAX PPs per PV: 1016)
3、        smit总是默认使用-f参数去强制创建vg。(4.3是这样,但5.2有本选项)
注意:要成功添加一个vg时根目录至少要有2MB空间。
6.3.2改变vg的属性
1、改变vg激活属性
#chvg �ay newvg
#chvg �an newvg
2、解锁vg(如果系统突然crash,这是LVM命令异常中断,vg可能会被锁。)
#chvg �u newvg
3、        添加一个pv
#extendvg newvg hdisk3
注意:如果要添加的硬盘已经属于一个还没有varyon的vg,则这时系统会提示你是或确认继续。
4、        删除一个pv
#reducevg myvg hdisk3
注意:reducevg提供-d 和-f参数,-d还删除该pv上的所有lv,可能会导致某个lv数据的一致性,如果那个lv跨越该pv的话,-f确认直接删除,没有经过确认。
5、        删除一个pv的标记(reference)
如果没有用reducevg vg pv命令来先删除一个pv的话,而直接移除一个物理硬盘的话,则在VGDA里还有pv的标记(reference),
6、        同步设备配置信息数据库(ODM)
一般情况下,ODM库里有关设备配置信息会和逻辑卷控制块(logical valume control blocks)里LVM信息和位于PV里的VGDAs信息保持一致,但有时不当操作会造成信息不一致。
#synclvodm rootvg
6.3.3Importing和exporting一个vg
exportvg命令从一个系统的ODM库中删除该vg的定义,但不会删除该vg上的任何用户数据,同样,importvg在系统的ODM库中加入了该vg的定义。
#exportvg myvg
#importvg �y myvg hdisk2
也可以使用smit exportvg和smit importvg来操作。
注意:
1、如果该vg名在系统中已被使用,则importvg时会报错,这是可以在命令行中指定另一个唯一名(指和系统中任一vg名都不一样,即在一个系统中,vg名是不能重复的),
或者在importvg命令行中不要指定-y参数或vg名,这是系统会为其自动指定一个唯一的vg名。
2、import进来的vg中包含的lv名可能和原来系统中的lv名产生冲突(名字一样),这是importvg会改变imported的lv名字,但会包错误信息。
3、在一个系统中移走vg前记得要先做exportvg的操作,否则在原系统的ODM库中还保留该vg的相关信息,该vg从新系统中移回原系统可能就会导致ODM库的信息和该vg的实际信息不一致。
4、        smit exportvg命令删除/etc/filesystems中有关文件系统的标记,但保留mount points在系统中;importvg命令同样在新系统中的/etc/filesystems文件中定义相关的文件系统信息。(如果没有冲突)
5、        如果一个vg包含有paging space并且该paging space是活动的,这要先把该paging space置于不活动状态,才可以export该vg。可以使用命令#chps �a n paging_space_name,然后重启机器使该paging space不活动。(在5.2版中不要重启机器)。
6.3.4varying on and varying off 一个vg
varyonvg命令的步骤:
1、        系统读取一个vg上每个pv的VGDA信息。
2、        每个VGDA上的头信息和时间戳被读取,只有时间戳跟VGDA一致才有效。
3、        如果quorum(a majority of VGDAS)是有效的,则继续,或者,vary on失败。
4、        系统采用最新的VGDA(即有最近时间戳的)并且把它刷新到其它VGDA上。
5、        (在mirroring镜像有使用时),如果有任何stale分区,则调用syncvg命令来同步该分区。
varyonvg命令参数使用
1、-f参数,强制varyon,即使发现不一致。
2、-n参数,不调用syncvg命令,防止坏的镜像copies回写到好的copies。
3、-s参数,到维护模式,可以对该vg操作,但lv不能打开(不能有I/O)。
varyoffvg命令使用前,要确定在其上的所有lv要先关掉(closed)。同样有-s参数到维护模式。
6.3.5管理一个vg
1、        列出vg
#lsvg
#lsvg �o
2、        列出一个vg的属性
#lsvg rootvg
3、        列出vg中的lv
#lsvg �l rootvg
4、        列出vg中的pv
#lsvg �p rootvg
6.3.6重组一个vg
reorgvg命令用于重新组织一个vg里的pp分布,根据每个lv的分配属性(allocation characteristics)。
#reorgvg [-I] VolumeGroup [LogicalVolume…..]
首先该vg必须varyon并且有空余的partitions,并且相应的lv的可重分配标记必须置为y,可以使用chlv �r命令来改动该标记,或者该lv将忽略。
注意:
1、        对条带化的lv不进行重组。
2、        在4.2或更新的版本,如果使用reorgvg命令不带任何参数,这只重组第一个lv(即lvvg �l VolumeGroupName中的第一个)
3、        -i参数指定pv名从标准输入读取,如
#echo "hdisk4 hdisk6" | revorgvg �I vg02 lv203 lv205
表示只有包含有lv203和lv205的hdisk4和hdisk6才对该相应的lv做重组。
6.3.7同步一个vg
如果一个lv copy是stale状态的,则可以用syncvg命令来同步该lv。
syncvg可以指定是lv、pv、或者是vg,但要考虑时间花费。
#syncvg �p hdisk4 hdisk5
表示同步hdisk4和hdisk5中的镜像拷贝。
#sysncvg �v vg04 vg05
表示同步vg04和vg05的拷贝。  不同vg中可以有拷贝?
6.3.8在一个vg内移动一个lv
    基本思路:把一个新的pv加入到vg中,采用migratepv souredisk targetdisk做法。
6.3.9把一个预定义的pv加入到一个vg中
记住,要先把该预定义hdisk变为可用,再加入到vg中,或者不能成功。
#mkdev �l "hdisk4"
hdisk4 Available     
mkdev(Adds a device to the system) 与chdev(Changes the characteristics of a device)区别:
(也是一个硬盘添加使用的过程)
s80:/# lsdev -Cc disk
hdisk0 Available 10-60-00-8,0 16 Bit SCSI Disk Drive
hdisk1 Available 10-60-00-9,0 16 Bit SCSI Disk Drive
hdisk2 Defined   20-58-L      SSA Logical Disk Drive
mkdev有两种用法,一种是添加一个设备,但要指定该设备的连接信息,也可以制作一个可用的已预定义过的设备(可以用#lsdev �Cc disk 列出)。
s80:/# mkdev -l hdisk2
hdisk2 Available
但这时候还没配置为pv,也就是说,要使用
S80:#chdev �l hdisk2 �a pv=yes
这是就可以把该硬盘(pv)加入某个vg中去。
6.4管理lv
6.4.1添加一个lv
1、使用mklv命令行:
几个参数:
-c copies:拷贝数,缺省为1。
-t type:lv的类型,类型为JFS (JFS2),JFSLOG(JFSLOG2)和paging,还有boot类型。
但boot类型不能是条带化,做日志型的lv,还要用logform来格式化该lv。
    #logform /dev/logdev
2、使用smit mklv
6.4.2删除一个lv
该lv必须为closed状态,即如果有文件系统必须umount下来。
6.4.3减少lv的大小
即使是5.2版本中,也不能直接reduce。
步骤:
1、        备份该lv的数据
2、        删除该lv
3、        重建lv,减少lv的大小
4、        恢复数据
6.4.4增大lv的大小
使用extendlv命令或者smit extendlv快捷方式来增加lv的大小。也可以采用扩大文件系统的方式来扩大相应的lv的大小,因为扩大了文件系统同时也就扩大了该相应的lv的大小。
注意,单独扩大lv后,相应的fs并没有扩大。
6.4.5拷贝一个lv
1、使用命令行cplv
#cplv �v myvg �y newlv oldlv
本命令行拷贝oldlv到myvg上newlv上。如果没有指定vg名,则会在同一个vg上创建新的lv。如果存在了一个lv,existinglv。
#cplv �e existinglv oldlv
注意:不用拷贝大的lv到小的lv上。
2、使用smit cplv
有三种选项:拷贝到一个存在的lv,拷贝到一个用户创建的lv,拷贝到一个系统创建的lv。
注意:如果你在使用cplv时碰到以下错误:cplvestination logical volume must have type set to copy.使用chlv命令来改变lv的属性:
#chlv �t copy <Destionation Logical Volume Name>;
6.4.6列举lv
1、列举系统所以lv
#lsvg | lsvg �il
2、列举某个lv属性
#lslv newlv
6.4.7lv的大小
6.4.8lv的其他属性
1、Intra-disk(盘内)分配策略
五个区域:outer edge,outer middle,center,inter middle,inner edge。
平均寻道时间。
如果有大量顺序读写(sequential reads or writes)应该放在outer edge,因为那里单个trace里有更多的data block。
如果lv有Mirrored Writed Consistency(MWC),则也要放在outer edge,因为MWC cache就在那里。
2、盘间分配策略
The maximum range setting:尽量把一个lv的pp分布到尽可能多的物理硬盘上。
The minimum range setting:尽量把一个lv的pp分布到尽同一个的物理硬盘上。
为增加数据的可用性,可以把lv镜像,这是pp的分布由条带化(strict)这个参数来决定,由一下几个设置:
y: 每个pp位于不同的pv上。
n:拷贝的pp可以唯一同一个或不同的pv上
s: 每个拷贝(副本)的所有pp不能和第二或第三拷贝的pp位于同一个硬盘上。这样就可以进一步减少由于硬盘故障而引起数据丢失的可能性。(4.3.3版本或以上支持)
所以,对于一个镜像的lv,要仔细考虑设置Range和Strict参数,例如,对于一个镜像的lv,如果range设置为minimum而strict设置为yes,则这些pp会分布到不同的pv上,但如果strict设置为no,则主pp和拷贝pp都会分布到同一个pv上。
3、I/O读写顺序策略
在镜像的情况下,要让主pp和拷贝pp位于不同的硬盘上,这样既增加数据可用性又可以提高性能。
Sequential:所有读都是指向主pp,而写是连续的,先写到主pp上,完成后再写到第二快硬盘上(既第二份pp上)。
Parallel:根据镜像硬盘的繁忙程度来平衡读操作,但写操作是并发的。
在5.1版本还引进一下两个策略:
Parallel/sequential: 读操作总是在主拷贝,但写操作是并发的。
Parallel/round robin:与Parallel策略类似,但它不是总是先检查主拷贝,而是轮循检查两个拷贝,写操作一样是并发的。
4、写操作确认策略
就是通过每次刚写入的数据进行读操作以测试或确定写操作是否成功,但会严重影响硬盘的写操作性能。
6.5管理文件系统(JFS)
Aix支持三种文件系统:JFS, NFS,CDRFS(CD-ROM file system)
JFS把lv分成固定大小的单元称为logical blocks。
超级块:位于第1和第31个logical block中,其中第31个是备份副本。该超级块保存文件系统的信息:如文件系统大小(以512byte计),文件系统的名称,文件系统日志设备地址,版本号,还有文件系统名称。
6.5.1文件系统属性
1、        Number of I-nodes(number of bytes per i-node)
JFS支持从512到131072的值。
问题的关键是JFS限制文件系统最多只能又2的24次方(16MB)。
2、        Allocation group size(分配组大小)
分配组大小范围为8MB到64MB,每一种有nbpi范围。
3、        文件系统片断可选址(fragment addressability)
支持四个可选址单元大小:512,1024,2048,4096,而最大支持到可选址为28-bit数字,既可以支持到2的28次方。
4、        文件系统的最大大小
由NPBI*2的24次方和Fragment Size*2的28次方的最小值决定。
5、        JFS文件系统日志
JFS文件系统日志最大到256MB。
6.5.2 JFS2文件系统属性
    1、比较:     
Function        JFS        JFS2
单个文件大小        64GB        1TB
Nbpi        固定,文件系统设定        动态,只是受限于磁盘空间
目录组织方式        线性(Linear)        B树(B-tree)
压缩        有        没有
缺省文件模式的SGID        SGID=on        SGID=off
配额        支持        不支持
2、兼容性
在Aix版本4中,不能mount上JFS2文件系统,就是不支持JFS2文件系统啦。
3、移植
只能做数据拷贝移植,不能做直接转换。
4、64位系统支持JFS2文件系统
在安装64位机器系统时,可以选择enable 64-bit kernel和JFS2,这样rootvg的文件系统就是JFS2的啦。
6.5.3创建一个文件系统
使用smit crjfs时有3个选项注意:Fragment Size, Number of bytes per inode, Allocation Group Size。
注意:在Aix中所有的I/O都是以4KB为单位,但在文件系统中采用512 byte为单位是为了保留和其它Unix系统的一致性。还有创建文件下都是以整数个PP为单位的。
6.5.4mount一个文件系统
1、mount一个文件系统是使得一个文件系统可以进入并被使用的唯一办法。
注意:1、when a file system is mounted over a directory, the permissions of the root directory of the mounted file system take precedence over the permission of the mount point.
2、mount点的目录权限至少要设置为111,要不然可以会发生Permission denied的现象。
2、使用命令行方式,可以mount所有的文件系统:
#mount {-a|all}
3、也可以使用smit mount,这时要指定"Directory over which to mount",这时你只能选择你创建文件系统时所创建的mount point。
4、自动mounting
有两类文件系统
a、        有一类是系统启动时所需的,这些文件系统(都是系统的文件系统如/, /usr, /var, /tmp等文件系统),它们在系统启动过程中明显地被自动mount。它们不是由后来执行地启动脚本/etc/rc(进行多用户环境的启动阶段)来mount的,rc脚本中即使执行了mount all命令。同样,当umount all命令执行时他们也不会umounted。它们在/etc/filesystems中由定义:mount=automatic
b、        另一类是用户定义的(包括系统的/home文件系统),它们是在执行rc脚本时被mount的,或者是使用mount all被mount上来,他们在/etc/filesystems中由定义:mount=ture
创建文件系统时可以通过指定"Mount Automatically at system restart"项,或者可以命令行#chfs �A yes来改变该属性。
5、展示装载上的文件系统
#mount
如果只是要显示系统中的文件系统,则要
#lsfs
6.5.5删除一个文件系统
#mount   
#umount filestem_name
#smit rmjfs或者使用命令行#rmfs filesystem_name,可以添加-r参数来同时删除转载点(mount point)。
6.5.6加大文件系统的大小
Aix可以动态增大一个文件系统的大小。
命令行
#chfs �a size=new_size_in_512-byte_blocks file_system_name
文件系统就变成新定义的大小。
也可以用smit chjfs来做
6.5.7检查文件系统的一致性
采用fsck命令,由-f, -p �t File, -y等参数。
注意:缺省情况下,/, /usr, /var, /tmp文件系统的检查属性是设置为False的(check=false),这是因为这四个文件系统在启动过程中已经被fsck检查并且mount上来啦,而不是在后来的多用户启动阶段/etc/rc脚本里去做fsck。
6.5.8初始化JFS日志设备
JFS日志设备储存文件系统元数据(metadate)的变化并且可以在系统崩溃后恢复时用户回滚没完成的操作,可以使用logform命令来初始化一个lv作为JFS的日志设备。
Logfrom只能对关闭的lv操作,并且将该lv的所有数据。
6.5.9添加JFS logs
JFS log能确定文件系统的完整性,当不能确定该文件系统上数据的完整性,也就是说,可能会丢失一定的数据,如果I/O还没有完全刷新到文件系统中去,这是突然系统崩溃,则数据会丢失,当文件系统应该还是可以用的。
步骤:
1、        建一个jfslog类型的lv
2、        格式化该lv  
#/usr/sbin/logform  /dev/userlog
3、        改变文件系统的日志设备,可能原来时系统的log=/dev/hd8
#chfs �a log=/dev/userlog  /userlv
6.6文件系统的故障修复
6.5.1超级块受破坏
1、        如果在使用fsck或mount命令时系统提示一下信息,则可能超级块被破坏(或者脏)
fsck: Not an Aix 4 file system
fsck: Not a recognized file system type
mount: invalid argument
2、        从备份超级块中恢复
#dd count=1 bs=4k skip=31 seek=1 if=/dev/lv00 of=/dev/lv00
3、        再用fsck修复该文件系统
#fsck �p /dev/lv00
4、        用fsck检查文件系统完整性
#fsck /dev/lv0
如果有问题,会有相关信息显示。
5、        如果还不能解决问题则可能要从备份中去恢复数据啦。
6.6.2不能umount文件系统
umount一个文件系统时提示:Device busy or A device is already mounted or cannot be unmounted
1、使用fuser命令检查该文件系统
#fuser �xc /fib (or fuser /dev/fiblv)
2、使用genkex命令来查看加载的kernel extensions。
3、该文件系统内还挂接有没有卸装的文件系统,先卸载内嵌的文件系统。
4、        用户可能使用该文件系统里的某个目录作为他们的工作目录,采用以下命令
#find  /fib �type d �exec fuser �u { } \;
6.6.3使用df或mount命令时挂住
主要是使用NFS时会产生这种问题,检查网络连通性和网络文件系统的可用性。包括检查nfsd守护进程。
6.6.4删除一个被锁住的应用文件
原因就是该文件正在使用,找出使用该文件的进程,kill该进程,就可以删除该文件。
#fuser /mydir/myfile
myfile 10477
#kill �9 10477
#rm myfile
6.6.5文件系统满
可能会导致各种各样的问题,比如/home文件系统满,则启动CDE时就会有问题。这是你要选择用命令行登录先处理该文件系统满的问题。

Chap 7 smit快速路径
    这一章就不用写啦,主要要自己都练习,多用用。
Chap 8 问题确定
8.1 启动日志工具(boot logging facility)
    1、系统启动日志信息默认记录到/var/adm/ras/bootlog(/var/adm/ras/目录下还记录了很多其它alog日志如bootinst.log,nimlog,dumpsymplog,conslog共五种类型等。)它通过rc.boot启动脚本调用alog命令来把启动日志生成到日志文件里。
2、alog创建并维护创建自标准输入的固定大小的日志文件。
命令用法:
#alog �f LogFile [-o]              显示日志文件的内容
#alog �f LogFile | [ [-q ] [-s Szie] ]   将数据记录到指定的日志文件
#alog �t LogType �V              显示指定日志类型的冗余值
#alog �L [ -t LogType]             显示指定日志类型的当前属性
3、查看boot日志,可以使用smit alog_show或alog命令来查看。
#alog �o �t boot
8.2错误日志工具
8.2.1软件服务辅助包
包括bos.rte.serv_aid和bos.sysmgt.serv_aid包,前者包含errlog子例程和error守护进程,后者包含errclear,errdead,errloger,errpt等命令
8.2.2管理错误日志
1、配置一个错误日志文件(/var/adm/ras/errlog)
    a、显示当前错误日志文件名、文件大小和缓冲区大小,这些信息配置在错误日志配置数据库中。
    #/usr/lib/errdemon �l
    b、改变日志文件名为/var/adm/ras/errlog.test
    #/usr/lib/errdemon �i /var/adm/ras/errlog.test
    c、改变日志文件大小
    #/usr/lib/errdemon �s 8192
    d、改变buffer大小
    #/usr/lib/errdemon �B 16384
    如果改动的buffer大小比原来大,那么马上生效,如果比原来小,则要等到系统重启后error守护进程(/usr/lib/errdemon)重启。而且注意buffer设置不能太大也不能太小。
2、启动和关闭错误日志守护进程
    #/usr/lib/errstop
    #/usr/lib/errdemon
3、清理错误日志
可以使用errclear命令行或者smit errclear来清理日志。
#errclear �d S 0   清理所有软件报错。
4、使用errpt显示日志报告
    #errpt �N hdisk0
    #errpt �a �j  ErrorID
5、拷贝错误日志到软盘或磁带机
    #ls /var/adm/ras/errlog | backup �ivp
    #ls /var/adm/ras/errlog | backup �ivpf /devrmt0
6、日志维护
    使用errlogger可以记录一个操作员信息日志,如
    S85:/ #errlogger "Error log cleaned "
    S85:/ #errpt
IDENTIFIER TIMESTAMP  T C RESOURCE_NAME  DESCRIPTION
AA8AB241   0329105505 T O OPERATOR       OPERATOR NOTIFICATION
8.3 系统dump工具
当系统发生不可意料的中断时系统dump拷贝相应的核心设备到dump设备,dump设备可以配置成磁带机或者一个系统中的逻辑卷,有两个dump设备。(为什么要有两个)。
默认情况下主dump设备是/dev/hd6(同时也是paging space),第二个dump设备是/dev/sysdumpnull。
Dump可以有系统触发或有用户触发,当dump发生是,系统可能挂住或者重启,取决于我们怎么设置"Automatically REBOOT system after a crash"选项。
8.3.1管理一个dump设备
用sysdumpdev命令来动态配置dump设备。
1、        显示当前dump设备及相关设置
#sysdumpdev �l
2、        改变主dump设备到/dev/hd9
#sysdumpdev  -P �p /dev/hd9
3、        估计当前系统dump的大小
#sysdumpdev �e
4、        显示前一个dump的状态信息
#sysdumpdev �L
上述命令也可以在smit dump中来做。
8.3.2系统触发的dump
一个系统触发的dump是写入主dump设备。
要理解LED面板上闪烁的888错误信息。
当面板显示888时,如果按下reset键,这时可能会显示102,表明发生了一个不可意料的系统挂住。这时再按下显示的"mmm"代表Crash code,再按下reset显示的"ddd"代表System dump codes。注意,这时显示的代码和3.3.4(启动时显示的LED代码不一个意思)
Crash codes: (P198-199)
    000:不可意料的系统中断
200-208:
700rogram interrupt
System dump codes:
    0c0: dump成功完成
    0c3: dump被抑制
    0c4: dump完成不成功,没有足够的空间,部分dump可用
    0c5: dump没法开始
    0c7: Network dump正在进行中
    0c8: dump disabled.系统没有配置一个dump设备
    0c9: 系统触发的dump开始。
8.3.3用户触发的dump
1、使用sysdumpdev �e检查dump需要的大小和使用lsps �a检查dump设备大小,确定时候需要扩大dump设备的大小。
2、开始dump
有三张方式用户可以触发dump,使用sysdumpstart命令,在把机器切换到service mode,(使用#sysdumpdev �K )使用按键组合:<CTRL>;+<ALT>;+NUMPAD1>;,或者按下reset键。
3、确定一个系统dump
使用crash命令,其中KernelFile是当前系统内核文件,如/usr/lib/boot/unix。
#crash SystemImageFile KernelFile
在crash交互模式下,可以使用stat子命令来确定dump文件的详细信息以便确定dump是否成功。
4、拷贝系统的dump
使用pax命令,它可以支持三种格式的输出,pax、cpio、ustar。
用法:
创建一个大于2G的文件tmp.pax包含有/home/soft.tar和/home/temp.tar
#pax �x pax �wvf tmp.pax /home/soft.tar /home/temp.tar
拷贝dump文件dump.out到磁带机rmt0
#pax �wvf /dev/rmto dump.out
解包/home/test.tar 到当前目录
#pax �rvf /home/test.tar
拷贝test.tar文件到/tmp目录
#pax �rw test.tar /tmp
其实,用法跟tar差不多,当记住,-r参数表示从标准输入读,-w表示写入标准输出。
5、        snap命令
收集系统信息(其实是由lslpp、errpt等命令生成)打成pax格式包,缺省输出到/tmp/ibmsupt目录。可以使用-d参数指定输出目录。比如
#/usr/sbin/snap �gfkD �o /dev/rmt0


Chap 9系统备份和恢复
9.1保存信息(备份数据)
可以使用多种多样的方式,如mksysb系统命令,还可以使用tar、cpio、dd和backup命令,还可以使用savevg命令来备份非rootvg(用户定义的vg)
9.2系统备份带的展现
系统备份带最前面有三个blocksize=512的image:BOS Boot image,mkinsttape image和dummy.toc。
1、BOS boot image:包含一份系统内核和设备驱动的拷贝用于从备份带中启动用,是由命令bosboot命令产生的。
2、miinsttape image:包含三个重要文件
./tapeblksz文件包含磁带设备设置block大小。
./bosinst.data文件包含定制的BOS安装过程。
./image.data文件包含BOS安装过程中系统的设置信息,比如rootvg中lv和文件系统的大小,命名等。你可以在使用mksysb命令之前定制该文件,也可以在备份过程中使用mksysb �i命令来生成一个新的./image.data到磁带中去,同样也生成在该系统的根目录下。在smit mksysb同样也有这样的选项(是否创建新的image.data)。
image.data文件里有以下参数要注意:SHRINK、BOSINST_FILE、EXACT_FIT。
3、dummy.toc文件。
注意:
1、        mksysb备份rootvg中所有的mounted的文件系统,它不备份裸设备。
2、        可以使用/etc/exclude.rootvg来排除不想备份的文件,文件系统或目录,使用-e参数才能使mksysb使用这个文件。
3、        做系统备份时/tmp文件系统至少要有8-12MB空间。
4、        如果你的磁带不做压缩时你可以使用-p参数。
9.3校验系统备份
可以使用smit方式,也可以使用 restore命令。
但如果bosinst.data文件中PROMPT设置为NO时,这时会做系统恢复。
9.3.1使用smit校验一个备份带
使用smit lsmksysb来展示备份带的内容。
9.3.2使用restore命令来校验一个备份带
mksysb命令实际上时调用backup命令来完成的,所有如果不想用smit的话,就要使用restore命令来校验一个系统备份带。
由于备份数据是从第四个block(文件标记file marker)写起的,所有要使用tctl命令来控制磁带的移动。
1、        倒带
#tclt �f /dev/rmt0 rewind
2、        把磁带倒到第四个file marker
#tclt �f /dev/rmt0 fsf 3
3、        读取磁带的内容并重定向到一个临时文件中去。
#restore �Tvqf /dev/rmt0.1 >; /tmp/mksysb.log
也可以跳过第2步直接读取:
#restore �s4 �Tvqf /dev/rmt0.1 >; /tmp/mksysb.log
9.4保存用户数据
9.4.1备份用户数据
backup命令可以单独用来备份rootvg或其它vg上的用户数据,用法如下:
backup �i  [-f Device] [-o] [-q] [-v]
-i:从标准输入中读取
-f:指定输出设备
-v:显示备份过程中的信息
如要备份/home/xtjk中的文件:
#cd /home/xtjk
#find . �depth | backup �ivf /dev/rmt0或
#find . �print | backup �ivf /dev/rmt0
恢复时要到当前目录/home/xtjk下,使用restore命令
注意:不能直接使用backup �i命令如#backup �ivf /dev/rmt0 /home/xtjk来备份数据,否则会挂住。
9.4.2备份用户vg
savevg可以用来备份用户定义的vg中的所有文件,前提是该vg必须是varyon,而且文件系统必须mount。
可选命令参数:
-e:指定不备份的文件,在/etc/exclude.vgname中定义
-f Device:指定备份设备,默认采用/dev/rmt0
-i:通过调用mkvgdata命令来产生data file(是否就是uservg.data,类似mksysb产生的image.data)。
如:#savevg �if /dev/rmt0 myvg
9.4.3备份裸逻辑卷
使用dd命令。
1、        确定磁带的block size大小
#tclt �f /dev/rmt0 status
2、        如有需要,改变磁带的block size大小
#chdev �l rmt0 �a block_size=<tape block size>;
3、        备份裸lv到磁带设备
#dd �if=/dev/lvname of=/dev/rmt0 ibs=512 obs=<tape block size>;
9.5恢复信息
9.5.1恢复rootvg
使用mksysb备份带可以恢复整个rootvg。
1、        检查系统是否支持从磁带启动
#bootinfo �e       
是否返回1。
2、        改变service模式下启动顺序
#bootlist �m service rmt0
#bootlist �m service �o
3、        放入备份带,重启机器,听到嘀声后按F5,系统采用service模式,从备份磁带引导,进入选择安装或恢复rootvg菜单选择。
9.5.2恢复非rootvg的vg
使用restvg命令,还可以通过改动/tmp/vgdata/uservg/uservg.data文件,采用这个工具来缩小该vg中的文件系统大小。
#restvg �f /dev/rmt0
9.5.3恢复文件系统
使用restore命令可以用来恢复使用backup命令做过备份的文件系统。
1、        显示备份磁带的内容
#restore �Tvf /dev/rmt0
2、        恢复使用backup �i命令做过的备份的数据
#restore �xvf /dev/rmt0 /home/xtjk
3、        恢复整个文件系统备份
#restore �rvf /dev/rmt0 /data
9.5.4恢复时的错误
9.5.5确定块大小(block size)
当磁带块大小设置不当时,会碰到读磁带时有问题。
确定磁带块大小有两个办法。
1、        使用tcopy命令
#tcopy /dev/rmt0
2、        使用dd命令
#dd �if=/dev/rmt0 bs=128k count=1 | wc �c
3、        改变块大小设置
#chdev �l rmt0 �a block_size=1024


Chap 10 系统性能
10.1使用topas命令
topas是Aix系统的性能健康工具。
命令参数:
-d NumberOfHotDisks:显示的硬盘的数量
-i:间隔时间
-n:显示网络接口的个数
-p:显示的最大进程数
如:#topas �i5 �n �p10
在topas命令屏幕下,还可以使用子命令。
10.2使用vmstat命令
10.2.1Paging活动统计
数据分析:
1、        比较大量的pi和po意味着大量的paging活动,可能是内存瓶颈引起。
2、        过高的fr:sr比例可能预示着内存瓶颈,当并没有一个确定的比例。
10.2.2CPU统计
数据分析:
1、        估计CPU负载的一个因子可以看run队列的大小。
2、        在当用户系统中,us+sy大于90%或者在多用户系统中,该值大于80%都意味着CPU负载较大。
3、        wa值大于40%意味着磁盘子系统是繁忙的或者该工作负载是disk-intensize。
10.2.3确定固定存储的I/O
使用#vmstat �s命令,从page ins,paging space page ins和page outs,paging space page outs来计算一个系统存储的由VMM触发的I/O(不包括paging space I/O),就是纯粹写入和写出硬盘存储的I/O。
pages ins �paging space page ins
pages ous- paging space page outs
vmstat �s统计量是从系统初始化以来(就是重启)开始的。
10.3使用iostat命令
10.3.1CPU的状态
数据分析:
1、高的iowait意味着内存不够或者是效率不高的I/O子系统。可以采用以下办法来优化。
a、        减少同一个物理硬盘上的活动lv或文件系统的数据,平衡PV上的I/O。
b、        让一个lv尽量跨不同的pv。
c、        创建多个JFS logs,并把它指定由于某些特定的文件系统。
d、        备份和恢复文件系统以减少碎片。
2、可能有些应用就是属于高I/O的。
10.3.2磁盘统计
要打开系统的"Continuously maintain Disk I/O history"。
10.4使用vmtune命令
本命令和相关资源放在/usr/samples/kernel目录下。
该命令只能由root来执行,通过vmtune改动调整过的变化一直保持到下次重启,也就是说,如果要是机器重启后调整还能生效的话,要把vmtune命令写入启动脚本文件如inittab里面。
10.5控制资源使用
10.5.1使用nice和renice命令
注意两者的区别,nice是使命令处于一个新的优先级下,如:
#nice �n 15 cc �c *.c
而renice使改变一个运行中进程的优先级,既降低优先级用-5,提高优先级用+5。
#renice �n �5 16308
其中16308使进程号。
10.5.2工作负载管理(workload manager-WLM)
10.6lv的性能
使用lv �m命令可以检查lv中个PP分区的分布,如果由多个copies(最多3个),都可以显示出来,如果发现PP分布不连续,则可能影响lv的性能,可以使用reorgvg命令来重新组织lv中PP的分布。
#reorgvg rootvg hd10opt
#lsvg �m hd10opt
10.6.2对顺序I/O读写调整系统
由两种技术可以用来调优具有大量属性读写操作的系统性能:条带化和VMM调节。
VMM调优的建议值:
Minpgahead  2
Maxpgahead  16×number of disk dirvers
I/O requests  Equal to maxpgahead
Maxfree和minfree参数设置必须经过调查一下系统的情况后,在作出调优。如
Minfree 128
Maxfree minfree_maxpgahead
10.7交换分区的管理
10.7.1太小的交换分区
系统可以会由各种各样的提示。
10.7.2管理要点
1、        不要在一个物理硬盘上建立多于一个的交换分区(paging space)
2、        要避免在一个负载较重的物理硬盘上建立交换分区。
3、        尽量使每个交换分区都基本一样大小。
4、        不要让一个交换分区分布到不同的硬盘上,如果需要,在另一个硬盘上建立一个新的交换分区。
5、        把逻辑分区分布到不同的硬盘控制器所在的硬盘上。
10.73管理缺省的交换分区(hd6)
减小hd6交换分区的大小:基本思路,采用替换法,hd6->;paging00->;hd6,但要重启两次机器。注意:在4.2.1及以后的版本中,不能把交换分区设置低于32MB。
步骤:
1、        创建一个临时的交换分区paging00
#mkps �a �n �s 30 rootvg hdisk0
2、        改变hd6的属性,使其在重启后不激活。
#chps �a n hd6
3、在启动脚本/sbin/rc.boot中把激活hd6改为激活paging00。
swapon /dev/hd6改为swapon /dev/paging00
4、改变dump的主设备(因为默认就是hd6)
#sysdumpdev �P �p /dev/paging00
5、重新创建boot image
#bosboot �a �d /dev/hdisk0
6、        重启机器
7、        删除hd6
8、        创建新的交换分区hd6,但大小可以减小到你想要的大小(本例为120MB)
#mklv �t paging �y hd6 rootvg 30
9、        改变dump的主设备为hd6
10、        改变/sbin/rc.boot脚本
把swapon /dev/paging00改为swapon /dev/hd6
11、        在硬盘中重建boot image。
12、        改变hd6属性,让它在系统重启后可以指定激活,同时改变paging00属性,让其在系统重启后不激活。
#chps �a y hd6
#chps �a n paging00
13、        重启机器并删除paging分区。
在5.1版本中可以使用chps �d命令来动态减小hd6交换分区的大小,它创建了一个临时的boot image和一个临时的/sbin/rc.boot指定到临时的主交换分区,以便系统总是可以安全的重启。
不建议把hd6移植到别的vg上。
可以使用migratepv来移植hd6到同属于rootvg的另外一块硬盘上。
#migratepv �l hd6 hdisk0 hdisk1
10.7.4动态使交换分区不活动
在5.1版本中,可以使用swapoff或smit swapoff来使一个交换分区不活动。
       
Chap 11 Networking
11.1 适配卡、接口、和配置问题
11.1.1添加一个网络适配卡(network adapter)
如果系统不支持热插拔卡,则要关闭和重启系统。
1、        检查系统上已安装的适配卡
#lscfg |grep �i adaper
2、        检查已定义的接口
#lsdev �Cc if
3、        关闭系统并下电(对于支持热插拔功能的系统,则不用关闭系统)
4、        安装新的网络适配卡
5、        加电到正常模式
6、        系统启动时自动运行cfgmgr命令,会自动检测新装的网络适配卡并且添加相应的接口。
注意:如果系统运行完cfgmgr命令后,提示一下信息:系统里没有安装某设备驱动包
则你必须把这些驱动包安装到系统中去。
7、        重新运行lscfg 和lsdev确认网络适配卡已经正常地添加到系统中去。
11.1.2移除一个网络适配卡
在移除一个网络适配卡之前,要记得先用ifconfig命令来删除系统中该网络适配卡和网络接口的定义。
ifconfig Interface [  AddressFamily [ Address [DestinationAddress ] ] [Parameters… ]  ]
主要参数:
alias:网络接口别名
delete:删除接口的网络地址
detach:从网络接口列表里删除一个接口
down:使网络接口不活动
mtu Value:设置mtu值
netmask Mask:网络掩码
up: 激活接口
步骤:操作之前,确认没有应用或进程在使用你准备要移除的网络接口上,同时系统可能需要重启机器。
1、        使接口不活动
#ifconfig Interface down
2、        删除网络接口列表里所有的网络接口定义
#ifconfig Interface detach
3、        从系统中删除网络接口定义
#redev �dl Interface
4、        删除网络适配卡的定义
#rmdev �dl Adapter
5、        关闭系统并下电
6、        移除该网络适配卡
7、        系统加电
11.1.3适配卡和接口配置问题
网速(Ring and media speed)配置问题
更正网速问题步骤:
1、        从网管那里获得正确的网络速度
2、        移除所有的网络接口
#ifconfig Interface detach
3、        使用smit chgtok-令牌环网卡(或者smit chgnet-以太网卡)
有相应的Ring speed或Media speed选项。
线缆类型配置问题:
smit tcpip里有Your CABLE Type选项
网络接口的MTU大小问题:
网络包长度可以从60 bytes到65535 bytes大小不等,缺省情况下,16Mb的令牌环网络接口的传输包大小是1492 bytes,而一个以太网接口是1500 bytes大小。
在同一个本地网中,网络通信包需要同样大小的MTU。
调整MTU大小步骤:
1、        检查一个网络接口的MTU大小
#lasttr �El Interface
2、        使网络接口不活动
#ifconfig Interface down
3、        用ifconfig来调整MTU值
#ifconfig Interface mtu Value
如:#ifconfig en0 mtu 1500
也可以用chdev命令来调整MTU
#chdev �l Interface �a mtu=Value
11.2 TCP/IP
11.2.1 TCP/IP 的初始化
/etc/rc.tcpip脚本:
与tcp/ip有关的守护进程:inetd、gated、routed、named、timed、rwhod。
注意:在一台主机里不能同时运行gated和routed守护进程,或者会带来不可意料的结果。
还有一些进程是从/etc/rc.tcpip脚本去启动的:lpd、portmap、sendmail、syslogd。
注意:如果在系统启动的时候/etc/rc.tcpip脚本在/etc/inittab中没有被初始化,而且你有一个图形界面,则要确认你的/etc/rc.dt(也是在/etc/inittab脚本里)没有被初始话,或者你的控制台会被挂起,而且由于telnet、rlogin等连接通讯工具没有被初始化,所以你没办法恢复。
11.2.2启动和关闭tcp/ip守护进程
1、        启动和关闭某一进程
#startsrc(stopsrc)  �s Daemon
2、        关闭所有的tcp/ip守护进程
#stopsrc �g tcpip
3、        像在系统启动过程中(IPL)过程中启动所有的tcp/ip守护进程一样,
#/etc/rc.tcpip
注意:不要用#startsrc �g tcpip命令来启动所有的tcp/ip守护进程,因为这样会启动定义在ODM中的所有属于tcpip组的守护进程,包括routed和gated服务进程。
11.2.3inetd守护进程
#列出inetd里启动的子守护进程
#lssrc �ls inetd
刷新inetd进程
#refresh �s inetd
11.2.4inetd及其子进程的错误
1、        首先用ping检查网络的连通性
2、        检查inetd是否有启动起来,包括它的子守护进程如telnet、ftp、rlogin、rexec等。
3、        如果以上都没有问题,则要检查是否虚终端(pseudo-terminal)是否够用。
#smit chgpty
缺省情况下,但一个rloing、telnet、rsh命令在系统中打开一个会话时,或者在图形终端中打开一个shell窗口时,系统会产生(spwan)一个虚终端会话。
11.3 IP地址、网关和子网
11.3.1 IP地址
A、B、C、D类地址
Netstat命令:
-rn:可以查看网络接口的路由表。
-in:可以查看网络接口信息,包括MTU大小、IP地址、流经网络接口(流入、流出)的数据包数量。
改变网络接口的状态:
1、        使网络接口不活动
#ifconfig tr0 down
#netstat �ni  可以看到该接口带*号,但#netstat �rn没变化
2、        删除网络接口
#ifconfig tro detach
这时,用netstat �ni或-rn都看到变化。
3、        重新激活或添加原来删除(detached)的网络接口
#ifconfig tr0 up
11.3.2网关
使用traceroute命令
定义一个缺省网关
#route add net 0 9.3.1.74
(或者也可以用#route add default 9.3.1.74)
11.3.3子网及子网掩码的问题
不同子网的网络地址是不能相连通的。
11.4网络配置文件
本节讨论的所有文件需要权限设置为600并且所有者是root。
1、/etc/resolv.conf和/etc/netsvc.conf文件
作为DNS(域名服务)的配置文件,前者指定域名服务器的IP地址(注意是IP地址而不是hostname),并且指定该系统所在的域。
后者指定域名解析(for sendmail,the gethostbyname,gethostaddr,and gethostent subroutines,and alias resolution for sendmail)的顺序。
缺省顺序:
1、        BIND/NDS(named, 使用/etc/resolv.conf文件)
2、        NIS
3、        Local /etc/hosts文件
格式如下:
#cat /etc/netsvc.conf
hosts = nis,local,bind
也可以指定环境变量NSORDER来指定解析顺序:
#echo $NSORDER
NSORDER=local,bind
2、/etc/hosts
指定主机名和别名(aliases)和IP地址的对应关系。
3、$HOME/.netrc
用于指定rexec和ftp命令自动登录的认证信息,该文件用明文存储了登录口令。所有远程系统的口令信息对于有root权限的用户是暴露的。
4、/etc/hosts.equiv和$HOME/.rhosts文件
用于定义信任主机(远程主机用户登录本地主机时不要提高口令认证)
文件格式如下:
[+|-] HostName [+|-] UserName or @NetGroup
注意:由于文件是从上往下顺序读的,因此条项的顺序不同可能导致不同的结果。
如:为了允许用户ethan从主机H70登录则:
ethan H70
11.5 输出X-Windows和图形应用
在Aix中,可以通过指定DISPLAY环境变量来输出X-Windowns会话和图形应用到别的系统上。
DISPLAY环境变量格式:
HostName:Number.Screen
11.5.1启动X-Windows应用失败
检查以下三项:
1、        DISPLAY环境变量是否设置
2、        X-Windows 服务是否已经启动
3、X-Windows准入控制已经启用,则要确认远程系统在准入列表(access control list)
中。
对于第三条,可以使用xhost +命令:
#xhost +
#xhost +H70A
H70A being added to access control list
#xhost
access control enabled,only authorized clients can connect INET:H70A
11.6网络高级配置选项
11.6.1ARP缓存
arp命令,-a和-d选项。
11.6.2检测网络瓶颈
1、使用spray命令:
-c Count:指定发送数据包的数量
-d Delay:指定发送发送数据包中间的时延,以毫秒记
-i: 指定使用ICMP代替RPC协议来回应数据包。
#spray H70A �c 1200 �d 2
2、使用netstat命令:
可以使用#netstat �i来查看,使用-Zi来清零网络接口的统计信息。
3、        使用topas命令
#topas �d0 �i0 �p0
11.6.3 no命令介绍
no {-a | -d Attribute | -o Attribute [=NewValue] }
-a:列出属性值
-d Attribute:设置属性值回缺省值
-o Attribute [=NewValue]: 设置属性值为一个新的指定值,如果没有指定New Value,则显示属性的原有值。
比如:
1、        IP forwarding
#no �o ipforwarding   (maybe output 0)
#no �o ipforwarding=1
2、        Route revalidation(路由重定向)
#no �o routerevalidation=1
11.6.4网络调优
网络传输也是使用实际内存作为communication pool(包括mbufs和clusters)
thewall:mbuf pools分配到的最大数量的内存(以kB为单位),在no命令里称为thewall参数。
还有其它好几个参数,这里就不细写。

Chap 12 打印机
12.1打印机的colon文件
打印机和打印机数据流属性存放在colon文件中,这些文件位于/usr/lib/lpd/pio/predef和/var/spool/lpd/pio/@local/custom/目录下,前者保存预定义数据库,后者保留定制数据库。
12.2远程打印
使不同的机器可以共享打印机。基于TCP/IP网络协议和lpd守护进程。
12.2.1/etc/hosts.lpd文件
定义远程可以使用本地打印机的机器名,它和/etc/hosts.equiv类似,但权限没有/etc/hosts.equiv大。
格式如下:
+                        表示远程所有机器都可以使用本地机器上的打印机
HostNmae    表示可以使用本地打印机的远程主机名
-HostNmae
+@NetGroup         表示可以使用本地打印机的网络组
-@NetGroup   表示不可以使用本地打印机的网络组
注意:注释符号不能放在主机名前面。
12.2.2控制lpd守护进程
可以选择Now,At system restart时或同时启动或关闭lpd守护进程。同时,你也可以选择让lpd运行在Debug,Syslog,both Debug and Syslog模式下。
命令:startsrc ,stopsrc , lssrc , refresh , traceson , traceoff。其中tracerson使打开跟踪(tracing)
12.3虚打印机
12.3.1有关虚打印机的文件
/usr/sbin/mkvirpt
/etc/qconfig                        配置文件
/usr/lib/lpd/pio/predef/*
/var/spool/lpd/pio/@local/custom
/usr/lib/lpd/pio/etc/*.attatch                        包含附加类型文件
/usr/lib/lpd/pio/etc/*.config                        包含该打印机的配置文件
/usr/spool/lpd/pio/@local/ddi*                包含摘要虚打印机属性文件
12.3.2关键命令
smit mkpq
smit chpq  :改变虚打印机
smit rmpq
lsvirprt    :改变或列出虚答应机属性
smit chvirprt: 改变虚打印机属性
一个虚打印机实际上就是一个打印机的简单接口,它提供以下功能:
1、        初始化打印机
2、        为filters提供一个hook或接口
3、        格式化ASCII数据
4、        转换打印代码
5、        重置打印机到预定义状态
6、        调用程序发送开头和结尾页
7、        在任务结束时发送一个form feed
8、        确认一些文件空间,比如/tmp
它并不做:产生任何打印机语言命令,比如PCL等,也不检查数据格式的准确性,也不自动识别数据的格式。
12.3.3创建一个虚打印机
smit mkpq或者直接使用mkvirprt命令来创建。
smit printer ->;printer spooling ->;Add a print queue
12.4远程打印过程中问题
12.4.1  0781-374错误信息
但要发送一个打印任务到远程打印服务器杀过那却提示:A remote host refused an attempted connect operation。
在远程打印服务器上启动lpd服务进程。
12.4.2 0781-202错误信息
当你在打印客户端使用lpstat时显示:0781-202 youre host does not have line printer access。
这时要在打印服务器编辑/etc/hosts.lpd,把客户端主机名加入。
12.4.3如何进行远程跟踪(remote trace)
使用iptrace工具可以进行远程跟踪,其命令格式如下:
iptrace �p printer -a -b �s source_host �d dest_host /tmp/trace.out
启用iptrace命令后,打印到远程打印机上:   #enq �Pqueue_name filename或者#lsstat �Vqueue_name,然后查看/tmp/trace.out文件是否增长,如果没有,可能iptrace命令没有用好,可以重启iptrace命令,然后对trace.out文件进行如下处理:
#ipreport /tmp/trace.out >; /tmp/report.out
12.5过虑器(filters)
过滤器功能可以使用命令行、脚本或者一个虚打印机来处理。
(略)
12.6清除和组织打印队列在Aix中挂起
Aix中在/etc/qconfig来定义队列,它并转换成一个二进制文件/etc/qconfig.bin。当qdaemon正在打印时,它被加载入内存,因此,对/etc/qconfig任何修改都要等到原有的打印队列完成后,新的队列进入后才能生效。
当一个大任务或者一个队列处于DEV_WAIT状态时,对队列的任何改变(/etc/qconfig)都有可能导致队列挂住(hang)。
1、        查看队列的状态
#lpstat
2、        如果有队列处于DEV_WAIT状态下,则停止qdaemon服务进程
#stopsrc �c �s qdaemon
(题目:如果有队列处于STOPPED状态,则要重启qdaemon服务进程。课后题目)
3、        使用lpstat或evq �sA来查看DEV_WAIT状态的任务,等待所有RUNNING的队列打印完毕,不要担心处于QUEUED状态的队列,因为在Aix 4或更高版中并不显示。
4、        清除处于DEV_WAIT状态的任务。
5、        如果还不能清除该任务,则查看/var/spool/lpd/std目录,查看带p.开头的文件,它记录了qd进程的进程号,把这些进程杀掉。
6、        这样,应该就可以清除干净,这时可以启动qdaemon服务进程啦。
总结:任务在打印时不要随意改变或添加打印队列,在做任何改变后要重启qdaemon进程。
12.7清除一个打印任务
要删除一个打印任务,
1、        查看打印队列的状态
#lpstat �v lpforu
2、        使用以下任一命令来删除一个打印任务(队列)
#qcan �P lpforu �x 3
#cacel 3
#lprm �P lpforu 3
#enq �P lpforu �x 3
表示删除Job号为3的任务。
3、        使用qchk来检查打印队列
#qchk �P lpforu
其中lpforu是虚打印机名
12.8 holding和释放打印任务
使用qhld命令,加-r为释放该任务。
#qhld -#13 �P lpforu    表示holding任务号为13的打印任务
#qhld �r -#13 �P lpforu  表示释放任务号为13的打印任务
12.9打印过程中的问题解决
12.9.1 qdaemon不会启动
检查/etc/qconfig是否有错误行。
升级后qdaemon,enq和digest不匹配。
12.9.2不能添加打印队列
可能是文件系统空间/tmp满。
12.9.3满的文件系统
12.10设置缺省的打印机
可以使用smit qdefault来设置或者使用定义LPDEST环境变量来设置
1、        使用smit qdefault来设置
2、        设置LPDEST=NewValue; export LPDEST或者setenv LPDEST=NewValue


Chap 13异步点对点协议
作为SLIP的一种替换选择,PPP提供了一种基于点对点介质上传送多协议数据包的标准方法。它包含以下三层:
包装多协议数据包的方法,PPP支持TCP/IP网络层协议
链路控制层(LCP)
网络控制层,PPP支持IPCP(Internet Protocol Control Protocol)用于协商一个TCP/IP连接。
13.1配置一个异步PPP服务端
要有以下六个步骤:
1、        设置PPP连接控制配置
2、        分配PPP IP地址
3、        设置特定的PPP拨入ID
4、        添加TTY端口
5、        配置modem
6、        启动PPP
13.2设置PPP控制连接
要设置以下几项:
PPP subsystem name
Max server connection: 即可以拨入(当前机器作为服务端)的客户端连接数。
Max client connections:同时可以拨出的连接数。
Max demand Interfaces: 最大数量的同时的对等连接数。
Max IP interfaces:    系统的PPP接口,等于max server connections,max client connections,和max demand connections的总和。
Max async HDLC attachment: 当前允许激活的PPP会话
可以使用smit ppp来设置这些参数。
设置完毕,会产生/etc/ppp/lcp_config文件,该文件记录这时设置参数。
13.3指定PPP IP地址
1、        选择一个未使用的IP地址
2、        把远程的(拨入方)机器的IP地址和主机名加入本机的hosts表中
3、        使用smit ppp来添加PPP IP地址,就是配置Starting Remote IP address未远程主机的IP地址。
4、        选址添加一个服务器接口
5、        这时会产生一个if_conf文件,/etc/ppp/if_conf
6、        确定要打开ipforwarding功能,缺省情况下,它是关闭的。
#no �a | grep ipforwardng
#no �o ipforwarding=1
7、        启用ARP代理,使所有到client的数据流都可以路由到本主机上(服务端)
语法:arp �s type hostname  harware address  pub
#arp �s 802.3 10:0:5a:8c:3c:fa pub
8、        确定ARP
13.4添加一个PPP登录用户
1、        使用smit user添加一个用户,属于uucp组
2、        设置该用户属性,不能远程登录,别人不能su
3、        改变用户密码
4、        在用户的.profile添加执行pppattachd一行
exec /usr/sbin/pppattachd server 2>;/dev/null
5、        使该用户登录时不要更改口令
#pwdadm �f NOCHECK pppuser
6、        在/etc/ftpuser添加该用户名,使其不能ftp。
13.5添加tty端口
先添加一个tty终端,接着吧tty加入/etc/uucp/Devices文件
1、        编辑/etc/uucp/Device文件
2、        加入以下一行
Direct tty# -baud-rate direct
如:Direct tty3 � 9600 direct
3、        保存退出。
11.4配置拨号modem
11.5开始PPP控制服务进程
使用startsrc和lssrc 等来控制pppcontrold服务进程
13.5 Aix PPP客户端
13.5.1配置一个PPP客户端
比如,在/etc/ppp/lcp_config可以配置如下:
server_name  goofy
lcp_server    0
lcp_client     1
lcp_demand   0
num_if       1
num_hdlc     1
其它一样配置tty和配置拨出modem等步骤。
接着启动PPP控制服务进程:pppcontrold进程。
可以使用#ifconfig pp0来查看端口活动。

 

Chap 14 cron守护进程和crontab
可是使用crontab或at命令来定制定时任务,也可以使用batch命令因为它是调用at命令。
14.1at命令
at命令从标准输入读取命令行,并把结果从标准输出和标准错误mail给你,除非你进行了重定向。
格式:at �f filename �t CCYYMMDDhhmmSS Increment
可以使用noon,midnight,now来代替-t参数,以指定执行时间。
14.2at命令储存池的目录位置
位于/var/spool/cron/atjobs(crontab位于/var/spool/cron/crontabs)目录下,由每个at命令创建的定时认为所产生的文件。可以使用atq命令来查询这些任务。
#cd /var/spool/cron/atjobs
#atq
root.915213600.a                Fri        Jan 1        12:10:00 CST 2005
执行时间就是12:10:00,即at任务即将执行的时间,而用ls �l /var/spool/cron/atjobs显示的文件时间是创建该at任务文件的时间。
可是使用at �r来删除该任务。
14.2crontab文件的位置
位于/var/spool/cron/crontabs目录下,没有用户有定时认为的用户有一个和用户名同名的文件。
14.3确定任务的运行
可以使用atq命令来查看由at命令定制的定时任务。
对于crontab任务,它会产生运行日志并存储在/var/adm/cron/log文件中,包括由该定时任务的运行情况,运行时间,进程号,任务人等。而且cron守护进程也会生成邮件把标准输出和错误输出mail给该任务的所有者。除非你在crontab中进行重定向。
14.4crontab文件记录的格式
这个大家都很熟悉,不要多写啦。
14.5定制定时任务
在使用at命令时,可以巧妙的使用"嵌套",比如,为了使一个命令可以每隔一段时间如5m运行一次,编写/appl/program文件:
print program executed at `date +%H:%M >;>;/data/output
at now +5 minutes �f /appl/program >; /dev/null 2>;&1
同时开始第一个任务:
at now �f /appl/program >; /dev/null 2>; &1
这时/appl/program就是每隔5m不断运行,一直到你用at �r命令来删除该定时任务。
14.6crontab命令使用权的控制
通过/var/adm/cron/cron.allow和cron.deny文件来控制那个用户可以或不可以使用crontab命令。该文件的格式是每个用户名一行。
注意,如果cron.allow文件存在,则root用户必须在里面。
以下任一情况,用户都不能使用crontab命令
1、        cron.allow和cron.deny都不存在,这时只有root可以使用。
2、        cron.allow存在,但该用户名没有在里面
3、        cron.deny存在,但该用户名在里面。
系统默认情况下,在/var/adm/cron下都又at.deny和cron.deny文件,但这两个文件都不包含任何用户名。也就是说,在默认情况下,任何用户都可以使用at或cron。
at命令使用权限同样由/var/adm/cron/at.allow和at.deny来控制,规则如上。
14.7创建和改变crontab文件
建议使用crontab �e命令行来操作,不使用直接编辑/var/spool/cron/crontabs目录下的文件,因为那样的话,要刷新以下cron守护进程。
14.8确认定时任务的时间顺序
因为普通用户deploy没办法列出/var/spool/cron/crontabs/deploy文件内容,所以要采用crontab �l的方式来列出定时任务。
/var/spool/cron/crontab或atjobs目录的权限都是770,属主是bin:cron。
14.9检查crontab提交的时间
使用crontab �v命令可以检查crontab提交的时间,如果只是使用crontab �e来编辑,但没有改变内容,提交时间会不会改变。(经确认,会改变)
14.10删除crontab文件
可以使用crontab �r来删除本用户定制的所有定时任务,所有千万不能使用root来执行这个任务。还是使用crontab �e来编辑会比较安全。
14.11使用crontab来改变一个用户的cron文件
可以使用crontab file命令来改变一个用户的crontab内容,但要注意,此时该用户的原有内容会被该文件的内容所代替,而不是追加到后面去。
$crontab �l >; deploy.schedule
用另外一个用户登录,
$crontab  /deploy/deploy.schedule

Chap 15编辑和查看文件和字符串
15.1vi文本编辑器
三个模式:命令模式,文本输入模式,最后一行(last-line)模式。以及如何切换。
vi参数。
vi的用法(略)
15.3查看文件和字符串设置
cat的用法
    用来连接或显示文件内容。
1、        连接多个文件
#cat /etc/passwd /etc/hosts >; yourfile
2、        隐瞒有关不存在文件的错误信息
#cat �q /passwd
3、        追加文件到另外一个文件的后面
#cat /etc/filesystems >;>; yourfile
4、        添加从终端输入的内容到一个文件
#cat >;>; yourfile
Create new user bob.
Ctrl+D
5、        连接多个文件,同时从键盘输入添加内容
#cat /etc/passwd - /etc/hosts >;yourfile
6、        连接多个文件包括从一个命令的输出
#ls | cat /etc/passwd - >;yourfile
15.3.1使用pg命令查看文件
从指定的文件名参数中去读取一个文件并输出到标准输出中去,如果你指定一个"-"作为参数或没带任何参数是,它从标准输入中读。
15.3.2使用view命令查看文件
view=vi �R,即以只读模式开始vi编辑器。
15.3.3使用echo命令
echo [ String … ]
1、        显示一条包含特殊字符的信息
echo "\n\nGone to lunkch.\nWill be back at 2:00."
将会在屏幕上跳开三行并显示以下信息:
Gone bo lunch.
Will be back at 2:00.
2、        使用带有模式匹配字符的echo命令
echo The back-up files are: *.bak
3、        添加单一行文本到一个文件
echo Remember to set the shell search path to $PATH. >;>;notes
4、        写一条信息到标准错误输出中去
echo Error:file already exists. >;&2
15.3.4使用file命令来决定一个文件类型
语法:file [-m MagicFile] [-f Filelist] [File…]
其中,MagicFile是指magic file,缺省情况下是/etc/magic文件,Filelist是指带有文件列表名字的文件。
#lf >; file.test
#file �f file.test
15.3.5在目标文件或二进制文件中使用strings命令。
在一个对象或二进制文件中查找可打印的字符串。一个字符串是四个或更多可打印字符的任意系列,以换行符或空字符结束。


Chap 16 shell和shell脚本
16.1 Korn shell或者POSIX shell
POSIX: portable operating system interface for computer environments,便携式计算机环境操作系统接口(标准)。Korn shell符合这一标准。
Korn shell(也是通常所说的POSIX shell)和Bourne和C shells有同样的特征,如I/O重定向,变量替代等。
16.2Bourne shell
bsh命令跑的就是Bourne shell。
Bourne shell既可以作为一个login shell也可以作为一个login shell下的一个subshell。只有login命令才能调用(call)Bourne shell作为一个login shell。Login通过使用特殊格式的命令格式-bsh,来调用Bourne shell,这样Bourne shell首先查找并执行/etc/profile和用户目录下的.profile。一旦执行完毕,该shell就就绪于标准输入。
16.3C shell
csh命令启动一个C shell。它的语法有的向C程序语言。
相应要查找和执行的环境变量是:/etc/csh.cshrc,/etc/csh.login和用户目录下的.cshrc和.login文件。只有root用户才能修改/etc/csh.cshrc和/etc/csh.login文件
/etc/csh.login和$HOME/.login文件只有在登录时运行一次,他们一般用于定义环境变量,需要只执行一次的命令或者设置终端参数。
/etc/csh.cshrc和$HOME/.cshrc不仅在登录时运行,而且每次csh命令或C shell脚本执行时都会激发。他们一般用于定义C shell字符,比如别名和变量。
16.4受限的shell
rsh或bsh �r命令启动一个受限的shell。
他们相比于bsh命令,有以下四个限制:
不能改变目录(使用cd命令)  可以往下一层吗,(经确认,也不行)
不能试着PATH和SHELL变量参数
不能执行含有/的路径或命令名
不能重定向输出
16.5设置shell环境
当一个用户登录时,它会执行用户环境文件并拥有这些环境一直到它正式退出 。
用户shell环境文件有两种类型,一种是控制整个系统所有用户的,就是/etc/profile和/etc/environment文件,另一种是对单个用户的,就是$HOME/.profile和/$HOME/.env文件。但是.env有效的前提是在用户的.profile里要指定export ENV=$HOME/.env。
/etc/profile,/etc/environment和.profile文件在登录是运行一次,但是,.env文件在每次打开一个新shell或一个窗口时都会运行。
16.5.1 /etc/profile文件
系统用户登录时执行的第一个文件,该文件定义了变量,文件生成的掩码,终端类型等。
16.5.2 /etc/environment文件
系统基本的环境变量。
16.5.3 .profile文件
    定义你个人的工作环境,在用户根目录下。可以覆盖/etc/profile文件中定义的变量。同样对于C shell或Korn shell,你可以使用.cshrc或.kshrc文件来定制你的C shell或Korn shell。
16.5.4 .env文件
在.profile文件中设置export ENV=$HOME/.env。该文件用于定义你个人的工作环境。可以覆盖/etc/environment文件中的定义。
16.5.5通过命令行改变环境
可以通过命令行来改变用户的环境,为了检查个人环境变量,使用echo命令,如:
#echo $LANG
en_UK
注意$字符的使用,它指明后面的字符串时一个shell变量,而不是字符串本身。
16.6创建和执行一个shell脚本
16.6.1脚本执行的注意点
1、创建并执行脚本的一般步骤,一般用编辑器编辑完一个脚本后,有两种执行方式,一种可以直接采用shell命令(如ksh,bsh,或csh)带该脚本来执行该脚本,还有一种是把该文机变成可执行文件,进行执行。
2、关于脚本运行时是在哪种shell下运行的,有三种情况,一种是以可执行文件命令行来直接执行该脚本文件的,这时就是用户所在的shell环境;第二种是可以在脚本文件中指定特定的shell来运行,如在开头指定#!/usr/bin/ksh。第三种,即使在脚本文件开头有指定特定的shell,但如果采用shell命令,比如使用#ksh myscript,那么该文本就是运行在Korn shell。
16.6.2创建一个脚本
1、一般格式如下:
指定#!/usr/bin/ksh
脚本注释
搜索路径
脚本变量或变元
标准输入、输出和标准错误输出
退出
2、重定向
三种I/O类型:stdin(0),stdout(1)和stderr(2)。标准输入一般来自于键盘输入,标准输出一般到屏幕,标准错误也是到屏幕。但你可以进行重定向。
2>;      表示重定向标准错误输出
1>;&2    表示重定向标准输出到标准错误输出
2>;&1    表示重定向标准错误输出到标准输出
16.6.3测试shell脚本
    可是使用ksh带参数来方便地调试你的脚本,如-n参数检查脚本地语法错误但不运行他们,-u参数运行脚本中的命令,但
查找一个ksh命令说明。
 
感谢Juilya 圣骑士整理了本文.From: 中国Linux/Unix社区


Oct 24, 2008

AIX LVM比较

卷组描述区(VGDA)、卷组状态区(VGSA)和逻辑卷控制块(LVCB)构成了LVM的配置数据
1.
VGDA:卷组描述区。
位于所有硬盘起始的部分,VGDA记录着卷组中每个逻辑卷(LV)的逻辑分区(LP)与物理分区(PP)的映射关系。主要用于更新ODM。
VGSA:卷组状态区。
主要用于描述VG中PV和PP的状态信息,在激活一卷组时,VGSA可以确定卷组中那些物理分区(PP)是无效的(或陈旧的),哪些物理卷已丢失,进而确定卷组中的物理卷是否可用。

LVCB:逻辑卷控制块。
位于所有LV的起始部分,包含与LV有关的信息,如LV的大小、类型、最后更新时间等。卷组中的每个PV至少都有一个VGDA,VGDA能对该PV进行自我描述,每个LVM命令都可以同步卷组中所有PV的VGDA,从而使卷组中每个PV的VGDA都保持相同的时间戳,如果其中一个PV错误导致无法运行,则就无法更新同步VGDA。在把一个硬盘变成物理卷时(使用mkdev命令)就在这个硬盘的开始部分保留一个存放VGDA的空间,当把这个物理卷加入到一个卷组中时(使用mkvg或extendvg)才将该卷组的信息写进这个物理卷的VGDA中。当把一个PV从所属VG中删除时(使用reducevg命令),同时从这个PV的VGDA中清除该卷组的信息。

描述LVM的构成信息不会存放在一个地方,还会存在于系统的各个地方,AIX的大多数系统配置都会存放在ODM数据库中,所以已配置的VG,LV和PV的信息都会保存在ODM数据库中,所以当导入(import)一个卷组时,就会把要导入卷组的VGDA信息保存在ODM数据库中,相反,导出(export)一个卷组时,就会把这个卷组的VGDA信息从ODM数据库中删除。

关于PVID:PVID是PV的物理标识符,这个PVID是系统随机生成的,而且是可变的。
硬盘在未被定义为PV之前是没有PVID号的。当系统进行cfgmgr后,系统就会为硬盘分配一个名字和PVID号。
如果想手工清除PVID号用chdev -l hdiskn -a pv=clear.重新生成pvid号用cfgmgr或chdev -l hdiskn -a pv=yes.

ODM:ODM数据库用与描述物理设备相同的方式描述VG和LV,它影响VGDA、VGSA、LVCB中的信息。LV在ODM中处于Defined状态,而物理设备则处于Available状态。
在/etc/vg目录中保存有VGID,
可用#lqueryvg �p hdiskn �At查询VGID
可用#lqueryvg [�g VGID|-p PVname] [-NsFncDaLPAt]查询PVID
可用#getlvcb �AT hdn查询LVCB信息
可用 #ipl_varyon �i显示系统中的PV,PVID及PV所属的VG的VGID

2.
当VG中有两个PV,且两个PV互为镜像时,如一个PV上的VGID毁坏了,
可用#chvg -Q n vgname命令恢复,
然后用#varyonvg vgname将VG挂在系统上即可。

3.当ODM中的有关VG的信息毁坏时,
可用#varyoffvg vgname,
#exportvgvgname,
#importvg �y vgname �f hdiskn
#varyonvg vgname命令重建ODM中的VGDA项。

4.当PV上的VGDA毁坏时(此问题通常是由于从系统中卸载一块PV而未事先将
其从VG中卸载),应先找出丢失PV的PVID,然后将丢失的PV重新加入ODM
中,再将此PV从VG中卸载,最后从系统中删除此PV。
具体步骤为:
#lqueryvg �p hdiskn �At从VGDA查找所有PV的PVID
#lspv从ODM和VGDA中查找所有PV的PVID
#dd if=/dev/hdiskn count=1|od �x|grep 0000200
查找系统中实际存在的所有PV的PVID)命令找出丢失PV的PVID
#odmget �q "name=hdiskn" CuDv >>/tmp/hdiskx.add
#odmget �q "name=hdiskn" CuAt >>/tmp/hdiskx.add
从ODM中取出系统中实际存在的PV的信息
#vi /tmp/hdiskx.add
#odmadd /tmp/hdiskx.add
将编辑好的文件加入到ODM中(用丢失的PV的Pvname和PVID替换文件中的
Pvname和PVID)
#lslv �l hdn
查看hdn上的LV分配情况(In Band:表示在LV中部的LP占全部LP的比例)
#lslv �m hdn
查看hdn上的LP-PP-PV的对应情况
#reducevg vgname hdiskx
#rmdev hdiskx
将丢失的PV从系统中删除。(可用extendvg �f vgname hdiskn命令加新的
PV至VG中)。

5.当ODM中的有关Rootvg的信息毁坏时,可用下面的scrīpt文件恢复ODM中
的VGDA信息。
#vi scrīpt
PV=/dev/ipldevice
VG=rootvg
cp /etc/objrepos/CuAt /etc/objrepos/CuAt.$$
cp /etc/objrepos/CuDep /etc/objrepos/CuDep.$$
cp /etc/objrepos/CuDv /etc/objrepos/CuDv.$$
cp /etc/objrepos/CuDvDr /etc/objrepos/CuDvDr.$$
lqueryvg �Lp $PV |awk '{print $2}' |while read Lvname;
do
odmdelete �q "name=$Lvname" �o CuAt
odmdelete �q "name=$Lvname" �o CuDv
odmdelete �q "value3=$Lvname" �o CuDvDr
done
odmdelete �q "name=$VG" �o CuAt
odmdelete �q "parent=$VG" �o CuDv
odmdelete �q "name=$VG" �o CuDv
odmdelete �q "name=$VG" �o CuDep
odmdelete �q "dependency=$VG" �o CuDep
odmdelete �q "value1=10" �o CuDvDr
odmdelete �q "value3=$VG" �o CuDvDr
importvg �y $VG $PV#igonre lvaryoffvg errors
varyonvg $VG
#./scrīpt hdiskn

6.迁移Rootvg时应注意:
重新创建BLV(BootLV),更改Bootlist,更改系统的DUMP设备。
迁移Rootvg的步骤:
#smit mksysb
先备份Rootvg,然后将新硬盘安装至系统
#bosboot �ad /dev/newdisk
在新硬盘上创建BLV
然后更新系统的Bootlist(参看系统安装说明)并重启
#mkboot �c �d /dev/olddisk
将欲移出的硬盘上的Boot记录删除
#savebase [-d /dev/newdisk]
将设备配置库中的设备信息保存在新硬盘上
#sysdumpdev �p /dev/sysdumpnull
激活临时的DUMP设备
#sysdumpdev �p /dev/hd6
重置系统的DUMP设备
#migratepv olddisk newdisk
将旧硬盘上的LV迁移至新硬盘上
#reducevg vgname olddisk
将旧硬盘从Rootvg中迁移出来
#rmdev �dl olddisk
将旧硬盘从系统和ODM数据库中删除
#extendvg [-f] vgname newdisk
将新硬盘加入到Rootvg中。

7.从Rootvg中卸载PV的步骤:
#migratepv �l lvname 欲卸载PV 保留PV
将在欲卸载的PV上的,与Rootvg有关的LV迁移至保留在Rootvg中的PV上
#backup �u �0 �f /dev/rmtn /fsname
将欲迁移至新VG的FS备份下来
#rmfs /fsname
删除欲卸PV上的FS
#reducevg rootvg 欲卸载PV
将欲卸载的PV从Rootvg中卸下
#mkvg �y 'newvg' 欲卸载PV
在此PV上创建新的VG
#varyonvg newvg
将新VG挂在系统上
#smit crfs
#mount /fsname
将FS安装在新VG上
#cd /fsname
#restore �rvf /dev/rmtn /fsname
#rm restoresymtable
将FS恢复到新VG上(以上步骤不适用于迁移BLV和系统DUMP设备)。

8.在同一VG中迁移FS:
#migratepv �l lvname 源PV 目标PV

9.在不同的VG间迁移FS:
#smit crfs
在目标VG上创建一与源FS大小相同的临时FS
#mount /tempfs
将临时FS安装目标VG上
#cd /sourcefs
#find . � print|tar cvf /tempfs
将源FS的内容拷贝至临时FS
#smit crfs
#mount /newfs
在目标VG上创建一与临时FS大小相同的新FS
#cd /tempfs
#find . �print|tar cvf /newfs
将临时FS的内容拷贝至新FS
#rmfs /tempfs
将目标VG中的临时FS删除。(源FS和新FS可以同名)。

10.在不重新创建和删除VG的基础上,更改VG名:
#umount �a
卸载所有属于VG的FS
#varyoffvg VG_Name
#exportvg VG_Name
卸载VG
#smitty importvg
装载VG,在VG name域中输入新的VG名,在PV name域中输入属于此VG的任一块PV名
#mount FS_Name
装载所有属于此VG的FS

AIX 存储笔记

1.基本概念:
PV 物理卷:普通的直接访问的存储设备,有固定的和可移动的之分,代表性的就是硬盘。
vg 卷组:AIX中最大的存储单位,一个卷组由一组物理硬盘组成,也就是由一个或多个物理卷组成。
pp 物理分区:是把物理卷划分成连续的大小相等的存储单位,一个卷组中的物理分区大小都相等。
lp 逻辑分区:适映射物理分区的逻辑单位,一个逻辑分区可以对应一个也可以对应多个物理分区。
lv 逻辑卷:是指卷组中由多个逻辑分区组成的集合,逻辑卷中的逻辑分区是连续的,但是对应的物理分   区是不连续的,可以在一个磁盘上,也可以在不同的磁盘上。
fs 文件系统:是指在AIX系统中面向用户的存储空间。一个逻辑卷只能创建一个文件系统,也就是说一个    文件系统对应一个逻辑卷,如果删除逻辑卷也将删除文件系统。


2.存储结构:
逻辑卷lv 不能被直接访问,是生设备(裸设备),逻辑卷上建文件系统,文件系统可以被用户访问,是熟设备。文件系统里建目录,目录下建文件。
物理卷,卷组,物理分区,逻辑卷,逻辑分区,逻辑卷是面向操作系统的概念
文件系统,目录,文件是面向用户的概念。 

3.LVM的配置数据
卷组描述区(VGDA):描述卷组中的所有物理卷和逻辑卷的对应关系
卷组状态区(VGSA):记录卷组中物理卷和物理分区的状态信息,在卷组激活时,确定哪些物理分区可用
逻辑卷控制块(LVCB):位于每个逻辑卷开头,包含逻辑卷的信息,占用数百个字节

LVM管理命令就是对VGDA内容的更新,当一块硬盘变成PV时,这个硬盘开始保留一部分空间存放VGDA信息,当把它加入卷组中时,开始将卷组信息写入VGDA区域,当把它从卷组删除时,也同时清除VGDA数据,这个数据还存在于AIX系统的ODM库中,当导入一个卷组时,把VGDA信息写入ODM,导出时删除。 

4.磁盘Quorum
卷组的每一个物理卷至少包含着一份VGDA和VGSA。当一个卷组只有一块硬盘时,这块硬盘存有两份VGDA和VGSA,当这个卷组由两块硬盘时,其中一块存有两份,另一块存有一份,当卷组由三块以上硬盘时,每块硬盘存有一份。  如果磁盘Quorum存在,则必须保证卷组有51%以上的VGDA/VGSA可以正常访问。淡然也可以关闭磁盘Quorum。

5.逻辑存储管理的限制
VG数:每个系统最多255个VG
PV数:对于普通卷组,每个VG最多32个PV,对于大VG,每个卷组最多128个PV
PP数:每个PV最多有1016个PP
LV数:对于普通VG,每个卷组最多255个LV,对于大VG,每个VG最多512个LV
LP数:每个LV最多有32512个LP
PP和LP的大小:1M到1024M 必须是2的幂次方
LP映射PP的数量:一个LP可以映射1-3个PP

6.物理区域的分布
外边缘(Outer-Edge):存放很少访问的数据
外中间(Outer-Middle):创建逻辑卷时默认的位置
中间(Center):磁盘搜索时间最短,速度最快。
内中间(Inner-Middle):比中间稍慢一些
内边缘(Inner-Edge)存放很少访问的数据

7.向系统添加一块硬盘

方法一:
添加硬盘后起动机器,自动运行cfgmgr,直接查看结果,如果没有识别再手工配置。
#cfgmgr -v
#lspv
#chdev -l hdisk2 -a pv=yes

方法二:
系统不能重起时,县查看原有硬盘,然后安装新硬盘,检查新设备,配置新设备
#lspv
#cfgmgr -v
#lspv
#chdev -l hdisk2 -a pv=yes
#mkdev -c disk -s scsi -t 670mb -p scsi3 -w 6,0 -a pv=yes
#smit makdsk

8.修改物理卷属性
#chpv -a n hdisk1    禁止hdisk1在分配新的PP
#chpv -a y hdisk1    允许

#chpv -v r hdisk1    关闭hdisk1的可用性,无法通过逻辑形式读写和访问该物理卷
#chpv -v a hdisk1    允许

#chpv -c hdisk1      清除hdisk1上的引导记录
#smit chpv

9.显示物理卷信息

#lsdev -Cc disk  显示系统一定义和已配置的物理卷
#lspv            以不带任何参数的形式显示系统中所有物理卷信息 
#lspv hdisk0     显示一个物理卷hdisk0的属性
#lspv -l hdisk0  显示物理卷hdisk0上分布的逻辑卷。
#lspv -p hdisk0  显示物理卷上每个逻辑卷物理分区的分布情况,同时显示逻辑卷类型和文件mount点。
#lspv -M hdisk0  显示物理分区和逻辑分区的对应情况。

10迁移物理卷上的内容:

a.确定系统中有哪些磁盘可用
#lsdev -Cc dev
#lspv
#extendvg rootvg hdisk5

b.检查卷组中包含哪些磁盘,确认源磁盘和目标磁盘在同一个卷组中,
#lsvg -p rootvg
c.确定目的盘上有足够的空间存放源盘的内容
#lspv hdisk0 |grep "USED PPs"
#lspv hdisk5 |grep "USED PPs"
d.如果是rootvg 上的磁盘,检查引导逻辑卷是否在源磁盘上
#lspv -l hdisk0 |grep hd5
#megratepv -l hd5 hdisk0 hdisk5

e.重设系统引导记录
#bosboot -a -d /dev/hdisk5
#bosboot -m normal hdisk5
#mkboot -c -d /dev/hdisk0

f.迁移
#smit migratevg
#migratevg hdisk0 hdisk5
#migratevg -l lv01 hdisk0 hdisk5

g.删除原盘数据
#reducevg rootvg hdisk0
#rmdev -dl hdisk0
 

11.卷组管理

#mkvg -y datavg -d 6 -s 8 hdisk7 hdisk8
#smit mkvg      创建卷组是保证/etc/vg下有2M空间
#lsvg           查看系统所有VG
#lsvg -o        查看激活状态的VG
#lsvg rootvg    查看rootvg属性
#lsvg -l rootvg 查看rootvg里的LV
#lsvg -p rootvg 查看rootvg中包含的物理卷

#chvg -ay datavg 使卷组启动时自动激活
#chvg -an datavg 使卷组启动时不能自动激活
#chvg -u datavg  给卷组解锁

#extendvg datavg hdisk5
#reducevg datavg hdisk5
#varyonvg datavg
#varyoffvg datavg
#exportvg datavg
#importvg -y datavg hdisk5
#syncvg -p hdisk03 hdisk05   同步物理卷
#syncvg -v vg05 vg06         同步卷组vg05和vg06上的拷贝
#redefinevg -d hdisk0 rootvg   在ODM库中重定义卷组信息,

#swapoff paging_spce_name  使页面空间处于非活动状态
#mirrorvg -c 3 datavg   做3份拷贝的卷组镜像
#mirrorvg -S -c 3 datavg    后台同步

镜像环境中替换磁盘
#unmirrorvg datavg hdiak7   删除hdisk7上的镜像
#reduncevg datavg hdisk7    在卷组中删除hdisk7
#rmdev -dl hdisk7           在系统中删除hdisk7
#extendvg datavg hdisk7     将新盘加入datavg
#mirrorvg datavg            给卷组datavg做镜像
#unmirrorvg                 取消卷组镜像

12.逻辑卷管理

#getlvcb -TA hd2   查看逻辑卷控制块信息
#lsvg -l rootvg  查看rootvg上的逻辑卷信息
#lslv mylv        查看一个lv的详细属性
#lslv -l lv_01   显示一个逻辑卷所跨越的物理卷,以及PP在物理卷上的分布情况
#lslv -p hdisk1  显示物理卷上的逻辑卷分配图



Feb 29, 2008

Linux中十大超级命令


Linux中有非常多很有用的命令,比如ps, top, vmstat等等,这些是应用比较广泛的,广为人知的。还有一些命令,非常有用,但是应用并不是十分广泛,如果充分利用这些命令,有时可以完成一些复杂的任务,起到很奇妙的效果。今天就来介绍几个这样的命令:

Could the command-line tools you've forgotten or never knew save time and some frustration?

One incarnation of the so called 80/20 rule has been associated with software systems. It has been observed that 80% of a user population regularly uses only 20% of a system's features. Without backing this up with hard statistics, my 20+ years of building and using software systems tells me that this hypothesis is probably true. The collection of linux command-line programs is no exception to this generalization. Of the dozens of shell-level commands offered by Linux, perhaps only ten commands are commonly understood and utilized, and the remaining majority are virtually ignored.

Which of these dogs of the linux shell have the most value to offer? I'll briefly describe ten of the less popular but useful Linux shell commands, those which I have gotten some mileage from over the years. Specifically, I've chosen to focus on commands that parse and format textual content.

The working examples presented here assume a basic familiarity with command-line syntax, simple shell constructs and some of the not-so-uncommon linux commands. Even so, the command-line examples are fairly well commented and straightforward. Whenever practical, the output of usage examples is presented under each command-line execution.

The following eight commands parse, format and display textual content. Although not all provided examples demonstrate this, be aware that the following commands will read from standard input if file arguments are not presented.

  • Head/Tail

显示一个文件指定的前面或者后面多少行,也可以用来实时显示文件的动态情况。比较适合用来跟踪日至文件的变化情况。

As their names imply, head and tail are used to display some amount of the top or bottom of a text block. head presents beginning of a file to standard output while tail does the same with the end of a file. Review the following commented examples:

## (1) displays the first 6 lines of a file
head -6 readme.txt
## (2) displays the last 25 lines of a file
tail -25 mail.txt

Here's an example of using head and tail in concert to display the 11th through 20th line of a file.

# (3)
head -20 file | tail -10

Manual pages show that the tail command has more command-line options than head. One of the more useful tail option is -f. When it is used, tail does not return when end-of-file is detected, unless it is explicitly interrupted. Instead, tail sleeps for a period and checks for new lines of data that may have been appended since the last read.

## (4) display ongoing updates to the given
## log file

tail -f /usr/tmp/logs/daemon_log.txt

Imagine that a dæmon process was continually appending activity logs to the /usr/adm/logs/daemon_log.txt file. Using tail -f at a console window, for example, will more or less track all updates to the file in real time. (The -f option is applicable only when tail's input is a file).

If you give multiple arguments to tail, you can track several log files in the same window.

## track the mail log and the server error log
## at the same time.

tail -f /var/log/mail.log /var/log/apache/error_log

  • tac–Concatenate in Reverse

反过来显示一个指定的文件或者输入,同cat反过来记忆比价有效。

What is cat spelled backwards? Well, that's what tac's functionality is all about. It concatenates file order and their contents in reverse. So what's its usefulness? It can be used on any task that requires ordering elements in a last-in, first-out (LIFO) manner. Consider the following command line to list the three most recently established user accounts from the most recent through the least recent.

# (5) last 3 /etc/passwd records - in reverse
$ tail -3 /etc/passwd | tac
curly:x:1003:100:3rd Stooge:/homes/curly:/bin/ksh
larry:x:1002:100:2nd Stooge:/homes/larry:/bin/ksh
moe:x:1001:100:1st Stooge:/homes/moe:/bin/ksh

  • nl–Numbered Line Output

nl简单的一个行过滤器,可以在文件的前面标注上行号,并可以从指定的行号开始,还可以指定分割符号等等,请看下面的描述和例子。
nl is a simple but useful numbering filter. I displays input with each line numbered in the left margin, in a format dictated by command-line options. nl provides a plethora of options that specify every detail of its numbered output. The following commented examples demonstrate some of of those options:

# (6) Display the first 4 entries of the password
# file - numbers to be three columns wide and
# padded by zeros.
$ head -4 /etc/passwd | nl -nrz -w3
001root:x:0:1:Super-User:/:/bin/ksh
002daemon:x:1:1::/:
003bin:x:2:2::/usr/bin:
004sys:x:3:3::/:
#
# (7) Prepend ordered line numbers followed by an
# '=' sign to each line — start at 101.
$ nl -s= -v101 Data.txt
101=1st Line …
102=2nd Line …
103=3rd Line …
104=4th Line …
105=5th Line …
…….

  • fmt–format

fmt可以用来给指定的文件限制宽度,使显示起来符合规则,好看些。另外还有些特殊的参数可以使用,参考下面的描述。
The fmt command is a simple text formatter that focuses on making textual data conform to a maximum line width. It accomplishes this by joining and breaking lines around white space. Imagine that you need to maintain textual content that was generated with a word processor. The exported text may contain lines whose lengths vary from very short to much longer than a standard screen length. If such text is to be maintained in a text editor (like vi), fmt is the command of choice to transform the original text into a more maintainable format. The first example below shows fmt being asked to reformat file contents as text lines no greater than 60 characters long.

# (8) No more than 60 char lines
$ fmt -w 60 README.txt > NEW_README.txt
#
# (9) Force uniform spacing:
# 1 space between words, 2 between sentences
$ echo "Hello World. Hello Universe." |
fmt -u -w80
Hello World. Hello Universe.

  • fold–Break Up Input

fold有点类似于fmt地用法,但是用法更加特殊,参考下面的描述。
fold is similar to fmt but is used typically to format data that will be used by other programs, rather than to make the text more readable to the human eye. The commented examples below are fairly easy to follow:

# (10) format text in 3 column width lines
$ echo oxoxoxoxo | fold -w3
oxo
xox
oxo
# (11) Parse by triplet-char strings -
# search for 'xox'
$ echo oxoxoxoxo | fold -w3 | grep "xox"
xox
# (12) One way to iterate through a string of chars
$ for i in $(echo 12345 | fold -w1)
> do
> ### perform some task …
> print $i
> done
1
2
3
4
5

上面的例子似乎不那么有效,更加有效的方法是:

for i in `seq 5`; do print $i;done

seq(1) allows to define start, stop, step and more.

  • tr

tr is a simple pattern translator. Its practical application overlaps a bit with other, more complex tools, such as sed and awk [with larger binary footprints]. tr is quite useful for simple textual replacements, deletions and additions. Its behavior is dictated by "from" and "to" character sets provided as the first and second argument. The general usage syntax of tr is as follows:

# (13) tr usage
tr [options] "set1″ ["set2″] <> output

Note that tr does not accept file arguments; it reads from standard input and writes to standard output. When two character sets are provided, tr operates on the characters contained in "set1″ and performs some amount of substitution based on "set2″.

  • pr

相对于tr或者其他命令,pr命令主要用于打印的格式。
pr shares features with simpler commands like nl and fmt, but its command-line options make it ideal for converting text files into a format that's suitable for printing. pr offers options that allow you to specify page length, column width, margins, headers/footers, double line spacing and more.

Aside from being the best suited formatter for printing tasks, pr also offers other useful features. These features include allowing you to view multiple files vertically in adjacent columns or columnizing a list in a fixed number of columns.

  • Miscellaneous

The following two commands are specialized parsers used to pick apart file path pieces.

Basename/Dirname
The basename and dirname commands are useful for presenting portions of a given file path. Quite often in scripting situations, it's convenient to be able to parse and capture a file name or the containing-directory name portions of a file path. These commands reduce this task to a simple one-line command. (There are other ways to approach this using the Korn shell or sed "magic", but basename and dirname are more portable and straightforward).

basename is used to strip off the directory, and optionally, the file suffix parts of a file path. Consider the following trivial examples:

:# (14) Parse out the Java Class name
$ basename
/usr/local/src/java/TheClass.java .java
TheClass
# (15) Parse out the file name.
$ basename srcs/C/main.c
main.c

dirname is used to display the containing directory path, as much of the path as is provided. Consider the following examples:

# (16) absolute and relative directory examples
$ dirname /homes/curly/.profile
/homes/curly
$ dirname curly/.profile
curly
#
# (17) From any korn-shell script, the following
# line will assign the directory from where
# the script was launched
SCRIPT_HOME="$(dirname $(whence $0))"
#
# (18)
# Okay, how about a non-trivial practical example?
# List all directories (under $PWD that contain a
# file called 'core'.
$ for i in $(find $PWD -name core )^
> do
> dirname $i
> done | sort -u
bin
rje/gcc
src/C

至此,这几个命令就介绍完了,希望能给你的工作带来帮助,如果要更详细地用法,可以参考man命令的帮助。

作者:RickyZhu From:Ricky's Space RickyZhu Blog

Tag:

不错,作者有很好的Linux的功底.特全文转载.