April 2007 Archives

ROWID的含义与块地址rdba深入分析

转载自:http://www.ixdba.com/html/y2007/m04/77-oracle-rowid-rdba.html

Oracle 8以下ROWID组成(也叫受限 Rowid)为:FFFF.BBBBBBBB.RRRR,占用6个字节(10bit file#+22bit+16bit),但是,为了扩充的需要,如数据文件的扩充,现在的Rowid改为:OOOOOOFFFBBBBBBRRR,占用 10个字节(32bit+10bit rfile#+22bit+16bit)。其中,O是对象ID,F是文件ID,B是块ID,R是行ID。由于rowid的组成从file#变成了 rfile#,所以数据文件数的限制也从整个库不能超过1023个变成了每个表空间不能超过1023个数据文件。

注意:这里的O,代表的是 data_object_id,是与段物理存储位置相关的一个信息,因为一个段对象只可能在一个表空间上,data_object_id能唯一确认 ts#,而data_object_id + rfile#就能最终定位到该rowid在那个确定的物理数据文件。

如果我们查询一个表的ROWID,就可以获得object的信息,文件信息,块信息与行信息等等,如根据其中块的信息,可以知道该表确切占用了多少个块,每行在哪个块上,哪个数据文件上。

用例子说明一下Rowid的组成:

  1. SQL> select rowid from emp where rownum = 1; 
  2.      AAAAeNAADAAAAWZAAA

分解一下,可以看到

Data Object number = AAAAeN

File = AAD

Block = AAAAWZ

ROW = AAA

另外,我们需要注意的是,ROWID是64进制的,分布关系如下

A-Z <==> 0 - 25 (26)

a-z <==> 26 - 51 (26)

0-9 <==> 52 - 61 (10)

+/ <==> 62 - 63 (2)

拿其中的Data Object number= AAAAeN为例子,

N是64进制中的13,位置为0

13 * (64 ^ 0) = 13

E是64进制中的30,位置为1

30 * (64 ^ 1) = 1920

A是64进制中的 0

所以

A * (64 ^ 2) = 0

A * (64 ^ 3) = 0

A * (64 ^ 4) = 0

A * (64 ^ 5) = 0

则有AAAAeN = 0 + 0 + 0 + 0 + 1920 + 13 = 1933,表示该行存在的对象,对应的对象号为1933。

而且,我们也可以利用oracle提供的包,dbms_rowid来做到这一点:

  1. select dbms_rowid.rowid_object('AAAAeNAADAAAAWZAAA') data_object_id#,
  2.        dbms_rowid.rowid_relative_fno('AAAAeNAADAAAAWZAAA') rfile#,
  3.        dbms_rowid.rowid_block_number('AAAAeNAADAAAAWZAAA') block#,
  4.        dbms_rowid.rowid_row_number('AAAAeNAADAAAAWZAAA') row# from dual;
  5.  
  6.        DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#
  7.        --------------- ---------- ---------- ----------
  8.                   1933          3       1433          0

关于更多dbms_rowid的用法,可以参考包的说明或者是oracle手册。

如果明白了以上ROWID的含义,那么我们就很容易理解块的地址了rdba了,也就是ROWID中的FFFBBBBBB部分,10bit rfile#+22bit,如我们分析一个块地址:

DBA: 0×2fc0100a

那么,把0×2fc0100a转换成2进制为

2 f c 0 1 0 0 a

0010 1111 1100 0000 0001 0000 0000 1010

再次转换

0010 1111 11 00 0000 0001 0000 0000 1010

=—————— —————————

数据文件id 块ID

=191(十进制) =4106(十进制)

或者0×2fc0100a=十进制的801116170

  1. SQL> select dbms_utility.data_block_address_file(801116170) "file",
  2.   2         dbms_utility.data_block_address_block(801116170) "block" 
  3.   3         from dual;
  4.  
  5.       file      block
  6. ---------- ----------
  7.        191       4106

注意,这里得到的191是rfile#,相对文件号,而相对文件号是不能超过1023,所以,如果你想根据这个地址来dump数据文件块的话,最好还是核对一下v$datafile:

select file# from v$datafile where rfile# = 191 and ts# = <:dbfile_in_ts>

  1. SQL> select file# from v$datafile where rfile# = 191 and ts# = 9;
  2.  
  3.      FILE#
  4. ----------
  5.       1214

这里的9代表该数据文件所在的表空间的编号,你是不是惊奇的发现,这个块地址真正的数据文件编号应当是1214。而不是我们转换得到的191。

不过一般的情况下,数据库的数据文件都没有1023个,所以这个时候的数据文件编号file#与rfile#基本是对应的,这个时候,如果我们要dump这个数据块,就可以采用如下的方式来dump

  1. alter system dump datafile 1214 block 4106;

如何使用ftp从Metalink上下载补丁

转载自:http://www.eygle.com/archives/2007/04/ftp_metalink_download.html

刚才去 metalink 下载 10g 的 patch,下到中途,重启了下电脑,就不能继续下载了,想到可能需要 metalink 认证,于是重新登陆了一下 metalink,但还是不能下载,想到之前在 eygle 那儿看到过使用 ftp 下载补丁的办法,找出来用了一下,可以断点续传了,哈哈,将该文转载于此。

Oracle提供一个站点可以用于通过ftp下载Oracle的所有Patch,这个站点是updates.oracle.com。
我们可以在命令行登录,当然需要一个Metalink帐号认证:

C:\>ftp updates.oracle.com
Connected to bigip-aru.oracle.com.
220 FTP server ready.
User (bigip-aru.oracle.com:(none)): metalink@eygle.com
331 Username OK, please send password.
Password:
230-
230- Welcome to the Oracle Patch Download FTP Server
230-
230- For detailed help, use command "quote site help".
230

注意根目录是不能ls的,因为Patch是海量的:

ftp> ls
200 PORT command OK.
150 Opening data connection for file listing.
226-Listing complete. Data connection has been closed.
226-It is the policy of this server to deny all
226-requests to list from the root directory.
226-Only directories with names which match
226 bug numbers exist and there are too many to be listed.

我们必须知道确切的Patch号才能导航到下一级目录,我今天是下载了一个Windows上的10203的补丁:

ftp> cd 5337014
250 Changed directory OK.
ftp> ls -al
200 PORT command OK.
150 Opening data connection for file listing.
total 1
-r--r--r-- 1 root other 1604896973 Feb 22 02:58 p5337014_10203_AIX64-5L.zip
-r--r--r-- 1 root other 1424057924 Feb 22 02:37 p5337014_10203_HP64.zip
-r--r--r-- 1 root other 1443790237 Mar 15 14:14 p5337014_10203_IBMPower.zip
-r--r--r-- 1 root other 944121770 Feb 21 03:20 p5337014_10203_LINUX.zip
-r--r--r-- 1 root other 1209745348 Feb 22 02:35 p5337014_10203_Linux-IA64.zip
-r--r--r-- 1 root other 1082086597 Feb 22 02:28 p5337014_10203_Linux-x86-64.zip
-r--r--r-- 1 root other 937018969 Feb 23 03:30 p5337014_10203_MSWIN-x86-64.zip
-r--r--r-- 1 root other 881471858 Feb 26 15:51 p5337014_10203_MVS.zip
-r--r--r-- 1 root other 1254311329 Feb 22 03:03 p5337014_10203_SOLARIS64.zip
-r--r--r-- 1 root other 893831865 Feb 21 03:39 p5337014_10203_WINNT.zip
-r--r--r-- 1 root other 1122786231 Feb 23 03:30 p5337014_10203_WINNT64.zip
226 Listing complete. Data connection has been closed.
ftp: 收到 946 字节,用时 0.00Seconds 946000.00Kbytes/sec.
ftp> quit
221 Goodbye. Service closing connection.

这种方法还是的确方便的,记录一下。

Oracle10g 10.2.0.3 WINNT的补丁居然有800多M,再记录一下Flashget的下载信息:

URL ftp://updates.oracle.com/5337014/p5337014_10203_WINNT.zip
注释
引用页
续传 Yes
本地文件 e:\Downloads\p5337014_10203_WINNT.zip
日期 02/21/07 03:39:00
大小 893831865
完成 893831865
总耗时 01:09:12
平均速度 210.23 KB/s
创建时间 04/10/07 13:51:00
完成时间 04/10/07 15:00:52

 

基于 column 的 update trigger demo

转载自:http://tomszrp.itpub.net/post/11835/262869

Sky 注:
可以根据 updating('column_name') 判断具体更新哪个列,从而做不同的操作
当更新表的 b 列时,trigger 中仍然可以通过 :new.column_name 来修改 b 以外的其他列(这点挺有意思)

在很多应用系统中,我们经常通过trigger 来实现一些关联业务表上的数据同步,有时候我们需要在某一或几列上点火,但不同的column需要对应不同的点火动作,下面的示例代码就完成了这样一个动作,希望对有类似需求的同志有所启示。

关于更详细的语法规则请参考Oracle SQL Reference

先设计一张表tomas_test,如下

SQL> create table tomas_test(a int, b int, a_memo varchar2(32),b_memo varchar2(32));

表已创建。

SQL> insert into tomas_test values(1,2,'Initial At '||sysdate,'Initial At '||sysdate);

已创建 1 行。

SQL> select * from tomas_test;

A B A_MEMO B_MEMO
----- ------ -------------------------------- -------------------------------
1 2 Initial At 2007-02-12 10:05:21 Initial At 2007-02-12 10:05:21

SQL>

下面设计一个trigger

SQL> create or replace trigger trig_update_tomas_test
2 before update of a,b on tomas_test
3 for each row
4 begin
5 if updating('a') then
6 :new.a_memo:='Updated At '||sysdate;
7 end if;
8 if updating('b') then
9 :new.b_memo:='Updated At '||sysdate;
10 end if;
11 end;
12 /

触发器已创建

SQL>

测试
SQL> select * from tomas_test;

A B A_MEMO B_MEMO
----- ----- -------------------------------- -------------------------------
1 2 Initial At 2007-02-12 10:05:21 Initial At 2007-02-12 10:05:21

SQL> update tomas_test set a=10 where a=1;

已更新 1 行。

SQL> select * from tomas_test;

A B A_MEMO B_MEMO
----- ----- -------------------------------- -------------------------------
10 2 Updated At 2007-02-12 10:08:08 Initial At 2007-02-12 10:05:21

SQL> update tomas_test set b=20 where b=2;

已更新 1 行。

SQL> select * from tomas_test;

A B A_MEMO B_MEMO
----- ----- -------------------------------- -------------------------------
10 20 Updated At 2007-02-12 10:08:08 Updated At 2007-02-12 10:08:19

SQL>

一个8i上的错误ORA-3232

       前几天公司数据库也碰到了这个错误,看到杨兄的这篇 blog,记录于此。

       转载于:http://yangtingkun.itpub.net/post/468/201214

今天同事问我一个错误,错误号ORA-03232,在9i的错误参考文档中,居然没有找到,刚开始还认为是10g的错误,后来才发现原来是8i上的错误。

好长时间没有接触Oracle8i的数据库,正好把错误解决过程记录下来,留做备忘。

由于是远程指导操作,很多信息没有得到。同事告诉我的错误信息为:ORA-03232,错误描述是:无法分配 9 (源于表空间 3) 的区。

由于手头没有8i的文档可查,根据个人感觉似乎是表空间不足,通过判断错误应该发生在TEMP表空间。

而且,数据库分配给TEMP表空间的数据文件大小只有1G,因此凭感觉就给TEMP表空间增加了1G的空间。

但是问题仍然存在,通过查询文档才发现,不是空间不够用,而是Oracle在分配空间是出的问题:

ORA-3232: unable to allocate an extent of %s blocks from tablespace %s

Cause: An attempt was made to specify a HASH_MULTIBLOCK_IO_COUNT value that

is greater than the tablespace's NEXT value

Action: Increase the value of NEXT for the tablespace using ALTER TABLESPACE

DEFAULT STORAGE or decrease the value of HASH_MULTIBLOCK_IO_COUNT.

看来是由于临时表空间的NEXT参数小于了HASH_MULTIBLOCK_IO_COUNT*DB_BLOCK_SIZE的值造成的。

HASH_MULTIBLOCK_IO_COUNT的值是0,说明Oracle自动计算每次需要使用的值。

知道了问题的原因,解决到也不麻烦,一个是将HASH_MULTIBLOCK_IO_COUNT设置为非0值,且小于NEXT参数的设置,另一中方法是增大TEMP表空间的NEXT默认存储参数。

于是,运行SQLALTER TABLESPACE TEMP DEFAULT STORAGE (NEXT 512K)问题解决。

9i及以上版本,废除了HASH_MULTIBLOCK_IO_COUNT这个初始化参数,因此这个错误也不会发生了。

物化视图日志结构

转载于:http://yangtingkun.itpub.net/post/468/20498

物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途。

物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。

物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECT ID几种类型,同时还可以指定SEQUENCE或明确指定列名。上面这些情况产生的物化视图日志的结构都不相同。

任何物化视图都会包括的列:

SNAPTIME$$:用于表示刷新时间。

DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。

OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。

CHANGE_VECTOR$$表示修改矢量,用来表示被修改的是哪个或哪几个字段。

如果WITH后面跟了ROWID,则物化视图日志中会包含:

M_ROW$$:用来存储发生变化的记录的ROWID。

如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。

如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:

SYS_NC_OID$:用来记录每个变化对象的对象ID。

如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:

SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。

如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。

 

下面通过例子进行详细说明:

SQL> create table t_rowid (id number, name varchar2(30), num number);

表已创建。

SQL> create materialized view log on t_rowid with rowid, sequence (name, num) including new values;

实体化视图日志已创建。

SQL> create table t_pk (id number primary key, name varchar2(30), num number);

表已创建。

SQL> create materialized view log on t_pk with primary key;

实体化视图日志已创建。

SQL> create type t_object as object (id number, name varchar2(30), num number);
  2  /

类型已创建。

SQL> create table t_oid of t_object;

表已创建。

SQL> create materialized view log on t_oid with object id;

实体化视图日志已创建。

建立环境后来看看物化视图日志中包含的自动:

SQL> desc mlog$_t_rowid
 名称                                    是否为空? 类型
 --------------------------------------- -------- -------------
 NAME                                             VARCHAR2(30)
 NUM                                              NUMBER
 M_ROW$$                                          VARCHAR2(255)
 SEQUENCE$$                                       NUMBER
 SNAPTIME$$                                       DATE
 DMLTYPE$$                                        VARCHAR2(1)
 OLD_NEW$$                                        VARCHAR2(1)
 CHANGE_VECTOR$$                                  RAW(255)

除了最基本的4列之外,由于指定了ROWID、SEQUENCE和NAME、NUM列,因此物化视图日志中包含了相对应的列。

SQL> desc mlog$_t_pk
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------
 ID                                                 NUMBER
 SNAPTIME$$                                         DATE
 DMLTYPE$$                                          VARCHAR2(1)
 OLD_NEW$$                                          VARCHAR2(1)
 CHANGE_VECTOR$$                                    RAW(255)

主键物化视图日志中除了基本列之外还包括基本的主键。

SQL> desc mlog$_t_oid
 名称                                    是否为空? 类型
 --------------------------------------- -------- -------------
 SYS_NC_OID$                                      RAW(16)
 SNAPTIME$$                                       DATE
 DMLTYPE$$                                        VARCHAR2(1)
 OLD_NEW$$                                        VARCHAR2(1)
 CHANGE_VECTOR$$                                  RAW(255)

对象表的物化视图日志建立后包含系统对象标识列。

一、主键列、ROWID列、OBJECT ID列、SEQUENCE列和建立物化视图时指明的列。

主键、ROWID或OBJECT ID用来唯一表示物化视图日志中的记录。

SEQUENCE会根据操作发生的顺序对物化视图日志中的记录编号。

建立物化视图时指明的列会在物化视图日志中进行记录。

SQL> insert into t_rowid values (1, 'a', 5);

已创建 1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新 1 行。

SQL> delete t_rowid;

已删除 1 行。

SQL> select name, num, m_row$$, sequence$$, dmltype$$ from mlog$_t_rowid;

NAME              NUM M_ROW$$            SEQUENCE$$ D
---------- ---------- ------------------ ---------- -
a                   5 AAACIDAAFAAAAD4AAA      70019 I
a                   5 AAACIDAAFAAAAD4AAA      70020 U
c                   5 AAACIDAAFAAAAD4AAA      70021 U
c                   5 AAACIDAAFAAAAD4AAA      70022 D

SQL> insert into t_pk values (1, 'a', 5);

已创建 1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新 1 行。

SQL> delete t_pk;

已删除 1 行。

SQL> select id, dmltype$$ from mlog$_t_pk;

        ID D
---------- -
         1 I
         1 U
         1 D

SQL> insert into t_oid values (1, 'a', 5);

已创建 1 行。

SQL> update t_oid set name = 'c' where id = 1;

已更新 1 行。

SQL> delete t_oid;

已删除 1 行。

SQL> select sys_nc_oid$, dmltype$$ from mlog$_t_oid;

SYS_NC_OID$                      D
-------------------------------- -
9F6DA94248EE40D5AB1E50700F9566EA I
9F6DA94248EE40D5AB1E50700F9566EA U
9F6DA94248EE40D5AB1E50700F9566EA D

SQL> rollback;

回退已完成。

二、时间列

当基本发生DML操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒。如果物化视图日志供多个物化视图使用,则一个物化视图刷新后会将它刷新的记录的时间更新为它刷新的时间。

下面建立快速刷新的两个物化视图来演示时间列的变化。(只有建立快速刷新的物化视图才能使用物化视图日志,如果只建立一个物化视图,则物化视图刷新完会将物化视图日志清除掉。

SQL> create materialized view mv_t_rowid refresh fast on commit as
  2  select name, count(*) from t_rowid group by name;

实体化视图已创建。

SQL> create materialized view mv_t_rowid1 refresh fast as
  2  select name, count(*) from t_rowid group by name;

实体化视图已创建。

SQL> insert into t_rowid values (1, 'a', 5);

已创建 1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新 1 行。

SQL> delete t_rowid;

已删除 1 行。

SQL> select snaptime$$ from mlog$_t_rowid;

SNAPTIME$$
-------------------
4000-01-01 00:00:00
4000-01-01 00:00:00
4000-01-01 00:00:00
4000-01-01 00:00:00

SQL> commit;

提交完成。

SQL> select snaptime$$ from mlog$_t_rowid;

SNAPTIME$$
-------------------
2005-03-05 00:40:32
2005-03-05 00:40:32
2005-03-05 00:40:32
2005-03-05 00:40:32

COMMIT后,物化视图mv_t_rowid刷新,将SNAPTIME$$列更新成自己的刷新时间。

 

三、操作类型和新旧值

操作类型比较简单:只包括I(INSERT)、D(DELETE)和U(UPDATE)三种。

新旧值也包括三种:O表示旧值(一般对应的操作时DELETE)、N表示新值(一般对应的操作是INSERT),还有一种U(对应UPDATE操作)。

SQL> insert into t_pk values (1, 'a', 5);

已创建 1 行。

SQL> insert into t_pk values (2, 'b', 7);

已创建 1 行。

SQL> insert into t_pk values (3, 'c', 9);

已创建 1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新 1 行。

SQL> update t_pk set id = 4 where id = 2;

已更新 1 行。

SQL> delete t_pk where id = 3;

已删除 1 行。

SQL> select id, dmltype$$, old_new$$ from mlog$_t_pk;

        ID D O
---------- - -
         1 I N
         2 I N
         3 I N
         1 U U
         2 D O
         4 I N
         3 D O

已选择7行。

开始是插入三条记录,接着是UPDATE操作。需要注意,对于基于主键的物化视图日志,如果更新了主键,则UPDATE操作转化为一条DELETE操作,一条INSERT操作。最后是DELETE操作。

SQL> drop materialized view log on t_rowid;

实体化视图日志已删除。

SQL> create materialized view log on t_rowid with rowid, sequence (name, num) including new values;

实体化视图日志已创建。

SQL> insert into t_rowid values (1, 'a', 5);

已创建 1 行。

SQL> insert into t_rowid values (2, 'b', 7);

已创建 1 行。

SQL> insert into t_rowid values (3, 'c', 9);

已创建 1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新 1 行。

SQL> update t_rowid set id = 4 where id = 2;

已更新 1 行。

SQL> delete t_rowid where id = 3;

已删除 1 行。

SQL> select name, num, m_row$$, dmltype$$, old_new$$ from mlog$_t_rowid;

NAME              NUM M_ROW$$            D O
---------- ---------- ------------------ - -
a                   5 AAACIDAAFAAAAD4AAC I N
b                   7 AAACIDAAFAAAAD4AAA I N
c                   9 AAACIDAAFAAAAD4AAB I N
a                   5 AAACIDAAFAAAAD4AAC U U
c                   5 AAACIDAAFAAAAD4AAC U N
b                   7 AAACIDAAFAAAAD4AAA U U
b                   7 AAACIDAAFAAAAD4AAA U N
c                   9 AAACIDAAFAAAAD4AAB D O

已选择8行。

查询结果和上面类似,唯一的区别是每条UPDATE 操作都对应物化视图日志中的两条记录。一条对应UPDATE操作的原记录DMLTYPE$$和OLD_NEW$$都为U,一条对应UPDATE操作后的新 记录,DMLTYPE$$为U,OLD_NEW$$为N。当建立物化视图日志时指出了INCLUDING NEW VALUES语句时,就会出现这种情况。

 

四、修改矢量

最后简单讨论一下CHANGE_VECTOR$$列。

INSERT和DELETE操作都是记录集的,即INSERT和DELETE会影响整条记录。而UPDATE操作是字段集的,UPDATE操作可能会更新整条记录的所有字段,也可能只更新个别字段。

无论从性能上考虑还是从数据的一致性上考虑,物化视图刷新时都应该是基于字段集。Oracle就是通过CHANGE_VECTOR$$列来记录每条记录发生变化的字段包括哪些。

基于主键、ROWID和OBJECT ID的物化视图日志在CHANGE_VECTOR$$上略有不同,但是总体设计的思路是一致的。

CHANGE_VECTOR$$列是RAW类型,其实Oracle采用的方式就是用每个BIT位去映射一个列。

比如:第一列被更新设置为02,即00000010。第二列设置为04,即00000100,第三列设置为08,即00001000。当第一列和第二列同时被更新,则设置为06,00000110。如果三列都被更新,设置为0E,00001110。

依此类推,第4列被更新时为10,第5列20,第6列40,第7列80,第8列0001。当第1000列被更新时,CHANGE_VECTOR$$的长度为1000/4+2为252。

除了可以表示UPDATE 的字段,还可以表示INSERT和DELETE。DELETE操作CHANGE_VECTOR$$列为全0,具体个数由基表的列数决定。INSERT操作 的最低位为FE如果基表列数较多,而存在高位的话,所有的高位都为FF。如果INSERT操作是前面讨论过的由UPDATE操作更新了主键造成的,则这个 INSERT操作对应的CHANGE_VECTOR$$列为全FF。

SQL> insert into t_rowid values (1, 'a', 5);

已创建 1 行。

SQL> insert into t_rowid values (2, 'b', 7);

已创建 1 行。

SQL> insert into t_rowid values (3, 'c', 9);

已创建 1 行。

SQL> update t_rowid set name = 'c' where id = 1;

已更新 1 行。

SQL> update t_rowid set id = 4 where id = 2;

已更新 1 行。

SQL> update t_rowid set name = 'd', num = 11 where id = 3;

已更新 1 行。

SQL> delete t_rowid where id = 3;

已删除 1 行。

SQL> select name, num, m_row$$, dmltype$$, old_new$$, change_vector$$ from mlog$_t_rowid;

NAME                        NUM M_ROW$$            D O CHANGE_VEC
-------------------- ---------- ------------------ - - ----------
a                             5 AAACIgAAFAAAAD4AAA I N FE
b                             7 AAACIgAAFAAAAD4AAB I N FE
c                             9 AAACIgAAFAAAAD4AAC I N FE
a                             5 AAACIgAAFAAAAD4AAA U U 04
c                             5 AAACIgAAFAAAAD4AAA U N 04
b                             7 AAACIgAAFAAAAD4AAB U U 02
b                             7 AAACIgAAFAAAAD4AAB U N 02
c                             9 AAACIgAAFAAAAD4AAC U U 0C
d                            11 AAACIgAAFAAAAD4AAC U N 0C
d                            11 AAACIgAAFAAAAD4AAC D O 00

已选择10行。

可以看到,正如上面分析的,INSERT为FE,DELETE为00,对第一列的更新为02,第二列为04,第二列和第三列都更新为0C。需要注意,正常情况下,第一列会从02开始,但是如果对MLOG$表执行了TRUNCATE操作,或者重建了物化视图日志,则可能造成第一列开始位置发生偏移。

SQL> insert into t_pk values (1, 'a', 5);

已创建 1 行。

SQL> insert into t_pk values (2, 'b', 7);

已创建 1 行。

SQL> insert into t_pk values (3, 'c', 9);

已创建 1 行。

SQL> update t_pk set name = 'c' where id = 1;

已更新 1 行。

SQL> update t_pk set id = 4 where id = 2;

已更新 1 行。

SQL> delete t_pk where id = 1;

已删除 1 行。

SQL> select * from mlog$_t_pk;

        ID SNAPTIME$$          D O CHANGE_VEC
---------- ------------------- - - ----------
         1 4000-01-01 00:00:00 I N FE
         2 4000-01-01 00:00:00 I N FE
         3 4000-01-01 00:00:00 I N FE
         1 4000-01-01 00:00:00 U U 04
         2 4000-01-01 00:00:00 D O 00
         4 4000-01-01 00:00:00 I N FF
         1 4000-01-01 00:00:00 D O 00

已选择7行。

这个结果和ROWID类型基本一致,不同的是,如果更新了主键,会将UPDATE操作在物化视图日志中记录为一条DELETE和一条INSERT,不过这时INSERT对应的CHANGE_VECTOR$$的值是FF。

SQL> insert into t_oid values (1, 'a', 5);

已创建 1 行。

SQL> update t_oid set name = 'c' where id = 1;

已更新 1 行。

SQL> update t_oid set id = 5 where id = 1;

已更新 1 行。

SQL> delete t_oid;

已删除 1 行。

SQL> select * from mlog$_t_oid;

SYS_NC_OID$                      SNAPTIME$$          D O CHANGE_VEC
-------------------------------- ------------------- - - ----------
94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 I N FE
94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 U U 10
94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 U U 08
94216425582C4395A987AFE6303A5CBF 4000-01-01 00:00:00 D O 00

SQL> select name, segcollength from sys.col$ where obj# =
  2  (select object_id from user_objects where object_name = 'T_OID');

NAME                 SEGCOLLENGTH
-------------------- ------------
SYS_NC_OID$                    16
SYS_NC_ROWINFO$                 1
ID                             22
NAME                           30
NUM                            22

这个结果也和ROWID类型基本一致,需要注意的是,由于对象表包含两个隐含列,因此ID不再是第一个字段,而是第三个,因此对应的值是08。

SQL> create table t (
  2  col1 number,
  3  col2 number,
  4  col3 number,
  5  col4 number,
  6  col5 number,
  7  col6 number,
  8  col7 number,
  9  col8 number,
 10  col9 number,
 11  col10 number,
 12  col11 number,
 13  col12 number
 14  );

表已创建。

SQL> create materialized view log on t with rowid;

实体化视图日志已创建。

SQL> insert into t values (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

已创建 1 行。

SQL> update t set col1 = 10;

已更新 1 行。

SQL> update t set col11 = 110;

已更新 1 行。

SQL> update t set col5 = 50, col12 = 120;

已更新 1 行。

SQL> delete t;

已删除 1 行。

SQL> select * from mlog$_t;

M_ROW$$            SNAPTIME$$          D O CHANGE_VEC
------------------ ------------------- - - ----------
AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 I N FEFF
AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 0200
AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 0008
AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 U U 2010
AAACIyAAFAAAAFgAAA 4000-01-01 00:00:00 D O 0000

最后看一个包含列数较多的例子,唯一需要注意的是,低位在左,高位在右。

 

Why is RAID 1+0 better than RAID 0+1?

转载于:http://aput.net/%7Ejheiss/raid10/

Of late I've heard much talk about RAID 1+0 being better than RAID 0+1, but never got a good answer why. Leah and I started talking about this over dinner one night and did a little math (literally on the back of a napkin) to calculate how much better. Here's what we figured out.

raid01

RAID 0+1 configuration where multiple disks are striped together into sets (sets A & B in the diagram, each set being as large as the resulting final volume), and then two or more sets are mirrored together.

raid10

RAID 1+0 configuration where two or more drives are mirrored together (mirrors 1-4 in the diagram), and then the mirrors (as many as are needed to result in the desired amount of space) are striped together.

In either case (0+1 or 1+0), the loss of a single drive does not result in failure of the RAID system. The difference comes in the chance that the loss of a second drive from the system will result in the failure of the whole system. In RAID 0+1, you have to lose one drive from each disk set to result in the failure of the whole system. In my diagram that would be one drive from set A and one drive from set B. In RAID 1+0, you have to lose all drives in a mirror. This would be both drives in any numbered pair in the diagram.

Mathematically, the difference is that the chance of system failure with two drive failures in a RAID 0+1 system with two sets of drives is (n/2)/(n - 1) where n is the total number of drives in the system. The chance of system failure in a RAID 1+0 system with two drives per mirror is 1/(n - 1). So, using the 8 drive systems shown in the diagrams, the chance that losing a second drive would bring down the RAID system is 4/7 with a RAID 0+1 system and 1/7 with a RAID 1+0 system.

The math gets more complicated when you have more than two elements to a mirror. Since that's a rare configuration, I haven't bothered to figure out the equations. If someone else would like to, I'll be glad to post them here.

Another difference between the two RAID configurations is performance when the system is in a degraded state, i.e. after it has lost one or more drives but has not lost the right combination of drives to completely fail. In a RAID 0+1 configuration, the loss of any drive in a set causes the failure of that entire set and the set is removed from the RAID system. Generally (in the two set case) this means you are left with a RAID 0 system made up of the remaining set of disks. This probably slightly improves write performance and slightly degrades read performance (but that's just a WAG, I haven't done any testing). In a RAID 1+0 system, you would see the same effect on each mirror that loses a drive, but not the whole system. In other words, a RAID 1+0 configuration will tend to show similar, but less dramatic, changes in performance when in a degraded mode than RAID 0+1. However, the changes will likely be slight in any case.

One more difference that was recently pointed out to me is the speed at which the RAID system recovers once the failed disk is replaced. RAID 1+0 only has to re-mirror one drive, whereas RAID 0+1 has to re-mirror the entire failed set. So RAID 1+0 will recover significantly faster.

RAID systems that support RAID 1+0

There used to be a list here of products that did or didn't support RAID 1+0. The list got too long for me to maintain. Ask the vendor or something. Usually you can find this in the documentation for the product, but it is frequently in the fine print.

Linux/BSD 和 Solaris 之差异数例

转载于:http://my.opera.com/jlake/blog/show.dml/487470  

常用命令:

Linux/BSD: ps -aux
Solaris: ps -ef

Linux/BSD: df
Solaris: df -k

Linux/BSD: ping
Solaris: ping -s

Linux/BSD: shutdown
Solaris: shutdown [-y] [-i] [-g]

Linux/BSD: top
Solaris: prstat

Linux/BSD: tcpdump
Solaris: snoop

Linux/BSD: fdisk
Solaris: format

Solaris下,为了照顾Linux用户的习惯,将一些命令放在 /usr/ucb 之下,用这些命令,能得和Linux相同的结果。

目录结构:

Linux下默认有 /usr/local,Solaris则默认无,Solaris下相应的路径是 /opt

Linux的log文件一般放在 /var/log 下,Solaris则根据log的种类分别放在 /var/log/var/adm 之下。

Linux下,root用户的主目录是 /root ,Solaris的root用户的主目录则是 /

Linux的磁盘设备名在 /dev/ 之下,如 /dev/sda1,Solaris的磁盘设备名在 /dev/dsk/ 之下,如 /dev/md/dsk/d10

20%的SOLARIS知识解决80%的问题

转载于:http://bbs.chinaunix.net/viewthread.php?tid=108308
电子版:点击下载文件

Rolf Kersten
德国Sun微系统股份有限公司
版本历史
日期 版本 简介
2002年05月25日 V1.8e 第一个英语发布版
2002年06月12日 V1.9e 第一次反馈(感谢Dnaiel Schmidberger!)
2002年07月19日 V1.10e 添加iostat章节
2002年09月04日 V1.11e Matt Ruetz的修订版
2002年12月05日 V1.12e 经过修正和增加的版本
2003年01月17日 V1.13e 被Halvard Halvorsen(www.sundot.com)和Sven Fink修正和附加的版本
2003年04月11日 V1.14e Sven和Andreas Fatum关于shell编译器和环境变量章节更多地说明
简介
这篇文档包含了你用solaris和Sun平台工作时所需要的最重要的20%的技术。它能处理你所遇到的80%的问题。
这篇文档并不打算覆盖Solaris处理环境的细节,也不会包含常见问题解答(相关的书和链接将在附录中给出)。这本书将用来为刚成为Solaris系统 管理员的新手或没有每天管理Solaris系统基础的人提供一种怎样收集这种信息的服务。这篇文章关注的方向是用来做技术开发的图形工作站,也将对希望为 建立一套用来演示或作为基准的Sun系统的人有所帮助。
两点提醒:
· 永远记住在记录日志中记录下你对系统的每一次改动
· 清楚的在头脑中记住这篇文档包含能让系统不可用的系统级的程序。除非你对它的破坏性做了仔细的分析,否则不要在正在使用的系统上执行这些程序。

1 系统启动和测试
1.1        OK提示符
每套SUN都有一个Boot-PROM模式,可以在启动操作系统之前访问,也可以在运行的时候访问,可以用STOP+A进入,如果没有STOP键 (PC),可以用ctrl+break.。一旦进入Boot-PROM模式,会出现OK提示符。如果操作系统运行时候出现,可以用go继续。
1.2 控制台测试
Boot-PROM模式可以用直接连接的键盘和显示器,也可以用终端。
如果系统启动时候没有检测到键盘,输入输出自动转到第1个串口(/dev/ttya,A),可以连接一个终端或者另一计算机(通过交叉串口线)到这个端口。
如果另外的计算机是SUN工作站,可以使用tip hardwire来查看启动控制台。Tip命令输入之后,所有的启动信息会出现在相应的终端窗口里面,如果被观察的机器用了STOP+A,必须使用 Strg-]把tip改成telnet模式,然后输入一个BREAK:telnet>;send brk
1.3 重新启动SUN工作站
重新启动之前,工作站需要进入一个合适的状态,可以使用下面及格命令退出:
# init 5  
# init 6
# init 0
SUN工作站在重新启动之前,会以一定的方式关闭系统,下面是几种可选择的方法:
最好、最干净的方法:
-        # init 5 关闭所有进程,然后系统自动关掉电源。
-        #init 6,关闭所有进程,然后系统自动从新启动。
-        #init 0,关闭所有进程,然后系统自动回到OK状态。
在这3种情况下,在系统关闭之前执行/etc/rc0.d下面的K*脚本,这可以用于关闭数据库,或者关闭WEB服务器的进程ID文件等。
如果没有合适的shell窗口,可以使用远程登录来执行上面的命令。远程也不可以,可以使用下面的方法:
-        STOP-A
-        OK sync 同步文件系统,中断OS,然后重启。
注意:需要察看随之产生的保存在/var/crash/<hostname>;下面的内核转储文件。
如果碰到STOP-A也不能使用的情况,必须关闭计算机电源,在打开电源。
1.4 系统的测试
   启动系统,在执行到内存测试的时候,按下STOP-A。
   下面的段落只描述很重要的命令。
   详细的描述可以在下面的书中《Hardware Diagnostics for Sun TM Systems: A Toolkit for System Adminis-trators》(Infodoc Number 23476 on http://sunsolve.sun.com)。
1.4.1 Banner(标识)
Banner显示下列信息:
. CPU的数量、类型和频率
. 内存
. MAC地址和主机地址(主机号)
. 控制台显示卡类型
   . Sun-Globe: Creator 3D
. Sun with face: Elite 3D
. Self-describing Logo: PGX, Raptor GFX (=PGX32), Expert3D(lite) XVR-500, XVR-1000 etc.
1.4.2检测
probe-scsi-all列出内置和外置的所有SCSI设备。对于IDE硬盘,使用:probe-ide-all.
1.4.3 测试所有
test-all.运行所有的自检,可以检测象网线是否正常等情况。
1.4.4 printenv and devalias
devalias列出所有别名,printenv列出所有变量。例如boot-device变量,定义了计算机启动的路径,一般情况下是disk,disk是一个指向特定设备的别名。
1.4.5禁止网卡错误信息
当网卡在没连接网线启动的时候,"Interface: No link"会出现多次,可以在OK下面设置
setenv tpe_link test false 来禁止这个报错信息。

2        管理硬盘
2.1 逻辑设备名
所有的硬盘都有一个共同的命名方案,该方案包括一下四个部分:
c 控制器号
t  目标号,对于SCSU设备,就是对应的SCSI地址。
d  驱动号或者是RAID设备的LUN 号(一个地址,多个硬盘)
S  分区号(见下一段)
这些逻辑设备的以连接方式放在/dev/dsk和/dev/rdsk目录里面,并指向物理设备名。但这些物理设备仅在改变启动设备时用到,一般的命令都以逻辑设备为参数。
例如:
c0t0d0s0 通常是工作站的第1硬盘,c0t1d0s0 是第2个 c0t6d0s0 是内部光驱(SCSI地址是6)
在OK提示下输入 boot –r可以更新/dev/dsk and /dev/rdsk目录里面的内容,devfsadm也可以。
Solaris8以前的需要用drvconfig;disks;devlinks3个命令来完成,刷新之后,probe-scsi-all所看到的设备的逻辑连接也就能看见了。
2.2 分区
下面是一个两个硬盘的工作站用format命令看到的内容
c0t0d0
c0t1d0
这里显示的是硬盘,不是分区或扇区,format的目的就是产生和管理分区,一个硬盘最多可以优个分区,用format-print可以查看。如果使用缺 省安装,Solaris安装工具就会把系统盘分成slices: / (root)  /usr  /var 和 /export/home。Solaris 8操作系统缺省安装产生3个分区,大约1G的根区,SWAP区(根据内存容量确定大小),剩余空间给/export/home.
   对于工作站来说,这个缺省分区不是最优化的,分区的容量不能在数据不丢失的情况下扩充。在分区空间用尽的情况下,必须使用符号连接。对于服务器来说,得保留一个分区给/var目录,
这样的话,保存在/var/tmp里面的记录和大文件就不会影响到根区,避免系统产生问题。
   建议工作站这样分区
slice 0: / root-Partition, incl. /usr, /var, /opt plus
/export/home
slice 1: swap 交换区,和物理内存一样大
slice 2: backup 不要改变这个分区!!代表整个硬盘
slice 7: sds 用于Solstice DiskSuite(TM) metadata的小分区
为了使用Solstice Disksuite logical volume manager (SDS),建议保留30M,用于拷贝"state replica databases".可以参阅后面的使用SDS镜像启动盘
从Solaris 8 02/02开始,会自动安装Live Upgrade。使用Live Upgrade,可以在系统正在运行的时候拷贝当前根的环境。例如可以测试新的操作系统而不用改变正在运行的系统。为了产生这个预备启动环境(ABS), 必须留出足够的空间,现在的硬盘空间足够大,可以使用下面分区:
slice 0: / root-partition, incl. /usr, /var, /opt
slice 1: swap swap-Partition, as large as physical memory
slice 2: backup Do not change this partition!
It is always the size of the whole disk
slice 3: /export OS-independent data, home-directories
slice 4: <not mountet>;, to be used as ABE with Live Upgrade
( about 150% of the expected size of / )
slice 7: sds A small space reserved for Disksuite metadata
2.3 Crashdumps
从Solaris 7开始,缺省情况下crashdump写到交换区上,这也是为什么交换区为什么和内存一样大的原因之一。下次启动的时候,从交换区中读取这个文件,压缩之 后写到var/crash/<hostname>;里面,用于以后的分析。因此/var(如果没有单独分出/var或者是/区)不能太小。
如果一个系统用了几个G的空间作为dump设备,启动时会由于上面提到的拷贝操作,花上很长时间。这时候,最好利用dumpadm定义一个dump分区, 从这个指定分区拷贝的操作会在后台运行。注意经常检查和清除/var/crash/<hostname>;,保证有足够的空间用于其他的 crashdumps.
2.4 Example
假如有一台E450系统并且有一个已经配置好的启动盘,但你不知道两件事情:(1)盘插哪里(系统又20个槽,必须装到安装系统时硬盘所在的槽里才能启动),(2)忘了超级用户口令。把     盘插到一个任意槽里,按下面的步骤:
    第1步 插入一个启动光盘(SOLARIS 安装盘)STOP+A,然后 boot cdrom –s。如果用外置光驱,就需要probe-scsi-all列出光驱位置,然后boot <光驱路径>; -s。系统起来之后,就有了一个不需要口令的超级用户窗口。
第2步 开始mount硬盘。首先用devfsadm重新建立设备,在/dev/dsk下面会有8个新文件。接下来使用format-print- partition确认盘已经装好,并找出来哪个分区是root分区,通常都是0区 。假设盘插到2槽,format会识别到c1t2d0(SCSI ID是2,第1个控制器),c1t2d0s0就是root分区,因此应该ount这个盘,fsck –Y /dev/rdsk/c1t2d0s0;mldir /tmp/disk;mount /dev/dsk/c1t2d0s0 /tmp/disk
第3步 首先清楚/tmp/etc/shadow里面的root后面的加密内容清空,然后查看/tmp/etc/vfstab里面看看该盘是不是第2槽的,如果是,/应该mount在/dev/dsk/c1t2d0s0,如果不是,就把硬盘插到相应的槽里面。
第4步 假设在/tmp/etc/vfstab里面看到的是/dev/dsk/c1t2d0s0,这说明在原来的系统里面启动盘就是第2槽,一般,E450会从第1槽启动(c1t0d0s0)。在/dev/dsk里面找到并记下来c1t0d0s0指向的物理设备文件名。
第5步 reboot,STOP+A,输入:boot <物理设备文件名>;。
第6步 定义别名, nvalias my disk <物理设备文件名>;,这样就可以输入boot mydisk就可以启动了。定义setenv boot-device mydisk,系统就会自动从mydisk启动了。
2.5 Removable Devices
2.5.1 Volume Management(卷管理)
可移动设备又卷管理器来负责,卷管理器检测CD-ROM并自动挂接到/cdrom/cdrom0下面。一些手工操作会造成卷管理器错误,比如使用曲别针打开光驱,而不是使用eject cdrom命令。只这时候需要手工重起卷管理器.
/etc/init.d/volmgt stop
/etc/init.d/volmgt  start
2.5.2 软驱
   插入软盘(UNIX或DOS格式)必须使用volcheck才能使用卷管理器管理软驱。如果volcheck成功,软驱会出现在/floppy/floppy0下面,使用eject floppy而不手工取出软盘。
2.5.3 CD-ROM
CDROM不需要volcheck,开机就会被检测到,并挂接在/cdrom/cdrom0下面,没有shell或命令使用/cdrom路径时可以使用 eject cdrom弹出光驱,fuser –c /cdrom/cdrom列出所有和光驱有关的进程ID或命令,fuser –k可以快速杀掉相关进程。
如果没有卷管理器,使用下面的方法管理CDROM(假设SCSI地址是6):
-        mkdir /tmp/cdrom
-        mount -F hsfs /dev/dsk/c0t6d0s0 /tmp/cdrom
- (Work with CD mounted on /tmp/cdrom)
- umount /tmp/cdrom
- eject /dev/dsk/c0t6d0s0
2.5.4 CD-R 和 CD-RW
CDRW,是一个与solaris 8 捆绑的工具,用来烧制CD-R或者CD-RW介质。这个工具也可以烧制用命令mkisofs从solaris文件系统和目录中创建的ISO镜象文件。
看下面带精确参数的例子:

#! /bin/sh
# ./nfscd <PARAMETER1>; <PARAMETER2>;
# PARAMETER1 = Application ID
# PARAMETER2 = from where
#
# ./nfscd SunNetManager /net/center2000/export/pkg/SUNWsnm
# set Umask
umask 022
# Remove old image
rm /data/disk.img
# Create image
mkisofs -A $1 -d -l -L -o /data/disk.img -P "Sun Microsystems" -p
"Solaris SPARC" -r -R -J -V "$1" -v $2
# Burn
cdrw -i /data/disk.img

2.5.5 磁带
磁带设备不是用卷管理器来控制的,它们必须用命令tar来处理。典型的磁带设备被作为一个外部SCSI设备连接到系统。当solaris OE 运行时它们的连接和配置就已经被完成了,在运行以前版本的solaris命令devfsadm(solaris 8 OE) 或者drvconfig; tapes;devlinks,你能找到一些逻辑的连接在/dev/rmt 目录。0描述的是第一个磁带设备,1是第二个磁带设备。
通过以上,你就可以访问这个磁带,用命令 tar tvf /dev/rmt/0.
注意:SGI系统写入的磁带通常只能用特定的块因子(blocksize)来读
tar tvfb 512 /dev/rmt/0
在某些情况下,需要进行字节交换操作,才能正确读取
dd if=/dev/rmt/0 conv=swab | tar tvfb 512 -
2.6 克隆磁盘
通过这部分的学习,你可以把一个系统克隆到另一个和它的硬件属于同一系列的系统中。例如克隆Ultra(TM) 10工作站到Ultra 10工作站是可以的,而克隆到Ultra 60工作站就是行不通的。
如果监测到目标系统的硬件结构和源系统有所不同的话(不同的结构缓冲,网卡等),目标系统在克隆以后需要用boot –r命令来重新配置。
2.6.1 使用内部磁盘来克隆
这种方式适合用于易于改变的内部磁盘:
·Ultra 30, Ultra 60, Ultra 80或者Sun Blade(TM) 100工作站或者E220R/E420R/E250R/E450
·Sun Enterprise(TM)220R, 420R, 250, 或者450服务器
内部的FC-AL磁盘(如Sun Blade 2000工作站和Sun Fire(TM) 280R或V880服务器)可能导致一些问题。
接下来是用Ultra 60工作站做的一个范例:
1   将目标盘插入主板上的第二个硬盘口
3        启动进入但用户模式(STOP-A; boot –s)
4        用devfsadm重新配置所有的磁盘
5        键入format察看硬盘的名称。在Ultra 60工作站上,你会看到c0t0d0和c0t1d0。C0t1d0是内部系统中最顶端的磁盘。
6        决定哪个盘是源盘,哪个盘是目标盘(不要忘记备份你的数据!)。在我们的例子中c0t0d0(底部的盘)作为源盘,c0t1d0(上面的盘)是目标盘。
7        dd if=/dev/rdsk/c0t0d0s2 of=/dev/dsk/c0t1d0s2 bs=128k(这条命令为整个盘,包括分区标的内容作了一个1:1的副本。如果源盘是一个9GB的盘,而目标盘是一个18GB的盘,那么将会有9GB的 容量被浪费)。警告:仔细检查这一步,避免对你源盘的意外损坏。
8        fsck –Y of=/dev/dsk/c0t1d0s0(检查启动分区的文件系统,一般来说是分区0)
9        移除源盘,将克隆好的盘放进先前源盘所在的位置。重新启动你新做好的克隆的系统

2.6.2 通过转接线来克隆
这种方式比上面描述的通过内部磁盘克隆要慢,但是它适合用于一些内部的磁盘不容易改变的系统(如Ultra 10或Ultra 5工作站)。
警告:记住文件“/.rhosts”仅仅在这个任务中使用,在完成这个任务之后删除它来避免系统的安全漏洞。
目标系统
启动
在注册屏幕上使用命令行注册(command line login)
尽可能地停止引起磁盘输入输出的进程
TERM=vt100vi /etc/inet/hosts
->;添加目标和源
ifconfig hme0 plumb
ifconfig hme0 <target>; netmask 255…up
->;测试rsh源
rsh source “dd if=/dev/rdsk/c0t0d0s2 ibs=128k obs=8k” | dd of=dev/rdsk/cotodos2 bis=128k obs=128k
(9GB的盘需要等待大约40分钟)
STOP-Aboot cdrom –s(用可引导的光盘引导)
fsck –Y /dev/rdsk/c0t0d0s0
源系统
在文件/.rhosts中添加目标IP
sync; sync;

2.7 用SDS制作磁盘镜像
Solaris逻辑卷面管理(SVM),一般是指Solstice Disksuite(SDS)软件,它可以把磁盘系统做成RAID 0, 1, 0+1或5。工作站最感兴趣的方式是RAID 1:为磁盘错误准备好了一个包含启动文件系统的磁盘镜像。
SVM是Solaris 9系统环境的一部分。在Solaris 8平台上,你可以在第二章光盘的“EA”目录下找到SDS软件。而在Solaris 7或者2.6系统环境中,服务器版,你可以查找一下光盘“Easy Access Server”。
我们假定一个工作站有两块内部的磁盘,c0t0d0和c0t1d0。这两块盘都以相同的方式被正确的分区:分区0被分配给/(root),分区1被分配给 交换区(swap),一个比较小的分区7被分配用来记录复制数据库(State Replica Databases)。分区2被定义成一个备份区(参见“分区”一章)。
把第一块盘的分区信息复制到第二块盘,可以用如下的命令:
# prtvtoc /dev/rdsk/c0t0d0s2 | fmthard -s - /dev/rdsk/c0t1d0s2
记录复制数据库是一个包含了镜像信息纪录的小文件。镜像中的每个磁盘都必须知道有三个记录复制数据库文件:
# metadb -a -f -c 3 c0t0d0s3 c0t1d0s3
下一步,在第一块磁盘上创建第一个子镜像,它包含了启动文件系统:
# metainit -f d50 1 1 c0t0d0s0
然后在第二块磁盘上创建第二个子镜像:
# metainit d52 1 1 c0t1d0s0
使用第一个子镜像创建镜像的第一个部分:
# metainit d54 -m d50
用metaroot修改/etc/vfstab和/etc/system,让系统可以从元设备(metadevice)d54上启动:
# metaroot d54
重新启动系统,然后将添加第二个子镜像d54。这就强制了“镜像同步”,将第一块盘的内容复制到了第二块盘。这将在一小段时间内影响系统的性能。
# metattach d54 d52
为了避免在从第二块盘上紧急启动时发生错误信息,交换分区必须做成相同样式的镜像。否则,交换分区在损坏的磁盘上,/etc/vfstab仍然会定位到c0t0d0s1。
现在系统已经可以从第一块盘(boot disk),也可以从第二块盘(boot disk1)上启动了。
如果有一块磁盘损坏,Solstice DiskSuite会停止启动程序。这是因为如果要在一次错误以后成功地启动系统,纪录复制数据库的大部分必须依然“幸存”。在我们的两块镜像盘上仅仅需要六个复制中的三个依然存活。
超过两块盘的服务需要有第三块盘来用记录复制数据库来配置。两块盘的工作站必须手动地修复,下面的例子描述了这个过程:
·记录数据库复制在c0t0d0s7和c0t1d0s7上配置,c0t0d0盘发生故障。
·启动程序被Solstice DiskSuite停止,并转换进入到单用户模式。
·现在记录数据库复制希望发生错误的盘没有被配置:
metadb -d -f c0t0d0s7
·在下一次重启之后,对重置的磁盘进行分区,使它和仍然活动的磁盘的分区一致。
·做完这些之后,在重置的硬盘上创建记录数据库复制文件:
metadb -a -c 3 c0t0d0s7
·在下次的重启之后,镜像又可以重新同步了。
注意:
如果你有一个两块盘的系统,在一块盘上创建三个记录数据库复制,在另一块上面创建四个。在理论上有50%的机会可以在一次错误后重新启动系统而不需要手动地去使用元数据。
如果你能接受在2盘系统下发生错误后无人职守的重启,在两块盘上创建相同数量的记录数据库复制并且创建/etc/system条目:
set md:mirrored_root_flag=1
关于这方面内容更多的讨论可以在Sun的蓝皮书“Configuring Boot Disks With Solaris[tm] Volume Manager Software"(http://www.sun.com/blueprints/1002/817-0407-10.pdf)上找到。

3 SWAP交换空间
3.1 固定配置文件 /etc/vfstab
#device device mount FS fsck mount mount
#to mount to fsck point type pass at boot options
#
#/dev/dsk/c1d0s2 /dev/rdsk/c1d0s2 /usr ufs 1 yes –
/dev/dsk/c0t0d0s1 - - swap - no –
/usr/local/swapfile.1 - - swap - no –
...
swap - /tmp tmpfs - yes –
交换文件系统可以使用像/dev/dsk/c0t0d0s1这样的裸分区或者象/usr/local/swapfil.1的空文件。
你可以定义多个交换文件系统,所有这些都在逻辑上绑定并挂接到/tmp挂接点。这就意味着只要物理内存是可用的,向/tmp中写文件将写入内存并耗尽内存(not very sure)
例如:
/dev/dsk/c0t0d0s1 - - swap - no –
/dev/dsk/c0t1d0s1 - - swap - no –
/dev/dsk/c0t2d0s1 - - swap - no –
...
swap - /tmp tmpfs - yes –
上面创建了另外的6GB的虚拟内存(假设所有的分区大小为2G).Solaris将条带访问对所有的磁盘。
3.2 "裸分区”和空文件的比较
最快速的交换就是不进行交换,假如物理交换不可避免,使用在多可磁盘上条带后的分区。如果实在需要内存或者没有可用的分区或磁盘,则使用空文件系统。
3.3 临时配置
在标准的SOLARIS操作中,空文件可以加入到交换空间。
# mkfile 100m /usr/local/swapfile.1
# swap -a /usr/local/swapfile.1
# swap -l
在系统重启之前,这些额外的空间是临时的。可以使用命令swap -d /usr/local/swapfile.1去掉这些额外的交换空间

4 系统安装和维护
4.1 CD安装
在安装过程中,你尽可以轻松地按照屏幕的提示进行,但也许会有一些小的缺陷;
- Name Service:选择 NONE.如果你这时候选择象NIS这样的内容,因为网络还没有安装好,所以没有NIS服务可用,这时系统可能会“挂起”等待NIS服务器响应,在基本的网络安装完成后再配置NIS或DNS会更好些。
- 安装群集:对于工作站而言,应该始终选择"Entire Plus OEM Software"项来确保安装所有的内容。对于专用服务器,去掉不必要的服务包可以最大降低安全风险。参考 SUN 蓝皮书《Minimizing the Solaris[tm] Operating Environment for Security: Updated for Solaris 9 Operating Environment>;>;
(http://www.sun.com/blueprints/1102/816-5241.pdf) 可获得更多内容
- 磁盘分区:根据再“分区”这一章所提供的建议,为了能够对磁盘进行分区,当提示安装方式时,选择“定制”方式而不是“默认”方式。
从 Solaris 7 OE版本开始,安装CD内含有预打包的Solaris映像.如果需要升级以前的季度升级包到该映像文件的版本,参考“维护升级”
例如:安装“维护升级 7”(同Solaris 8 02/02 OE发布)到Solaris 8 07/01 OE版本需要升级Solaris 补丁包(只这些,没有功能的增强)到在02/02版本上的状态。升级安装在/etc/release文件中写入如下标记:"Solaris 8 07/01 Maintenance Update 7" “推荐补丁集”采用另外的方式,用户每月在“推荐补丁集”上可以看到不同补丁包和补丁版本。                                   这些可以从http://www.sun.com/bigadmin下载并且在Solaris安装后安装。
安装完毕后,root用户只能从system控制台登录,这种终端方式直接连接到系统或键盘。为了允许通过TELNET,RSH等从远程登录,必须修改一 个文件:注释该行:CONSOLE=/dev/console!in!/etc/default/login.注意:这是一项安全分险。

4.2 包的安装
   包是通过tar/compress/zip等工具压缩的一些目录文件,其命名规则名字如下:前面的四个大写字母代表发行该包公司的US股票代码,后面的 小写字母代表其功能。例如SUNWspci2这个软件包,就是SUN-pci卡的驱动程序包,前面的SUNW是SUN的股票代码,后面的spci2是其功 能(PCI卡驱动)。
安装命令如下(后面的目录里必须包含这个包)
pkgadd -d /cdrom/cdrom0
pkginfo 打印该包的信息,pkgrm <Package-Name>;删除(卸载)已经安装的包。
例如:你的机器原来安装的显示卡是Creator3D(ffb)换成了Elite3D(afb),这样开机的时候会提示"no console framebuffer"(没有显示卡),说明没安装Elite3D驱动程序。使用
pkginfo | grep -i afb
命令检查,没有输出,说明安装系统的时候没有安装Elite3D显示卡的驱动,而Elite3D的驱动程序在安装盘的s0/Solaris/Product. 进入这个目录,使用下面命令安装即可:
pkgadd -d . *afb*
重新启动机器,新安装的显示卡就可以正常显示了。
4.3补丁安装
   补丁的数字代码包含了两个部分,6位数字的补丁号,后面是两位数字的版本号,人员123456-78。
Solaris8使用的是*.zip格式的补丁压缩,以前使用的是*.tar.Z的格式的包。安装补丁的时候,先拷贝到/tmp下面,然后接压缩,安装之后要删除这些临时文件。解压缩办法:
zcat 123456-78.tar.Z | tar xvf -
unzip 123456-78.zip
然后使用patchadd 123456-78这样的命令安装这个补丁。使用patchadd 123456-78安装的补丁可以使用pkgrm删除(卸载),/var/sadm/patch纪录了这些安装纪录,这个目录没有的话,pkgrm就不能正常删除补丁了。
showrev -p | grep <patch number>;可以查找到已经安装的补丁包。

5 X-Server和CDE用户接口
5.1 常见的需要注意的问题
X-Server或者CDE总是按照以下顺序搜索配置文件:
1. $HOME/.dt/...
2. /etc/dt/...
3. /usr/dt/...
注意,永远不要改动在整个系统范围内都生效的/usr/dt/中的内容。如果系统的X-Server或CDE出现 问题,总是使用/etc/dt/下的文件去维护或恢复设置。用户自己的配置如扩展按钮或面板的改变等,配置总是保存在$HOME/.dt/目录下。在本节 以下的内容中,将用<DT>;来代替这些目录($HOME/.dt, /etc/dt,/usr/dt)。
5.2 定制登陆界面
文件:<DT>;/config/$LANG/Xresources
Logo(象素图或位图,24位色或以下,广泛装载时间):
Dtlogin*logo*bitmapFile: /usr/local/lib/X11/dt/bitmaps/Mylogo.bm
通用欢迎登陆语句:
Dtlogin*greeting*labelString: Here's %LcoalHost%!
输入用户名后的欢迎:
Dtlogin*greeting*persLabelString: Hello %s
5.3 从多屏幕登陆,Xinerama,和24位色
首先查看 /dev/fbs,找出有几个显示卡可用,它们是如何命名的. 确认有 /dev/fbs/ifb0和/dev/fbs/ifb1,两个 Expert 3D显示卡。
然后,把X-Server文件从/usr/dt/config复制到/etc/dt/config,编辑该文件,确认最后一行与以下内容相同:
:0 Local local_uid@console root /usr/openwin/bin/Xsun :0 -nobanner
5.3.1 多屏幕
多屏幕是指CDE在每个屏幕中运行一个完整的用户面板。鼠标可以在两个屏幕间移动,而各屏幕上的窗口不能在两个屏幕间移动。ifb0的的显示屏幕被称为: :0.0, ifb1的显示屏幕被称为: :0.1
:0 Local local_uid@console root /usr/openwin/bin/Xsun :0 -dev /dev/fbs/ifb0 -dev /dev/fbs/ifb1 -nobanner
5.3.2 Xinerama
Xinerama(Solaris 7 11/99 OE以后的版本有效)是一个覆盖多个显示屏幕的的虚拟显示屏幕。鼠标和程序窗口可以在多个显示屏幕之间移动, CDE只生成一个用户前端面板。只有一个显示号码: 0:0. Xinerama 只在使用相同的显示卡时才可用。
:0 Local local_uid@console root /usr/openwin/bin/Xsun :0 +xinerama -dev /dev/fbs/ifb0  -dev/fbs/ifb1 -nobanner
Xinerama 允许定义一X和Y方向的重叠,这种设置使显示画面边扩展到多个显示器上,使两个显示器显示一个图形窗口(Xoverlap=<水平解析象素>;),下面是一个在1280像素的的水平分辨率,20%边缘重叠显示的配置例子:
:0 Local local_uid@console root /usr/openwin/bin/Xsun :0 = xinerama -xoverlap 256 -dev /dev/fbs/ifb0 -dev /dev/fbs/ifb1 -nobaaner
5.3.3 使用24位色深
CDE本身默认使用8位色深(256色). 不过这没有问题,因为每个窗口可以使用单独的颜色位深设置。某些显示卡只有一个颜色表,这可能导致在某些应用中出现程序窗口颜色闪烁的现象。只需要将CDE修改成使用24位色深。如果使用PGX显卡,需要使用命令
fbconfig -degth 24
将框架缓冲区切换到24位。
注意:由于某些老的应用只支持8位色深,不是24位色深,可能会出现问题。
:0 Local local_uid@concole root /usr/openwin/bin/Xsun :0 -dev /dev/fbs/ifb0 defdepth 24 -dev /dev/fbs/ifb1 defdepth 24 –nobanner
5.4 用户定制CDE面板
CDE中的应用启动机制叫做“活动”。当用户将鼠标点到一个CDE图标是,“活动”发生预定义的行为,一旦定义以后,“活动”的关联到环境变量中:Menus, file manager, MIME-types 和定义文件
5.4.1 活动(Actions)
CDE 按照以下顺序搜索*.dt-files配置文件:
$HOME/.dt/types
/etc/dt/types/$LANG/
/usr/dt/types/$LANG/
例如,StarOffice52.dt(这是在$HOME/.dt/types下安装完StarOffice之后)
ACTION StarOffice52
{
LABEL StarOffice 5.2
TYPE COMMAND
EXEC_STRING "/opt/Office52/program/soffice" "%(File)Args%"
ICON So52
WINDOW_TYPE NO_STDIO
DESCRIPTION StarOffice
}
5.4.2 图标
一个活动的的定义还包含一个图标名。图标名按照以下顺序解析:
$HOME/.dt/icons
/etc/dt/icons/$LANG/
/usr/dt/icons/$LANG/
naming scheme: <name>;.<size=m|t|l>;.<format=bm|pm>;
例如StarOffice52的图标文件存在以下位置: $HOME/.dt/icons/So52.m.bm
5.4.3 用户前面板
通过添加*.fp-files文件到$HOME/.dt/types目录下,可以方便简单的扩展用户前面板。默认定义存储在:
. /etc/dt/types/$LANG/
. /usr/dt/types/$LANG/
例如($HOME/.dt/types/tools.fp)
CONTROL Tools (Always define the main control before sub panel)
{
TYPE icon
CONTAINER_TYPE BOX
CONTAINER_NAME Top
POSITION_HINTS first
ICON Dtagen (This is a folder icon, Icon must exist!)
LABEL Tools
}
SUBPANEL Toolspanel
{
CONTAINER_NAME Tools
TITLE My Tools
}
CONTROL StarOffice52
{
TYPE icon
CONTAINER_TYPE SUBPANEL
CONTAINER_NAME Toolpanel
ICON So52
LABEL Star Office 5.2
PUSH_ACTION StarOffice52 (compare ACTION StarOffice52)
DROP_ACTION StarOffice52
}
你可以通过在子面板(SUBPANEL)里添加额外的控制(CONTROLs),来建立整个菜单按钮

6 显示卡和OpenGL

6.1 Fbconfig
在Solaris 8 系统环境中,fbconfig是配置显示卡的唯一的程序接口,每个显示卡有自己的专用配置工具。在Solaris 8 软件中,通过有规则的命名方式来与/dev/fbs下的设备名对应。
下面是一些显示卡配置命令及对应的显示卡类型
. ffbconfig Creator, Creator3D
. afbconfig Elite3D
. ifbconfig Expert3D, Expert3Dlite
. m64config PGX24 (onboard U5, U10), PGX64
. gfxconfig PGX32
在下面的内容中,只提及fbconfig,其他命令的参数都是一样的。如果没有在配置中把某个设备指定给某个显示卡,fbconfig工作在默认的显示卡(接主屏幕的显示卡)。
可以使用 ls /dev/fbs命令查找系统中安装了哪些显示卡。另外,可以使用下列命令通过设备名直接列出系统中安装了的显示卡。
fbconfig -res /dev/fbs/afb1 -propt -prconf
这个命令可以列出第二个Elite3D显示卡的配置信息,例如显示卡的类型、分辨率等。第一个Elite3D显示卡使用的设备名是 afb0。
fbconfig -res \?
这条命令将列出该显示卡支持的分辨率,指定的分辨率可以"剪切&拷贝" 到下面命令里面:
fbconfig -res "1280x1024x86" -try -now
-try和-now都是选项。
-try将只会改变10秒钟的分辨率。可以使用这个方法测试显示器和改变之后的视频信号是否同步。-now参数使分辨率改变立即生效,不需要重启X- Server。然而,有些时候使用-now选项改变分辨率后,屏幕显示会有一点几何失真,可以用退出用户再重新登陆来重新启动X-Server的方法来解 决。
fbconfig -g 1.7
命令将gamma因子设定到1.7,默认值是2.2,通常看起来可能太亮了。
新的gamma因子设定,不用重启X-Server就可以立刻生效,而且重启后依然有效。
6.2 ogl_install_check
尽管在Solaris 2.5.1以后的版本的CD中都有OpenGL软件包,但在Solaris系统安装过程中,不会自动安装。 使用以下命令检查该系统上是否正确安装了OpenGL,以及OpenGl软件的版本:
/usr/openwin/demo/GL/ogl_install_chech
注意:在正确的设置了gamma因子后,OPENGL的测试环的设置也很简单了。
推荐使用最新版本的OpenGL。 例如Xinerama只能支持OpenGL1.2.1以后的版本。OpenGL的下载地址
http://www.sun.com/solaris/opengl

6.3 和图形卡相关的补丁
下面是和显示卡有关的补丁列表,它和Solaris版本、OpenGL版本和显示卡类型有关系。
下表只列出来补丁号。请到http://sunsolve.sun.com下载最新版本的合适的布丁。补丁的安装顺序如下
1.显示卡补丁
2.X-Server补丁
3.OpenGl
4.OpenGL补丁

显示卡补丁列表:(详细列表参见原版21页)
显示卡类型     Solaris 9 OE    Solaris 8 OE     Solaris 7 OE
Expert3D (lite)   112540          108576              108787
XVR-500           112540          108576             不支持
XVR-1000          112565           112564             不支持
Elite3D           111620           108604             106144
- and XFB 106148
- and VIS 109872 106147
Creator3D 112621 108605 106145
- and XFB 106148
- and VIS 109872 106147
OpenGL 1.2.2 32 Bit: 111993 32 Bit: 111993 32 Bit: 111993
64 Bit: 111994 64 Bit: 111994 64 Bit: 111994

OpenGL 1.2.3 32 Bit: 112628 32 Bit: 112628 32 Bit: 112628
64 Bit: 112629 64 Bit: 112629 64 Bit: 112629
XSun 112785 108652 108376
PGX32 /64 112622 109154 107716

7 管理
7.1 主机
你可以用admintool或者smc创建主机列表文件hosts,直接编辑/etc/inet/hosts文件更简单。提示:/etc/hosts文件是/etc/inet/hosts文件的连接。
使用复制命令cp /etc/host.old /etc/hosts不会覆盖正确的文件。Solaris默认安装方式启动sendmail守护进程。如果主机名不包含点号(.)的话,sendmail 守护进程会输出错误信息。为了抑制错误信息,在/etc/inet/hosts文件里应该像下面这样定义主机信息: 192.168.0.2 myhost myhost.domain.com loghost
7.2 串口
同样,常用的最佳工具是admintool或者是Solaris 9环境下的“Solaris 管理控制台(Solaris Management Console)”smc。
7.3 打印机
同样,常用的最佳工具是admintool。Solaris 9环境下,有系统自带的“打印机设置向导”/usr/sadm/admin/bin/printmgr。
7.4 创建用户
创建用户常用的最佳工具是admintool。从Solaris 9平台开始,使用“Solaris 管理控制台”smc。当创建新用户时不要指定/home/<username>;作为用户的起始目录(须禁止autofs)。用下面的更好: /export/home/<username>;。
/home/<username>;目录默认作为Solaris自动装载器(automounter)的目标目录,因此不可写。一些第三方软件试图使用/home/xyz目录。为避免出错,应该关闭自动装载器或者改变它的默认设置。
7.5 Shell和环境变量
正确的设置环境变量是系统设置中最有效的减少错误的方法之一。不幸的是,在使用不同的shell的情况下,如何设置变量以及针对特定用户的性能优化所用的语法各不相同。
最常用的命令解释器是sh,ksh和csh。从Solaris 8开始,流行的bash也可以使用了。sh是安装完成后root用户默认的命令解释器。一般情况下,用户的默认命令解释器在/etc/passwd文件中 定义,例如:demo:x:2003:10:Demo User:/export/home/demo:/bin/csh 下表描述如何在不同的命令解释器中设置变量:表1(见附件)
所有命令解释器在启动时读取一系列文件。登录命令解释器(login shell,通常在用户使用telnet,ssh等登录系统后启动)与子命令解释器(subshell,即sh,ksh,csh或者bash的统称)读取 的文件不同。下表描述了不同命令解释器所读取的文件:表2(见附件)
表格在原文P23页。

8 网络连接
8.1 /etc目录下的文件
   Solaris 软件在/etc目录下存放网络配置文件。所有的配置数据比如ip地址、网关等可以被定义或者在运行层进行修改,而只有那些存放在/etc目录文件中的定义可以在系统重启后可以保存下来,永久生效。
可以在这些文件中找到主机名(hostname):
/etc/nodename
/etc/hostname.<interface-name>;
/etc/inet/hosts
/etc/net/{ticlts,ticots,ticotsord}/hosts
/etc/nodename 这个文件定义了系统名,从网络的观点看,一个有多块网卡和多个ip地址的系统可以有多个名字。每个都在/etc/inet/hosts中有定义。 这些名字中的任何一个都等价于系统名( nodename),但是他们不是必须的 。
有些文件产生了ip地址跟网卡接口名之间的连接。他们是/etc/hostname.<interface-name>;<number>;。
最常见interface name是:
le    老式sparc系统上的以太网网卡名
hme   Ultra sparc系统上的快速以太网网卡名
eri   UltraSPARC-III 系统上的快速以太网网卡名
qfe    基于四口扩展以太网卡上的快速以太网网卡名
举例: 一台有QFE (QuadFastEthernet)的Ultra 60 工作站有五个网络接口: hme0 (on board),qfe0,qfe1,qfe2 and qfe3 (on the QFE-card)。主机名是 hermione, 则 /etc/inet/hosts文件的内容如下:
127.0.0.1 localhost
157.168.34.12 hermione hermione.domain.com loghost
191.133.23.10 dumbledore
    在公司的局域网上地址是157.168.34.12的系统就叫hermione,相应的,文件 hostname.hme0 必须包含 hermione 这个名字。
Dumbledore(191.133.23.10)是网络服务提供商分配的地址。这根缆线连接到QFE的第一个端口 qfe0 ,所以文件 hostname.qfe0 包含 dumbledore 这个字符串。
qfe1-3 现在没有使用。为了避免solaris出现“没有缆线连接”这种错误信息,对于没有使用的接口不要生成hostname.* 这种文件。
一个具有多个网络接口的系统会在各个子网之间自动路由,例如在我们例子中的157.168.*.* 和 191.133.*.* 子网之间。在系统启动的时候,会显示出来"machine is a router"这条信息。 如果不希望启动路由服务,手工生成一个空文件 /etc/notrouter 接着重新启动系统就可以了。
Ip地址的子网掩码定义在文件/etc/netmasks中。在X-Server运行时不要更改nodename,最好更改nodename或hostname之前,从当前的会话中退出来然后使用命令行界面重新登陆。
8.2 虚拟网络接口
有时候,对于只有一块网卡的系统定义2个ip地址是很有用的。例如,商业演示用的demo工作站了为了与其它的主机通信而需要添加另一个地址的同时也需要 保留自己公司的ip地址,这个需求可以通过虚拟网络接口得以实现。实现方法就和上一章节描述2块物理网卡的情形一样, 仅有的不同是我们这次不使用 hme0 和 qfe0 ,而是使用 hme0 和 hme0:1,所以如果你写dumbledore 字符串到/etc/hostname.hme0:1 文件,在商业演示时ISP提供的网线就可以接到 hme0, QFE网卡就不再需要了。
8.3 ifconfig工具
ifconfig -a 列出所有物理和虚拟的接口定义,包括ip地址和子网掩码。 另外在系统运行期间我们还可以用ifconfig去定义ip地址和子网掩码(在hpux系统中这样的定义当系统重新启动后就不存在了,不知solaris 是不是这样)。 让我们再来看Ultra 60 工作站的例子,这次首先假定dumbledore在/etc/inet/hosts中没有定义,那么 qfe0 在系统重新启动后就不再被使用。
现在第一步是去激活qfe0(加载驱动):ifconfig qfe0 plumb
开始配置这种网络接口:
ifconfig qfe0 191.133.23.10 netmask 255.255.255.0 up
ifconfig -a 可以看到新的配置
对于虚拟网络接口这个步骤是相同的:
ifconfig hme0:1 plumb
ifconfig hme0:1 191.133.23.10 netmask 255.255.255.0 up
8.4路由
可以将IP地址加入/etc/defaultrouter文件来设定默认路由(或者是标准网关)。如果在此文件中加入的是主机名,要确认/etc/inet/hosts文件中已经定义了此主机名。 等价的命令是:
*删除所有当前路由:route flush
*将1.2.3.4定义为默认路由:route add default 1.2.3.4
*用netstat -r命令可以查看更改结果。
如果机器上有两个以上可用的网络接口,Solaris会自动启用IP转发。
要检查IP转发是否已经启用:ndd -get /dev/ip_forwarding
启用IP转发:ndd -set /dev/ip_forwarding 1
关闭IP转发:ndd -set /dev/ip_forwarding 0
另一种关闭IP转发的方法是创建/etc/norouter文件,例如touch /etc/norouter
8.5NIS客户机
-首先将NIS域名加入/etc/defaultdomain文件(区分大小写)
-然后在/etc/inet/hosts文件中加入NIS服务器
-运行ypinit -c,输入NIS服务器名称 -运行/usr/lib/netsvc/yp/ypstart或者重启。
现在要告诉Solaris操作环境,对于哪些项目(主机名,用户等等)使用NIS。/etc/nsswitch.conf文件对此进行控制。要使 Solaris软件在/etc/inet/hosts文件中找不到主机名时查询NIS服务器,可以在hosts开头的行中在files后面加上nis。
在/etc目录中有名为nsswitch.nis的预设文件,对于所有可用项目都带有nis定义。
8.6 DNS客户机
1. 在/etc/resolv.conf文件中输入DNS服务器地址:
nameserver 192.168.0.1
现在可以用nslookup www.sun.com测试DNS服务。
2. 告知Solaris解析主机名时使用DNS。编辑/etc/nsswitch.conf,在hosts开头的行的files后面加上dns。现在不只是可以使用nslookup www.sun.com,也可以ping www.sun.com
8.7 DHCP客户机
如果创建两个空文件/etc/hostname.<网络接口名称>;和/etc/dhcp.<网络接口名称>;,此接口就配置为 使用DHCP。Solaris会用30秒等待DHCP服务器应答。可以在/etc/dhcp.<网络接口名称>;修改此时间: WAIT <以秒计的时间>;
可以在网络接口运行时启用DHCP(在此例中是对接口qfe0):
ifconfig qfe0 plumb
ifconfig qfe0 dhcp start
8.8 sys-unconfig
如果要更改网络配置,但是对相关的文件不确定,有一个简单的方法:sys-unconfig,关闭机器。在下一次重启(在OK提示符下输入boot)时所有Solaris安装时网络相关的问题都会再次问到。(IP地址,网关,掩码等等)。
8.9 10Mb还是100Mb,全双工还是半双工?
可以用ndd /dev/<interface-driver>;命令查询网络接口状态。<interface-driver>;一般是le, hme, eri或者是qfe。
-ndd /dev/eri link_status: 0=down, 1=up
-ndd /dev/eri link_speed: 0=10Mb, 1=100Mb
Solaris对于所有网络接口的参数默认为“自适应”。如果添加的网络设备不支持自适应,就要手动设置参数。将多余的参数设为0。
10Mb半双工的例子:
ndd -set /dev/eri adv_100fdx_cap 0
ndd -set /dev/eri adv_100hdx_cap 0
ndd -set /dev/eri adv_10fdx_cap 0
ndd -set /dev/eri adv_10hdx_cap 1
ndd -set /dev/eri adv_autoneg_cap 0
用ifconfig unplumb关闭网络接口然后用ifconfig plumb重启接口。也可以在/etc/system文件中定义这些设置。(set eri: eri_adv_10hdx_cap=1)

9.网络文件系统
9.1        NFS服务器
Solaris将目录信息存储在/etc/dfs/dfstab 中,以便于在网络上的其他系统安装。该文件是一个被share命令使用的脚本。
如果这个文件没有包含任何share命令,Solaris OE(OE,操作系统引擎??)在重起时不会自动开始共享网络文件系统, 即使明确的调用执行了/etc/init.d/nfs.server start命令,dfstab也是空的。
例如:共享/export/home
1、        添加share /export/home 到/etc/dfs/dfstab中
2、        如果这是第一次添加该文件中的内容,执行/etc/init.d/nfs.server start命令
3、        输入shareall
4、        如果/export/home被正确共享的话,使用share命令检查
9.2NFS客户端
一个NFS客户端不需要制定任何域,但是,NFS服务器名是重要的。一个IP地址 (mount 192.168.0.1:/export/home)是不够的,所有的NFS服务器必须在/etc/inet/hosts,NIS或者DNS中定义。
你能够安装(mount)一个网络目录,使用命令 mount server:/export/home /tmp/home。如果这个安装点需要在下次系统重起的时候自动的安装的话,在文件/etc/vfstab中插入该安装点的相关内容。
注意:当使用root用户在网络目录中拷贝文件的时候,注意,本地的root和网络目录上的root是不同的,都是作为"nobody"(除非在服务器上 使用了anon=0)。网络目录下的文件没有"other"用户的读权限是禁止拷贝的,为了使用root用户从网络文件目录中拷贝所有的文件,不要使用下 列命令:
root# cd server:/verz;tar cvf - | (cd verz;tar xvf -)
最好使用 rsh来在该服务器上获得 root用户的读权限:
root# rsh server "cd /verz; tar cvf -"|(cd verz;tar xvf -)
9.3 与其他的流行的UNIX系统的区别
在Solaris上的NFS系统与其他流行的UNIX版本中(Linux,AIX等)的实现不完全相同:
1)文件:Solaris 系统中文件/etc/dfs/dfstab,由/etc/exports取代;
2) 命令:Solaris 系统中的命令shareall由exportfs -a取代。
9.4 自动加载(AutoMounter)
自动加载功能可以实现在用户访问相关目录的时候自动的将文件系统加载(mount)。在大型网络环
境中,如果大量主机和用户的具有如下目录路径/net/<hostname>;或/home/<username>;是,将会非常有帮助。
两个文件定义自动加载的基本操作:/etc/auto_master和/etc/auto_home.
auto_master文件预定义了上述自动加载的行为。
目录/net将会在访问相关的主机是自动加载。
/home目录的自动加载功能在/etc/auto_home文件中定义。
/net -hosts -nosuid,nobrowse
/home auto_home -nobrowse
如果/etc/auto_home文件包含以下行
/export/home/&
当有人访问/home/joe目录时,自动加载功能将起作用,把/export/home/joe 加载到这个加载点
(/home/joe)

10        工具
10.1 编译器
c, c++和fortran编译器通常安装在/opt/SUNWspro/bin目录, 通用工具象make安装在/usr/ccs/bin下.
10.2 GNU工具包
几乎所有GNU工具包都有基于solaris平台的预编译包. 它们可以从http://www.sunfreeware.com下载.从solaris 8 OE开始, 一些重要工具象perl,gzip或apache是自动安装的, 剩下的绝大多数GNU工具包都作为预编译包存放于solaris companion CD上.
10.3 SUN PCi和SUNPCi-II
很多工作站都装备有SUNPCi卡. 这是一个运行WINDOWS(98,ME,NT,2000,XP)系统的完整PC.这里有一些关于操作SUNPCi卡的提示.
*封装/opt/SUNWspci2/bin/sunpci进一个小脚本以设置一些环境变量:
setenv NVL_INTERFACE=hme0 (如果SUNPCi要用hme0网络界面)
setenv LANG=C
setenv KBCP=850 (例如:德国键盘/代码页)
setenv KBTYPE=GR (还记得MS-DOS吗?)
*不但让root可写c:映像, 而且这个工作站上的每一个用户都要有666权限.当sunpci由一个用户启动时, 一个叫pc的子目录在该用户的HOME下产生.为让该用户同全局c:映像协同工作, 中断随后的特定用户映像的创建, 并且编辑sunpci.ini文件以指向那个全局映像(例如: /pc/C.diskimage).
10.4 staroffice 软件
如果staroffice软件由root执行setup /net安装, 所有用户能在他们的个别安装期间选择”工作站安装”选项. 工作站安装仅仅拷贝1MB数据进该用户的home目录, 而其他的情况使用集中式安装. 如果staroffice软件安装在/opt/Office60, 用户能用/opt/Office60/program/soffice来启动他的工作站安装.
10.5 netscape navigator浏览器
从solaris 8开始, netscape navigator作为标准浏览器. 它被安装在/usr/dt/bin/netscape.
10.6 杂项
提示: 当启动桌面时, 那个注册提醒器能用”more information”中的“never register”选项禁止.
要禁止所有用户中出现的的警告信息, 在/etc/default/solregis文件中加入一行:DISABLE=1

11.提示集
11.1 3个首要提示
l        c-shell: 在~/.cshrc中定义 set filec和set history=100 savehist=50, 一旦你按下esc键, shell将完成文件名和目录名. History列出最后的100条命令, 用!13用让编号13的命令重新出现.!$用于列出先前命令的最后一个参数, 象: mkdir /export/home/demo/test后键入cd !$. 从solaris 8开始, tcsh有效了, 它有用光标键编辑命令行和浏览历史命令的功能.
l        进程控制 : 从solaris 8 O以后, 可以用pkill <搜索文本>; 去替代由ps –ef|grep <搜索文本>;, 然后kill <搜索文本的PID>;所能达到的功能. Kill -9 -1中断属于当前用户的所有进程.
l        文件编辑: 不喜欢vi的人可用CDE的编辑器dtpad.
11.2 硬件配置分析
11.2.1 prtdiag
/usr/platform/`uname –i`/sbin/prtdiag –v命令显示CPU的数量及类型, RAM, 扩展卡等硬件配置信息.
11.2.2 prtcon/path_to_inst
prtconf 以阶层的形式列出设备目录. 用逻辑设备(驱动程序在/dev)映射物理设备(在/devices下指定)的说明在/etc/path_to_inst文件中. 当执行boot –r或devfsadm时, 这个文件被重写. 在把一张卡从一个PCI槽移到另一个槽后, 必须编辑这个文件. 在该文件中, /dev/hme1被连接到一个特定槽. Reboot不能重新定义这个关系.
警告: 手工编辑/etc/path_to_inst需要设备路径操作的高级经验. 编辑错误会导致系统不能引导!
11.2.3 explorer
该工具能从SunSolve(http://sunsolve.sun.com/pub-cgi/show.pl?target=explorer/explorer) 下载. 它搜集所有重要的系统信息. 它能用于准备服务命令, 备份配置数据和快照配置等.

11.3 运行时数据分析
11.3.1 time/ptime
较简单的运行时分析工具有time(0.1sec解析)和ptime(1msec解析), 它们能加入命令行. time gzip j2sdk.tar.gz 的结果分成用户(程序)时间, 系统时间和用去的时间.
11.3.2 top/prstat/ps
solaris下的prstat类似于其他平台下的top工具./usr/ucb/ps –aux显示相近的结果, 但它没有排序且不能自动更新.
ps –L –p <process-ID>;列出有线程的进程及其线程数.
11.3.3 vmstat/mpstat
vmstat <以秒计频率>;列出系统负载明细. 下面行列出大多数有趣的:
free: 空闲内存(直到solaris 7此值接近零, 因为有用磁盘缓存. 从solaris8开始反映了的正确值.)
page pi/po: 页面调度行为. 系统不交换直到在交换设备上i/o流量被报告!
Cpu us: user-time. 被应用程序消耗的百分比.
Cpu sy: system-time.被solaris系统消耗的百分比.
Cpu id: idle-time.
Vmstat参数输出结果解释(原文没有,RACE注)
procs        报表下面三种状态的进程数:
                r--在运行队列中等候运行
                b--被资源阻塞(I/0,页面调度,等等.)
                w--可运行但是被换出的
        memory 报告虚拟内存和实存信息:
                swap--以千字节为单位的当前可用交换空间的数量
                free--以千字节为单位的页自由表大小
page  报告每秒页面调度活动数量的信息:
                re-从自由表回收页
                mf--次要的错误;地址空间或硬件地址转换错误
                pi--页入的千字节数
                po -页出的千字节数
                fr- 释放的千字节数
                de--以千字节为单位的可接受的短期内存不足数
                sr--页由时钟算法扫描
disk                可以为四个磁盘报告每秒磁盘I/O的数量
faults        报告每秒系统软件中断和硬件中断的速率
                in-设备中断,不包括系统时钟中断
        sy-系统调用
                cs-CPU任务(上下文)交换
cpu--        CPU故障时间的百分比,在多处理器系统上,这是全部处理器的平均值:
                us-  用户时间
                sy-- 系统时间
                id-- 闲置时间

mstat 打印类似信息, 每个处理器一行.
mpstat输出结果解释(原文没有,RACE注)
*CPU——处理器ID
*minf——一般故障
*mjf ——重大故障
*xcal——处事器间的交叉调用
*intr——中断
*ithr——线程中断,不计时钟中断
*csw——任务交换
*icsw——非主动任务交换
*migr——向另一处理器的线程转移
*smtx——互斥信号旋转(第一次时不要求锁定)
*srw——读/写锁定旋转(第一次时不要求锁定)
*syscl——系统调用
*usr ——用户时间百分比
*sys——系统时间百分比
*wt——等待时间百分比
*idd——空闲时间百分比

11.3.4 iostat
iostat –xtcP <以秒计频率>;列出系统i/o负载.每一个分区或NFS装载打印一行. “kr/s”和”kw/s”行显示以千字节/秒为单位的读写吞吐量. 若”svc_t”大于100表明那磁盘用于磁头(?)分配的时间多过数据传送的时间.
iostat输出结果解释(原文没有,RACE注)
tin每秒输入的字符数
tout每秒输出的字符数
kps每秒传输的千字符数
tps每秒传输的操作次数
serv以毫秒计的的平均服务时间
最后一组报告了CPU使用率:
us用户状态所占百分比
sy系统状态所占百分比
wt等待状态所占百分比
id空闲时间所占百分比
us用户状态所占百分比
ni用于运行nice或renice的进程的时间所占百分比
sy系统状态所占百分比
id空闲时间所占百分比
r/s每秒的读传输操作
w/s每秒的写传输操作
kr/s每秒的千字节数
kw/s每秒写的千字节数
wait在设备队列中等待命令的平均数目
actv在处理中的命令的平均数目
svc_t服务时间(* 是指为一条命令服务的平均时间,这里包括为等待在处理队列中前面的命令所耗费的时间)
%w在队列等待时间的百分比
%b设备忙的时间的百分比

11.3.5 sdtperfmeter, sdtprocess
sdtperfmeter是一个图形工具, 它将vmstat的数据作为柱形或条形图. 该工具的最小化版本显示在CDE面板. Sdtprocess显示用某种方式排序的所有进程. 可用于深入察看进程特性, 中断进程等.
11.3.6 32或64位?
Isainfo –kv 显示系统内核是32还是64位. UltraSPACR-II系统自动启动64位内核 ; 在ok状态下, 用boot kernel/unix而不是boot kernel/sparcv9/unix可以明确地装入32位内核 . 而UltraSPARC III只有64位内核.
11.4 调试
11.4.1 Truss,
命令truss <command>; 列表应用程序执行过程中所有的系统调用,由于列表中还包含系统调用的参数和返回,因而我们可看到应用程序调用的共享库和配置文件以及它们的文件位置。
11.4.2 pstack,pmap
"p*-command" 输出属于该进程的详细信息
pstack <PID>; 显示进程的最后一个子程序名
pldd <PID>; 显示共享连接库列表
pmap -x <PID>; 显示该进程与它的装载模块的内存使用情况
11.4.3 snoop
snoop 输出通过网卡所有的包

11.5 常见问题

1. 启动进程过长
OBP 设置:ls diag-swith?=true ??
2. 不能用FTP登陆,但telnet、ssh可以
在/ect/ftpuser中设置不允许用户FTP登陆
3. VI 不能正确的显示
查看变量term 是否定义,如果没有,设置term=vt100


12 相关参考书籍和站点
12.1 参考书
A valuable collection of Hints&Tricks for UNIX:
Jerry Peek, Tim O'Reilly, Mike Loukides "UNIX Power Tools"
ISBN 1565922603
A detailed view on all UNIX-variants incl. Solaris software and Linux
Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein "UNIX System
Administration Handbook"
ISBN 0130206016
12.2 站点
http://www.sun.com Homepage of Sun Microsystems
http://www.sun.com/bigadmin Everything a sys admin needs
http://www.sun.com/blueprints Blueprints on various topics, monthly additions
http://docs.sun.com All documentation for Sun products online
http://sunsolve.sun.com Technical faq's, infodocs, symptom/resulution database,
patch download etc.
http://www.sunfreeware.com All Freeware-Tools for Solaris, precompiled
http://www.sunhelp.org FAQ portal, other information
http://bhami.com/rosetta.html A Sysadmin's Unixersal Translator (ROSETTA STONE)
OR What do they call that (command) in this world (Unix)?

From: http://bbs.chinaunix.net/viewthread.php?tid=326405  

date 命令可以用来显示和设置系统的日期和时间。其后可以带表示显示数据格式的参数,这些参数可以让你灵活的显示当前的时间格式:
%a:星期中每日名字的缩写
%A:星期中每日名字的全拼
%b:月份名的缩写
%B:月份名的全拼
%c:针对具体国家的日期和时间格式
%d:月中的某天,取值为01-31
%D:以格式%m%d%y表示的日期
%e:月中的某天,取值为1-31
%h:月份名的缩写(%b的别名)
%H:小时,取值为00-23
%I:小时,取值为01-12
%j:一年中的某天,取值为001-366
%m:一年中的某月,取值为01-12
%M:分钟,取值为00-59
%n:插入一个换行符
%p:包含午前或午后指示符的字符串(默认值为AM或PM)
%r:时间,格式为%I:%M:%S:%p
%R:时间,格式为%H:%M
%S:秒,取值为00-59
%t:插入一个制表符
%T:时间,格式为%H:%M:%S
%U:一年中的某星期(星期天为每星期的第一天),取值为00-53
%w:一年中的某天,星期天用0表示
%W:一年中的某星期(星期一为每星期的第一天),取值为00-53
%x:针对具体国家的日期格式
%X:针对具体国家的时间格式
%y:一个世纪中的某年,取值为0-99
%Y:年,其格式为ccyy(4个数字)
%Z:时区名

for example:  #date '+DATE:%m/%d/%y%nTIME:%H:%M:%S'

显示为:DATE:05/17/04
            TIME:09:32:02

tar gzip unzip 命令参数详解

From: http://sujian.blog.51cto.com/blog/8838/3456  

TAR
命令名
tar - tar 档案文件管理程序的 GNU 版本。下面将逐个介绍其含义
总览
tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | u --update | x -extract --get [ --atime-preserve ] [ -b, --block-size N ] [ -B, --read-full-blocks ] [ -C, --directory DIR ] [ --checkpoint ]
[ -f, --file [HOSTNAME:]F ] [ --force-local ]
[ -F, --info-script F --new-volume-script F ] [ -G, --incremental ] [ -g, --listed-incremental F ] [ -h, --dereference ] [ -i, --ignore-zeros ] [ -I, --bzip ] [ --ignore-failed-read ] [ -k, --keep-old-files ] [ -K, --starting-file F ] [ -l, --one-file-system ] [ -L, --tape-length N ] [ -m, --modification-time ] [ -M, --multi-volume ] [ -N, --after-date DATE, --newer DATE ] [ -o, --old-archive, --portability ] [ -O, --to-stdout ] [ -p, --same-permissions, --preserve-permissions ] [ -P, --absolute-paths ] [ --preserve ]
[ -R, --record-number ] [ --remove-files ] [ -s, --same-order, --preserve-order ] [ --same-owner ] [ -S, --sparse ] [ -T, --files-from F ] [ --null ]
[ --totals ]
[ -v, --verbose ] [ -V, --label NAME ] [ --version ]
[ -w, --interactive, --confirmation ] [ -W, --verify ]
[ --exclude FILE ] [ -X, --exclude-from FILE ] [ -Z, --compress, --uncompress ] [ -z, --gzip, --ungzip ]
[ --use-compress-program PROG ] [ --block-compress ] [ -[0-7][lmh] ]

filename1 [ filename2, ... filenameN ]
directory1 [ directory2, ...directoryN ]


描述
tar 程序用于储存或展开 tar 存档文件。存档文件可放在磁盘中 ,也可以存为普通文件。 tar是需要参数的,可选的参数是A、c、d、r、t、u、x,您在使用tar时必须首先为 tar 指定至少一个参数;然后,您必须指定要处理的文件或目录。如果指定一个目录则该目录下的所有子目录都将被加入存档。
应用举例:

1)展开 abc.tar.gz 使用命令: tar xvzf abc.tar.gz 展开 abc.tar 使用命令: tar xvf abc.tar

2)将当前目录下的 man 目录及其子目录存成存档 man.tar tar cf man.tar ./man
参数说明
运行tar时必须要有下列参数中的至少一个才可运行

-A, --catenate, --concatenate
将一存档与已有的存档合并
-c, --create
建立新的存档
-d, --diff, --compare
比较存档与当前文件的不同之处
--delete
从存档中删除
-r, --append
附加到存档结尾
-t, --list
列出存档中文件的目录
-u, --update
仅将较新的文件附加到存档中
-x, --extract, --get
从存档展开文件


其他参数

--atime-preserve
不改变转储文件的存取时间

-b, --block-size N
指定块大小为 Nx512 字节(缺省时 N=20)

-B, --read-full-blocks
读取时重组块(???!!!)

-C, --directory DIR

转到指定的目录

--checkpoint
读取存档时显示目录名

-f, --file [HOSTNAME:]F
指定存档或设备 (缺省为 /dev/rmt0)

--force-local
强制使用本地存档,即使存在克隆

-F, --info-script F --new-volume-script F
在每个磁盘结尾使用脚本 F (隐含 -M)

-G, --incremental
建立老 GNU 格式的备份

-g, --listed-incremental F
建立新 GNU 格式的备份

-h, --dereference
不转储动态链接,转储动态链接指向的文件。

-i, --ignore-zeros
忽略存档中的 0 字节块(通常意味着文件结束)

--ignore-failed-read
在不可读文件中作 0 标记后再退出???

-k, --keep-old-files
保存现有文件;从存档中展开时不进行覆盖

-K, --starting-file F
从存档文件 F 开始

-l, --one-file-system
在本地文件系统中创建存档

-L, --tape-length N
在写入 N*1024 个字节后暂停,等待更换磁盘

-m, --modification-time
当从一个档案中恢复文件时,不使用新的时间标签

-M, --multi-volume
建立多卷存档,以便在几个磁盘中存放

-N, --after-date DATE, --newer DATE
仅存储时间较新的文件

-o, --old-archive, --portability
以 V7 格式存档,不用 ANSI 格式

-O, --to-stdout
将文件展开到标准输出

-p, --same-permissions, --preserve-permissions
展开所有保护信息

-P, --absolute-paths
不要从文件名中去除 '/'

--preserve
like -p -s
与 -p -s 相似

-R, --record-number
显示信息时同时显示存档中的记录数

--remove-files
建立存档后删除源文件

-s, --same-order, --preserve-order
???
--same-owner
展开以后使所有文件属于同一所有者

-S, --sparse
高效处理

-T, --files-from F
从文件中得到要展开或要创建的文件名

--null
读取空结束的文件名,使 -C 失效

--totals
显示用 --create 参数写入的总字节数

-v, --verbose
详细显示处理的文件

-V, --label NAME
为存档指定卷标

--version
显示 tar 程序的版本号

-w, --interactive, --confirmation
每个操作都要求确认

-W, --verify
写入存档后进行校验

--exclude FILE
不把指定文件包含在内

-X, --exclude-from FILE
从指定文件中读入不想包含的文件的列表

-y, --bzip2, --bunzip2
用 bzip2 对存档压缩或解压

-Z, --compress, --uncompress
用 compress 对存档压缩或解压

-z, --gzip, --ungzip
用 gzip 对存档压缩或解压

--use-compress-program PROG
用 PROG 对存档压缩或解压 ( PROG 需能接受 -d 参数)

--block-compress
为便于磁盘存储,按块记录存档

-[0-7][lmh]
指定驱动器和密度[高中低]

--------------------------

打包: tar -cf soft.tar soft

解包: tar -xf soft.tar soft

压缩目录

打包压缩:tar czvf usr.tar.gz /home

解压缩:tar xzvf usr.tar.gz

压缩文件(对于目录失效)

压缩:zip good.zip good1 good2

解压:unzip good.zip

 

From: http://blog.csdn.net/yinchongyi/archive/2006/11/02/1362350.aspx  

tar、gzip、unzip详解

tar命令

tar 可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被 用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将 几个文件组合成为一个文件以便于网络传输是非常有用的。
Linux上的tar是GNU版本的。

语法:tar [主选项+辅选项] 文件或者目录
使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。

主选项:

c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。
  例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,
  这时可以使用该选项,将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容,查看已经备份了哪些文件。
u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份 文件的最后。
x 从档案文件中释放文件。

辅助选项:

b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。
f 使用档案文件或设备,这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。
m 在还原文件时,把所有文件的修改时间设定为现在。
M 创建多卷的档案文件,以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。

 
Linux下的压缩文件剖析

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。
别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap。
可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,
此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。
本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕.


  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:
  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:


  # tar -cf all.tar *.jpg
  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。


  # tar -rf all.tar *.gif
  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。


       # tar -uf all.tar logo.gif
  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar
  这条命令是列出all.tar包中所有文件,-t是列出文件的意思


  # tar -xf all.tar
  这条命令是解出all.tar包中所有文件,-t是解开的意思
  以上就是tar的最基本的用法。

        为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。
  1) tar调用gzip

        gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:
  # tar -czf all.tar.gz *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz
  # tar -xzf all.tar.gz
  这条命令是将上面产生的包解开。


  2) tar调用bzip2
  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:
  # tar -cjf all.tar.bz2 *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2
  # tar -xjf all.tar.bz2
  这条命令是将上面产生的包解开。


        3)tar调用compress
   compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与 compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:
  # tar -cZf all.tar.Z *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z
  # tar -xZf all.tar.Z
  这条命令是将上面产生的包解开
  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:
  1)对于.tar结尾的文件
  tar -xf all.tar
  2)对于.gz结尾的文件
  gzip -d all.gz
  gunzip all.gz
  3)对于.tgz或.tar.gz结尾的文件
  tar -xzf all.tar.gz
  tar -xzf all.tgz
  4)对于.bz2结尾的文件
  bzip2 -d all.bz2
  bunzip2 all.bz2
  5)对于tar.bz2结尾的文件
  tar -xjf all.tar.bz2
  6)对于.Z结尾的文件
  uncompress all.Z
  7)对于.tar.Z结尾的文件
  tar -xZf all.tar.z

unzip命令

unzip命令,该命令用于解扩展名为.zip的压缩文件。

语法:unzip [选项] 压缩文件名.zip

各选项的含义分别为:

-x 文件列表 解压缩文件,但不包括指定的file文件。

-v 查看压缩文件目录,但不解压。

-t 测试文件有无损坏,但不解压。

-d 目录把压缩文件解到指定目录下。

-z 只显示压缩文件的注解。

-n 不覆盖已经存在的文件。

-o 覆盖已存在的文件且不要求用户确认。

-j 不重建文档的目录结构,把所有文件解压到同一目录下。

例1:将压缩文件text.zip在当前目录下解压缩。

$ unzip text.zip 

例2:将压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。

$ unzip -n text.zip -d /tmp 

例3:查看压缩文件目录,但不解压。

$ unzip -v text.zip

gzip命令

gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。

语法:gzip [选项] 压缩(解压缩)的文件名
各选项的含义:
-c 将输出写到标准输出上,并保留原有文件。
-d 将压缩文件解压。
-l 对每个压缩文件,显示下列字段:
  压缩文件的大小
  未压缩文件的大小
  压缩比
  未压缩文件的名字
-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
-t 测试,检查压缩文件是否完整。
-v 对每一个压缩和解压的文件,显示文件名和压缩比。
-num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。

假设一个目录/home下有文件mm.txt、sort.txt、xx.com。
例1:把/home目录下的每个文件压缩成.gz文件。
$ cd /home
$ gzip *
$ ls
m.txt.gz sort.txt.gz xx.com.gz

例2:把例1中每个压缩的文件解压,并列出详细的信息。
$ gzip -dv *
mm.txt.gz 43.1%-----replaced with mm.txt
sort.txt.gz 43.1%-----replaced with sort.txt
xx.com.gz 43.1%-----replaced with xx.com
$ ls
mm.txt sort.txt xx.com
 
例3:详细显示例1中每个压缩的文件的信息,并不解压。
$ gzip -l *
compressed uncompr. ratio uncompressed_name
277 445 43.1% mm.txt
278 445 43.1% sort.txt
277 445 43.1% xx.com
$ ls
mm.txt.gz sort.txt.gz xx.com.gz

例4:压缩一个tar备份文件,如usr.tar,此时压缩文件的扩展名为.tar.gz
$ gzip usr.tar
$ ls
usr.tar.gz

About this Archive

This page is an archive of entries from April 2007 listed from newest to oldest.

March 2007 is the previous archive.

May 2007 is the next archive.

Find recent content on the main index or look in the archives to find all content.