免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2667 | 回复: 0
打印 上一主题 下一主题

solaris的技术文档 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-30 23:11 |只看该作者 |倒序浏览
启动有四个阶段
Boot PROM 阶段
Boot program 阶段
Kernel 初始化阶段
/sbin/init 阶段
启动过程:
自检、显示系统信息、读取启动设备的0扇区、在启动设备寻找启动程序、加载启动程序、启动内核、运行/sbin/init。
/sbin/init程序
读取/etc/inittab文件。Init程序执行/sbin/rc*脚本。
系统有多种运行级别,不同的运行级别所启动的服务不同。
系统运行级别有8种,分别为:
运行级别 意义
0 进入PROM状态(OK状态)
1 管理状态(所有文件系统都挂上的单用户模式,禁止其他用户登录)
2 多用户模式(没有网络文件共享服务)
3 多用户模式(有网络文件共享服务)
4 未使用
5 退出操作系统并关机
6 重新启动机器
S,s 单用户模式
who命令查看运行级别
# who -r
. run-level 3 5月 10 17:03 3 0 S
可得到的信息:当前运行级别是3,系统启动的时间是5月10日17:03.
/etc/inittabinittab定义了:
系统缺省运行级别
系统进入新运行级别需要做什么
/etc/init.d目录包含了系统的一些启动脚本
/etc/rc1.d目录包含进入运行级别1所需要运行的一些脚本
/etc/rc2.d目录包含进入运行级别2所需要运行的一些脚本
...
...
这些目录下包含两种文件:
以K打头,后面跟两个数字以及一些字符串:表示系统到这个运行级别时所需要停止的一些服务,系统将以stop调用这个脚本。
以S打头,后面跟两个数字以及一些字符串:表示系统到这个运行级别时所需要开始的一些服务,系统将以start调用这个脚本。
增加启动控制脚本
1.Identify the run level for the service
2.Determine which services are needed by the new process
3.Change to /etc/rc#.d and identify startup script
4.Repeat the process for the Directory containing the shutdown script
5.Create the startup (shutdown) script in /etc/init.d
6.Create hard links to appropriate /etc/rc#.d directorIEs
7.test
改变运行级别
init命令用于改变操作系统的运行级别。
命令格式:
init [ 0123456Ss ]
# init 0
INIT: New run level: 0
The system is coming down. Please wait.
System services are now being stopped.
Print services stopped.
Stopping the syslog service.
syslogd: going down on signal 15
Aug 14 14:54:30 snmpdx: received signal 15
The system is down.
syncing file systems... done
Program terminated
Type help for more information
ok
shutdown
用于改变操作系统运行级别。
命令格式:
shutdown [ -y ] [ -g seconds ] [ -i init-state ] [message]
选项:
y 系统提示时默认回答为YES
g 过多长时间改变
i 想要的运行级别
message 给所有登录用户的信息
# shutdown -y -g 0 -i 0
Shutdown started. Mon Dec 15 15:13:57 PST 1997
Broadcast Message from root (console) on mcmurdo Mon Dec
15 15:13:57...
THE SYSTEM IS BEING SHUT DOWN NOW ! ! !
Log off now or risk your files being damaged
Changing to init state 0 - please wait
ok
halt
进入0运行级别
poweroff
关闭系统并切断电源
reboot
重新启动系统
cpio
#cpio -idcmv mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
hme0: flags=1000843 mtu 1500 index 2
inet 192.168.10.25 netmask ffffff00 broadcast 192.168.10.255
ether 8:0:20:a2:11:de
#
#ifconfig le0 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255 up
banner
你也可以在系统还没有启动时在ok提示符下敲入banner来找到Mac地址,CPU 型号和频率。
ok banner
un Ultra 5/10 UPA/PCI (UltraSPARC-IIi 300MHz), Keyboard Present
OpenBoot 3.1.1 64 MB memory installed, Serial #9361102.
Ethernet address 8:0:20:8e:d6:ce, HostID: 808ed6ce.
# arp -a //登陆用户
Net to Media Table: IPv4
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
pcn0 192.168.0.1 255.255.255.255 00:03:0f:fd:6d:0c
pcn0 wing 255.255.255.255 SP 00:0c:29:19:a1:54
pcn0 224.0.0.0 240.0.0.0 SM 01:00:5e:00:00:00
# netstat // 网络状态
TCP: IPv4
Local Address Remote Address Swind Send-Q Rwind Recv-Q State
-------------------- -------------------- ----- ------ ----- ------ -------
wing.telnet 192.168.0.1.1030 7168 0 66608 0 ESTABLISHED
wing.telnet 192.168.0.1.1032 6253 1 66608 0 ESTABLISHED
Active Unix domain sockets
Address Type Vnode Conn Local Addr Remote Addr
df187cc0 stream-ord dee4c1c0 00000000 /tmp/.X11-unix/X0
df187de8 stream-ord 00000000 00000000
#
# netstat -r //查看路由表
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ------ ---------
192.168.0.0 wing U 1 3 pcn0
224.0.0.0 wing U 1 0 pcn0
default wing UG 1 0
localhost localhost UH 2 6 lo0
# netstat -g
Group Memberships: IPv4
Interface Group RefCnt
--------- -------------------- ------
lo0 224.0.0.1 1
pcn0 224.0.0.1 1
# netstat -p
Net to Media Table: IPv4
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
pcn0 192.168.0.1 255.255.255.255 00:03:0f:fd:6d:0c
pcn0 solaris9 255.255.255.255 SP 00:0c:29:80:4c:0a
pcn0 224.0.0.0 240.0.0.0 SM 01:00:5e:00:00:00
#
# netstat -s
RAWIP
rawipInDatagrams = 0 rawipInErrors = 0
rawipInCksumErrs = 0 rawipOutDatagrams = 0
rawipOutErrors = 0
UDP
udpInDatagrams = 923 udpInErrors = 0
udpOutDatagrams = 928 udpOutErrors = 0
TCP tcpRtoAlgorithm = 4 tcpRtoMin = 400
tcpRtoMax = 60000 tcpMaxConn = -1
tcpActiveOpens = 18 tcpPassiveOpens = 21
tcpAttemptFails = 0 tcpEstabResets = 0
tcpCurrEstab = 31 tcpOutSegs = 715
tcpOutDataSegs = 524 tcpOutDataBytes = 52210
tcpRetransSegs = 0 tcpRetransBytes = 0
tcpOutAck = 191 tcpOutAckDelayed = 90
tcpOutUrg = 0 tcpOutWinUpdate = 0
tcpOutWinProbe = 0 tcpOutControl = 47
tcpOutRsts = 0 tcpOutFastRetrans = 0
tcpInSegs = 925
tcpInAckSegs = 505 tcpInAckBytes = 52216
tcpInDupAck = 7 tcpInAckUnsent = 0
tcpInInorderSegs = 524 tcpInInorderBytes = 45645
tcpInUnorderSegs = 0 tcpInUnorderBytes = 0
tcpInDupSegs = 0 tcpInDupBytes = 0
tcpInPartDupSegs = 0 tcpInPartDupBytes = 0
tcpInPastWinSegs = 0 tcpInPastWinBytes = 0
tcpInWinProbe = 0 tcpInWinUpdate = 0
tcpInClosed = 0 tcpRttNoUpdate = 0
tcpRttUpdate = 497 tcpTimRetrans = 0
tcpTimRetransDrop = 0 tcpTimKeepalive = 0
tcpTimKeepaliveProbe= 0 tcpTimKeepaliveDrop = 0
tcpListenDrop = 0 tcpListenDropQ0 = 0
tcpHalfOpenDrop = 0 tcpOutSackRetrans = 0
IPv4 ipForwarding = 2 ipDefaultTTL = 255
ipInReceives = 422 ipInHdrErrors = 0
ipInAddrErrors = 0 ipInCksumErrs = 0
ipForwDatagrams = 0 ipForwProhibits = 0
ipInUnknownProtos = 0 ipInDiscards = 0
ipInDelivers = 1832 ipOutRequests = 265
ipOutDiscards = 0 ipOutNoRoutes = 0
ipReasmTimeout = 60 ipReasmReqds = 0
ipReasmOKs = 0 ipReasmFails = 0
ipReasmDuplicates = 0 ipReasmPartDups = 0
ipFragOKs = 0 ipFragFails = 0
ipFragCreates = 0 ipRoutingDiscards = 0
tcpInErrs = 0 udpNoPorts = 20
udpInCksumErrs = 0 udpInOverflows = 0
rawipInOverflows = 0 ipsecInSucceeded = 0
ipsecInFailed = 0 ipInIPv6 = 0
ipOutIPv6 = 0 ipOutSwitchIPv6 = 8
IPv6 ipv6Forwarding = 2 ipv6DefaultHopLimit = 255
ipv6InReceives = 0 ipv6InHdrErrors = 0
ipv6InTooBigErrors = 0 ipv6InNoRoutes = 0
ipv6InAddrErrors = 0 ipv6InUnknownProtos = 0
ipv6InTruncatedPkts = 0 ipv6InDiscards = 0
ipv6InDelivers = 0 ipv6OutForwDatagrams= 0
ipv6OutRequests = 0 ipv6OutDiscards = 0
ipv6OutNoRoutes = 0 ipv6OutFragOKs = 0
ipv6OutFragFails = 0 ipv6OutFragCreates = 0
ipv6ReasmReqds = 0 ipv6ReasmOKs = 0
ipv6ReasmFails = 0 ipv6InMcastPkts = 0
ipv6OutMcastPkts = 0 ipv6ReasmDuplicates = 0
ipv6ReasmPartDups = 0 ipv6ForwProhibits = 0
udpInCksumErrs = 0 udpInOverflows = 0
rawipInOverflows = 0 ipv6InIPv4 = 0
ipv6OutIPv4 = 0 ipv6OutSwitchIPv4 = 0
ICMPv4 icmpInMsgs = 5 icmpInErrors = 0
icmpInCksumErrs = 0 icmpInUnknowns = 0
icmpInDestUnreachs = 5 icmpInTimeExcds = 0
icmpInParmProbs = 0 icmpInSrcQuenchs = 0
icmpInRedirects = 0 icmpInBadRedirects = 0
icmpInEchos = 0 icmpInEchoReps = 0
icmpInTimestamps = 0 icmpInTimestampReps = 0
icmpInAddrMasks = 0 icmpInAddrMaskReps = 0
icmpInFragNeeded = 0 icmpOutMsgs = 5
icmpOutDrops = 0 icmpOutErrors = 0
icmpOutDestUnreachs = 5 icmpOutTimeExcds = 0
icmpOutParmProbs = 0 icmpOutSrcQuenchs = 0
icmpOutRedirects = 0 icmpOutEchos = 0
icmpOutEchoReps = 0 icmpOutTimestamps = 0
icmpOutTimestampReps= 0 icmpOutAddrMasks = 0
icmpOutAddrMaskReps = 0 icmpOutFragNeeded = 0
icmpInOverflows = 0
ICMPv6 icmp6InMsgs = 0 icmp6InErrors = 0
icmp6InDestUnreachs = 0 icmp6InAdminProhibs = 0
icmp6InTimeExcds = 0 icmp6InParmProblems = 0
icmp6InPktTooBigs = 0 icmp6InEchos = 0
icmp6InEchoReplies = 0 icmp6InRouterSols = 0
icmp6InRouterAds = 0 icmp6InNeighborSols = 0
icmp6InNeighborAds = 0 icmp6InRedirects = 0
icmp6InBadRedirects = 0 icmp6InGroupQueries = 0
icmp6InGroupResps = 0 icmp6InGroupReds = 0
icmp6InOverflows = 0
icmp6OutMsgs = 0 icmp6OutErrors = 0
icmp6OutDestUnreachs= 0 icmp6OutAdminProhibs= 0
icmp6OutTimeExcds = 0 icmp6OutParmProblems= 0
icmp6OutPktTooBigs = 0 icmp6OutEchos = 0
icmp6OutEchoReplies = 0 icmp6OutRouterSols = 0
icmp6OutRouterAds = 0 icmp6OutNeighborSols= 0
icmp6OutNeighborAds = 0 icmp6OutRedirects = 0
icmp6OutGroupQueries= 0 icmp6OutGroupResps = 0
icmp6OutGroupReds = 0
IGMP:
0 messages received
0 messages received with too few bytes
0 messages received with bad checksum
0 membership queries received
0 membership queries received with invalid field(s)
0 membership reports received
0 membership reports received with invalid field(s)
0 membership reports received for groups to which we belong
0 membership reports sent
# netstat -M
Virtual Interface Table is empty
Multicast Forwarding Cache is empty
#
# netstat -r //网络接口状态
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ------ ---------
192.168.0.0 solaris9 U 1 1 pcn0
192.168.0.0 address2 U 1 0 pcn0:1
224.0.0.0 solaris9 U 1 0 pcn0
default 192.168.0.1 UG 1 0
localhost localhost UH 2 6 lo0
# netstat -rn
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ------ ---------
192.168.0.0 192.168.0.3 U 1 1 pcn0
192.168.0.0 192.168.0.5 U 1 0 pcn0:1
224.0.0.0 192.168.0.3 U 1 0 pcn0
default 192.168.0.1 UG 1 0
127.0.0.1 127.0.0.1 UH 2 6 lo0
#
# netstat -i 1 5
input pcn0 output input (Total) output
packets errs packets errs colls packets errs packets errs colls
1187 0 1318 0 0 3699 0 3830 0 0
4 0 4 0 0 4 0 4 0 0
3 0 3 0 0 5 0 5 0 0
4 0 4 0 0 4 0 4 0 0
3 0 4 0 0 5 0 6 0 0
#
snoop
# snoop -c 3 //抓取3IP包
Using device /dev/pcn0 (promiscuous mode)
192.168.0.1 -> solaris9 TELNET C port=3013
solaris9 -> 192.168.0.1 TELNET R port=3013 Using device /dev/pc
192.168.0.1 -> solaris9 TELNET C port=3013
3 packets captured
#
# snoop -v -c 2 //抓取两个详细的IP包。
Using device /dev/pcn0 (promiscuous mode)
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 1 arrived at 1:43:41.42
ETHER: Packet size = 60 bytes
ETHER: Destination = 0:c:29:80:4c:a,
ETHER: Source = 0:3:f:fd:6d:c,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: .... ..0. = not ECN capable transport
IP: .... ...0 = no ECN congestion experienced
IP: Total length = 40 bytes
IP: Identification = 1627
IP: Flags = 0x4
IP: .1.. .... = do not fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 128 seconds/hops
IP: Protocol = 6 (TCP)
IP: Header checksum = 7320
IP: Source address = 192.168.0.1, 192.168.0.1
IP: Destination address = 192.168.0.3, solaris9
IP: No options
IP:
TCP: ----- TCP Header -----
TCP:
TCP: Source port = 3013
TCP: Destination port = 23 (TELNET)
TCP: Sequence number = 769864152
TCP: Acknowledgement number = 52297913
TCP: Data offset = 20 bytes
TCP: Flags = 0x10
TCP: 0... .... = No ECN congestion window reduced
TCP: .0.. .... = No ECN echo
TCP: ..0. .... = No urgent pointer
TCP: ...1 .... = Acknowledgement
TCP: .... 0... = No push
TCP: .... .0.. = No reset
TCP: .... ..0. = No Syn
TCP: .... ...0 = No Fin
TCP: Window = 17292
TCP: Checksum = 0x7b85
TCP: Urgent pointer = 0
TCP: No options
TCP:
TELNET: ----- TELNET: -----
TELNET:
TELNET: ""
TELNET:
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 2 arrived at 1:43:41.42
ETHER: Packet size = 97 bytes
ETHER: Destination = 0:3:f:fd:6d:c,
ETHER: Source = 0:c:29:80:4c:a,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: .... ..0. = not ECN capable transport
IP: .... ...0 = no ECN congestion experienced
IP: Total length = 83 bytes
IP: Identification = 50744
IP: Flags = 0x4
IP: .1.. .... = do not fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 60 seconds/hops
IP: Protocol = 6 (TCP)
IP: Header checksum = f717
IP: Source address = 192.168.0.3, solaris9
IP: Destination address = 192.168.0.1, 192.168.0.1
IP: No options
IP:
TCP: ----- TCP Header -----
TCP:
TCP: Source port = 23
TCP: Destination port = 3013
TCP: Sequence number = 52297913
TCP: Acknowledgement number = 769864152
TCP: Data offset = 20 bytes
TCP: Flags = 0x18
TCP: 0... .... = No ECN congestion window reduced
TCP: .0.. .... = No ECN echo
TCP: ..0. .... = No urgent pointer
TCP: ...1 .... = Acknowledgement
TCP: .... 1... = Push
TCP: .... .0.. = No reset
TCP: .... ..0. = No Syn
TCP: .... ...0 = No Fin
TCP: Window = 64240
TCP: Checksum = 0xd1f6
TCP: Urgent pointer = 0
TCP: No options
TCP:
TELNET: ----- TELNET: -----
TELNET:
TELNET: "Using device /dev/pcn0 (promiscuous mode)\r\n"
TELNET:
2 packets captured
#
# snoop host1 host2
host1 -> host2 ICMP Echo request
host2 -> host1 ICMP Echo reply
使用snoop实用程序判定系统间实际上传送的什么信,判断网络畅通
# snoop -a dhcpSnoop 的使用
Snoop 是Solaris 系统中自带的工具, 是一个用于显示网络通讯的程序, 它
可捕获IP 包并将其显示或保存到指定文件. (限超级用户使用snoop)
Snoop 可将捕获的包以一行的形式加以总结或用多行加以详细的描述(有
调用不同的参数-v -V来实现). 在总结方式下(-V ) , 将仅显示最高层的相关协
议, 例如一个NFS 包将仅显示NFS 信息, 其低层的RPC, UDP, IP, Ethernet 帧信息将不会显示, 但是当加上相应的参数(-v ), 这些信息都能被显示出来.
参数简介:
[ -a ] # Listen to packets on audio
[ -d device ] # settable to le?, IE?, bf?, tr?
[ -s snaplen ] # Truncate packets
[ -c count ] # Quit after count packets
[ -P ] # Turn OFF promiscuous mode
[ -D ] # Report dropped packets
[ -S ] # Report packet size
[ -i file ] # Read previously captured packets
[ -o file ] # Capture packets in file
[ -n file ] # Load addr-to-name table from file
[ -N ] # Create addr-to-name table
[ -t r|a|d ] # Time: Relative, Absolute or Delta
[ -v ] # Verbose packet display
[ -V ] # Show all summary lines
[ -p first[,last] ] # Select packet(s) to display
[ -x offset[,length] ] # Hex dump from offset for length
[ -C ] # Print packet filter code
由于snoop 的使用非常灵活, 希望能通过下面一些例子的学习来其常见用法.
1. 监听所有以本机为源和目的的包并将其显示出来.
# snoop
2. 监听所有以主机A为源和目的的包并将其显示出来. ( A为主机名, 下同)
- 2 -
# snoop A
3. 监听所有A和B之间的包并将其保存到文件file.
# snoop -o file A B
4. 显示文件file 中指定的包(99-108)
# snoop - i file -p 99,108
99 0.0027 boutique -> sunroof NFS C GETATTR FH=8E6C
100 0.0046 sunroof -> boutique NFS R GETATTR OK
101 0.0080 boutique -> sunroof NFS C RENAME FH=8E6C MTra00192
to .nfs08
102 0.0102 marmot -> viper NFS C LOOKUP FH=561E screen.r.13.i386
103 0.0072 viper -> marmot NFS R LOOKUP No such file or Directory
104 0.0085 bugbomb -> sunroof RLOGIN C PORT=1023 h
105 0.0005 kandinsky -> sparky RSTAT C Get Statistics
106 0.0004 beeblebrox -> sunroof NFS C GETATTR FH=0307
107 0.0021 sparky -> kandinsky RSTAT R
108 0.0073 Office -> jeremiah NFS C READ FH=2584 at 40960 for 8192
5. 详细查看文件file 中第101 个包:
# snoop - i file - v -p101
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 101 arrived at 16:09:53.59
ETHER: Packet size = 210 bytes
ETHER: Destination = 8:0:20:1:3d:94, Sun
ETHER: Source = 8:0:69:1:5f:e, Silicon Graphics
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4, header length = 20 bytes
IP: Type of service = 00
IP: ..0. .... = routine
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: Total length = 196 bytes
IP: Identification 19846
IP: Flags = 0X
IP: .0.. .... = may fragment
IP: ..0. .... = more fragments
?
- 3 -
?
6. 查看主机A和主机B之间的NFS 包(命令中的and 和or 为相应的逻辑运
算)
# snoop - i file rpc nfs and A and B
1 0.0000 A -> B NFS C GETATTR FH=8E6C
2 0.0046 B -> A NFS R GETATTR OK
3 0.0080 A -> B NFS C RENAME FH=8E6C MTra00192 to .nfs08
7. 将这些符合条件的包保存到另一文件file2 中:
# snoop - i file -o file2 rpc nfs A B
8. 监听主机A和主机B间所有TCP 80 端口或UDP80端口的包
# snoop A and B and (tcp or udp) and port 80
9. 监听所有的广播包
# snoop broadcast
Using device /dev/hme (promiscuous mode)
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
10. 监听所有的多播包, 并显示详细内容.
#snoop -v multicast
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 1 arrived at 12:33:2.16
ETHER: Packet size = 69 bytes
ETHER: Destination = ff:ff:ff:ff:ff:ff, (broadcast)
ETHER: Source = 0:4:76:46:8f:50,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
- 4 -
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: Total length = 55 bytes
IP: Identification = 14658
IP: Flags = 0x0
IP: .0.. .... = may fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 128 seconds/hops
IP: Protocol = 17 (UDP)
IP: Header checksum = ed38
IP: Source address = 10.10.10.50, 10.10.10.50
IP: Destination address = 255.255.255.255, BROADCAST
IP: No options
IP:
UDP: ----- UDP Header -----
UDP:
UDP: Source port = 2541
UDP: Destination port = 177
UDP: Length = 35
UDP: Checksum = 8E35
UDP:
ETHER: ----- Ether Header -----
ETHER:
ETHER: Packet 2 arrived at 12:33:12.16
ETHER: Packet size = 69 bytes
ETHER: Destination = ff:ff:ff:ff:ff:ff, (broadcast)
ETHER: Source = 0:4:76:46:8f:50,
ETHER: Ethertype = 0800 (IP)
ETHER:
IP: ----- IP Header -----
IP:
IP: Version = 4
IP: Header length = 20 bytes
IP: Type of service = 0x00
IP: xxx. .... = 0 (precedence)
IP: ...0 .... = normal delay
IP: .... 0... = normal throughput
IP: .... .0.. = normal reliability
IP: Total length = 55 bytes
IP: Identification = 14985
IP: Flags = 0x0
IP: .0.. .... = may fragment
IP: ..0. .... = last fragment
IP: Fragment offset = 0 bytes
IP: Time to live = 128 seconds/hops
IP: Protocol = 17 (UDP)
IP: Header checksum = ebf1
IP: Source address = 10.10.10.50, 10.10.10.50
- 5 -
IP: Destination address = 255.255.255.255, BROADCAST
IP: No options
IP:
UDP: ----- UDP Header -----
UDP:
UDP: Source port = 2541
UDP: Destination port = 177
UDP: Length = 35
UDP: Checksum = 8E35
UDP:
11.监听所有的NTP 协议包
# snoop |grep - i NTP
Using device /dev/hme (promiscuous mode)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:48:50 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:49:54 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:50:58 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:52:02 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:53:06 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:54:10 2002)
这里我们也可看到NTP server 每隔约一分钟即向多播地址广播一次.
date
# date
2003年10月12日 星期日 10时04分16秒 CST
(CST是Chinese Standard Time的缩写)
# date 10121003 设置时间为10月12日10时03分
设备管理
软盘
#volcheck
fdformat [-dDeEfHlLmMUqvx] [-b label] [-B filename] [-t Dos-
type] [devname] //格式化
prtconf
# prtconf //配置信息
System Configuration: Sun Microsystems i86pc
Memory size: 128 Megabytes //内存
System Peripherals (Software Nodes):
i86pc
+boot (driver not attached)
memory (driver not attached)
aliases (driver not attached)
chosen (driver not attached)
i86pc-memory (driver not attached)
i86pc-mmu (driver not attached)
openprom (driver not attached)
options, instance #0
packages (driver not attached)
delayed-writes (driver not attached)
itu-props (driver not attached)
isa, instance #0
motherboard (driver not attached)
asy, instance #0
asy, instance #1
lp (driver not attached)
fdc, instance #0
fd, instance #0
fd, instance #1 (driver not attached)
i8042, instance #0
keyboard, instance #0
mouse, instance #0
PNP0C02 (driver not attached)
PNP0C02 (driver not attached)
PNP0C02 (driver not attached)
bios (driver not attached)
bios (driver not attached)
bios (driver not attached)
pci, instance #0
pci15ad,1976 (driver not attached)
pci8086,7191 (driver not attached)
pci15ad,1976 (driver not attached)
pci-ide, instance #0
ide, instance #0
cmdk, instance #0
ide, instance #1
sd, instance #0
pci15ad,1976, instance #0
pci15ad,1976 (driver not attached)
display, instance #0
pci1022,2000, instance #0
pci1274,1371 (driver not attached)
used-resources (driver not attached)
objmgr, instance #0
cpus (driver not attached)
cpu, instance #0 (driver not attached)
pseudo, instance #0
#
# prtconf | grep Memory //查看内存
Memory size: 128 Megabytes
arch
# arch -k //了解体系结构
i86pc
uname
# uname -m
i86pc
# uname
SunOS
# uname -a
SunOS wing 5.9 Generic_112234-03 i86pc i386 i86pc
eject
#eject floppy
eeprom
#eeprom selftest -#megs=64 //修改系统自检到的内存数
sysdef
#sysdef //更详细的体系机构
df
# df -k //显示当前所有已安装的文件系统上的文件数目和空闲块的数目
文件系统 千字节 用了 可用 容量 挂接在
/dev/dsk/c0d0s0 63127 36143 20672 64% /
/dev/dsk/c0d0s6 1201014 768820 372144 68% /usr
/proc 0 0 0 0% /proc
mnttab 0 0 0 0% /etc/mnttab
fd 0 0 0 0% /dev/fd
/dev/dsk/c0d0s3 55047 25258 24285 51% /var
swap 651040 24 651016 1% /var/run
swap 651016 0 651016 0% /tmp
/dev/dsk/c0d0s5 24239 15 21801 1% /opt
/dev/dsk/c0d0s7 2691830 122 2637872 1% /export/home
/dev/dsk/c0d0s1 462639 306816 109560 74% /usr/openwin
# df -a //打印所有文件系统的信息
/ (/dev/dsk/c0d0s0 ): 53968 块 30100 文件
/usr (/dev/dsk/c0d0s6 ): 864388 块 261705 文件
/proc (/proc ): 0 块 1878 文件
/etc/mnttab (mnttab ): 0 块 0 文件
/dev/fd (fd ): 0 块
上一篇: 在solaris 9 x86
第三章
1、pwconv只要记住这个文件是根据/etc/passwd文件的内容来修改/etc/shadow文件的
内容就可以了。
2、who命令对应/var/adm/utmpx文件,last命令对应/var/adm/wtmpx文件。同时知道
console指控制台,pts指虚设备就是不是实际的物理设备,一般都为远程接入,term
是指从串口连接的设备。应该注意的是console控制台和terminator终端在系统中的区
别。在平时运行两个程序是没有区别的。但在系统发生一些错误等的时候(例如本章
中讲到的sulog的信息写屏)就是到console上,而不会到终端上。这样在系统频繁写
屏的时候就应该打开终端操作。
3、finger命令(呵呵,比我岁数多大的命令吧??)可以知道两个固定的显示文件
----.plan和.projects注意书上说的它们的属性必须是644
4、呵呵,配套命令id,whoami,who am i明白了uid和euid的区别就自然会了。简单
的说就是:uid就是你login时候用的哪个帐户的id,而euid则是你现在有效的uid。程
序在运行的时候一般看的都是euid,当然也有特出的,who am i就是一个。
5、明白了uid和euid的话,就来看看本章的难点:setuid setgid stickybit吧。
系统中有的命令,比如snoop,format等命令涉及到系统的安全,是只有root才可以
使用的。而另一些命令,如passwd等虽然也涉及到系统的安全,但用户也要常使用,
这就造成了一种矛盾。而解决的办法就是用setuid。它的作用是当普通的用户使用
passwd命令的时候,系统将它的euid变为0,这样用户就可以使用这个命令对
/etc/passwd和/etc/shadow来进行操作了。
而setgid虽然形式上和setuid相近,但是在使用上却是和sticky bit比较类似。一般
都是用在一个目录上。用户可以在此创建文件,但是文件的属组不是文件所有人的属
组,而是该目录的属组。
sticky bit也是用在目录上的,但是在该目录创建的文件却只owner of file ,
owner of Directory ,root才可以删除。
说起来现在的sun ray系列绝对是这个思想的延伸。用户只能通过终端在主机上操作,
写的程序想带走都没有办法,呵呵:)
6、ACL我不想写了,书上写的很明白了,可是你照做后虽然用getfacl看有读写的权限,
实际上还是没有。而且不知道sun为什么对这个白痴一样的功能那么感兴趣,我考的时
候居然有两道。真不明白。
照例是几个问题
1、书上说loginlog可以记录连续5次的错误登陆,你试成功了吗?是在任何情况下都
可以吗?
2、如何限制root登陆,即使是在本机也不例外?
3、/etc/default/passwd中的PASSLENGTH是对所有用户都有效的吗?所有用户的口令
必须都遵循吗?
昨天的答案:
1、当使用nfs的时候,远程主机mount 本地的硬盘。理论上远程主机的root用户可以对
自己机器里的任何文件系统进行操作。但当他访问本机的共享硬盘的时候,系统能够自
动将远程主机的root用户的euid改为nobody,从而保护了本地共享硬盘的内容。
2、在用newgrp的时候。A group passWord is used by the newgrp command.
This command is used to log a user into a new group. If that new group has a
password, and the user is not a member of that group, the password has to be
entered before newgrp will continue.
3、还有/etc/issue,/etc/default/telnetd,/etc/default/ftpd它们的作用都是一样的,
可以在用户登陆的时候显示其中的banner=里面的内容。(有的文件要自己创建)
4、如果用户主目录下存在这个文件,则不会有任何信息输出到用户的控制台上。天的答案:
1、loginlog不是任何情况下都可以的,它只对文字终端的登陆有效。你在普通的
图形登陆窗口的错误它是不会记载的。
2、就是在/etc/default/login里面的console选项改为CONSOLE= 然后再把su命令
改名或改位置,这样外人就无法用root登陆了,即使他有密码。
3、不是对所有都有效。当你用root帐户给用户设定口令的时候不受任何限制(就
是别太长了,呵呵)
第四章:
1、文件类型:
当使用ls -l命令的时候,在最开始的哪个标志位就是显示文件类型用的。
主要是以下几种:
d 目录
l 连接文件
c 字符设备(原始设备)
b 块设备
还有3种不常见的:
s sockets 文件
p 管道文件
doors文件(这个不知道,呵呵)
(那两种是什么开头我也不知道)
- 普通文件,剩下的都是这一类了。
要再从普通文件中分类的话,你用file命令吧:)
2、关于inode的问题。
纯粹的概念问题。记住普通的文件是什么样子的,然后知道软连接和目录实际上就
是一个指针库再加上一个(软连接)或几个(目录)普通文件就是了,硬连接实际
是指到同一个 普通文件的几个名称。
至于设备文件比较特出,看看解决下面的题就可以了。
问题:呵呵,本章没什么东西啦,顺便复习一下find命令吧:)
1、# cd /devices/pci@1f,0/pci@1,1/ide@3
# ls -l
total 0
brw------- 1 root sys 136, 0 Apr 3 11:11 dad@0,0:a
crw------- 1 root sys 136, 0 Apr 3 11:11 dad@0,0:a,raw
这是什么文件?有什么区别?136和0分别是什么?
2、find 的几个常用的选项:name type atime perm inum(就是本课的)是干什么的案:
1、上面是块设备,下面是原始设备。
136是最大设备号,0是最小设备号。
2、-name 按名字查找
-type 按文件类型查找
-atime 按最近访问的时间
-perm 按文件权限
-inum 按文件的inode号
第五章
1、关于slice的概念。
在本章中介绍了一些硬盘的基础知识。其中大部分的内容和Windows下的没有区别。
唯一特出的概念是slice。slice就相当于在Dos下的分区的概念,一个slice就相当于
一个逻辑的硬盘,但在数目上是有限制的。一块物理硬盘可以分为0~7共8个slice,
但其中的slice2指代的是整个物理硬盘。(有的时候直接用2比较方便,比如对一块
物理硬盘进行fsck,可以用fsck /dev/rdsk/cxtxdxs2来对所有扇区(slice)进行操作)
在solaris中一般设定的分区号是:
/ slice 0
swap slice 1
/var slice 3
/opt slice 5
/usr slice 6
/export/home slice 7
这些不是标准,只是一个比较习惯的分区方法。由于sun的默认情况下是这样的分法,
所以它的文档中有一些说明是按照这个写的。建议在可能的情况下如此分配。另外,
没有单独分slice的目录,它的容量都占用它的父目录所在分区容量。如,不给
/export/home单独分区,则它将占用/export所在分区容量,而/export也没有单独分区,
则占用/分区的容量。
slice的命名规则:cxtxdxsx
c是指controler number。举个简单的例子:在使用scsi的时候,比如你的机器有3个
外接的scsi接口,则从不同的scsi接口连出来的外置硬盘(一个或几个)有不同
的cx。x是有接口决定的。
t是指target number。在scsi中来说,一般就是scsi id。这点要注意的是有的设备
不要随便改动。如cdrom(dvdrom)在sun的硬件中默认是6,如果通过跳线改为别的数目,
则在openboot中的cdrom的假名有可能仍指向原先的target 6,那么这时boot cdrom命
令无法正常实现。
d是指disk number。在sun的系统中scsi设备一般都设置为0
s当然就是指slice number了。
2、逻辑设备名和物理设备名
逻辑设备名在/dev目录下,是我们一般使用的类似/dev/dsk/cxtxdxsx的名称,他们都
是连接到/device目录下的物理设备名上。
物理设备名在/device目录下,我们一般不使用它。只是对有些机器(如3500)或有些
时候(如cdrom的target号与默认情况下不同)会使用物理设备名。
3、/etc/path_to_inst prtconf
本章中介绍的关于硬件的一个文件和一个命令。通常情况下,如果设备被系统正常识别,
则即使它没有被配置使用,也可以在这两个文件中显示出来。最明显的例子是添加网
卡但没有写hostname.*和使用ifconfiig命令的时候,系统可以知道有网卡,但不能使
用。通常的网卡instance号可以从0一直往下排,但对千兆网卡来说是不一定的,需要
先从/etc/path_to_inst文件中找出instance号,并写如kernel下的ge.conf文件中。
(不知道最近的千兆网卡是不是何以不配置了,有知道的请给个帖子)
4、重新配置系统硬件
关机的方法:touch /reconfigure boot -r
不关机的方法:devfsadm drvconfig
devfsadm只能在8里面是用,它其实就是drvconfig的一个前端程序,比较方便而以,
不用再多敲disks tapes这样的命令:)。平常使用的时候可能对-c指定相应设备
和-i限制相应设备用的不多,敲一个devfsadm就搞定,但考试的时候可是会考的,还
是应该记一下。
问题:
1、知道你的机器是否支持能源之星吗?怎么看?(提示,用本章里讲的一个重要的命令)
2、用reboot命令从新配置系统硬件是怎样写的?(一道考试题)
3、物理名:/pci@1f,2000/ @1是指450机器上的什么设备??答案:
1、prtconf -vp|grep energystar
2、reboot -- -r
3、slot 5见http://sunsolve.sun.com/pub-cgi/retrIEve.pl?doc=finfodoc%2F18931&zone_110=18931
第六章
本章主要只讲了一个命令:format
所以如果你有实验环境,亲手做两遍,那就自然学会了。如果你没有实验环境,那就只
能多看书上的例子了,那难度就相应的要大许多了。
1、VTOC:volume table of contents
label:就是将分区信息写入硬盘。也就是说你分区完成之后如果不进行label这一步,
则之前的分区无效。
2、wasted 和overlapping disk slice的概念和Dos 下是一样的。一个是分区中间有间
隔(未使用空间),一个是分区互相重叠(重复使用空间)
3、/etc/format.dat文件。对于新的硬盘来说这个文件已经不起作用了,当你打开文件
可以看到最大的硬盘容量只是记录到2.9G左右。这是因为近年来sun都是使用oem厂商的
硬盘,如IBM,SEAGATE,富士通等。各厂商没有一个统一的硬盘物理数据,所以这个文件
也就没有作用了。但是习惯上我们有什么类似硬盘分区等的存盘文件,一般也放到这个
文件里。
BTW:说几句题外话,/etc/format.dat这个文件不起作用了,导致水货硬盘的流行,而
且十分猖狂。没硬盘的话还是找大的代理比较好。或者直接买兼容硬盘:)
4、prtvtoc和fmthard命令
注意它们都是对raw设备(原始设备)操作的命令。
prtvtoc /dev/rdsk/cxtxdxs2 > /vtoc/aaa
fmthard -s /vtoc/aaa /dev/rdsk/cxtxdxs2
这也算是一种备份了,虽然用的不是很广泛,使用的场合也不会多,但就是一个命令那
么简单你不会犯这个懒吧??(其实我是会的啦:))
5、本章的练习里面提到了一个重要的命令dd它是以原始设备为操作对象的,最常用的
方法是硬盘对拷。
我只对课后给出的命令来解释,具体的可以去看man手册。
dd if=/dev/zero of=/dev/rdsk/c1t3d0s2 bs=512 count=1
其中if 是输出,of是输入。常用的是if=/dev/rdsk/.... of=/dev/rdsk/....来实现两
块硬盘对拷。bs是指block size一般为512 count是指拷贝的block数。一般不写来指所
有block。这里只是想将硬盘的vtoc区覆盖,所以他写count=1,只拷贝一个block
估计大家都已经注意到了,我讲的这几条都是比较次要的东西,真正重要的是format命
令的使用。还是那句话,做实验是最重要的!!!如果实在没有环境,看书上的例子有
图也比较容易明白。
问题:
1、tag 和flag的具体用法是什么?? 答案:
1、现在已经无效了,不必考虑。
2、$的用法:在分区时指代所有未使用空间。通常在分硬盘最后一个分区的时候使用。
第七章
1、文件系统:
基于磁盘的文件系统:ufs,hsfs,pcfs,udf。其中前三中都是以前就支持的,第四种
是dvd光盘的格式。这种格式是在Solaris 7 11/99版本中开始支持的。
分布式文件系统:nfs只用在网络共享的时候。
伪文件系统:tmpfs,swapfs,fdfs,procfs等等,一般都是操作系统自己调用。还有几
种应该也是属于伪文件系统,例如loopbackfs。具体的参见
Solaris 8 System Administration Guide, Volume II(当然考试不会考的)。
2、ufs文件系统。在solaris系统中最常见的当然是ufs文件系统,本章中是分为几个
部分来介绍的:
系统的结构。对常使用的人来说应该是再熟悉不过了。就是那么几个目录,找系统配
置文件去etc,找系统可执行文件去bin,找系统相关文件去usr(solaris的大部分东
西是安装在这个目录下的,包括openwin和cde),找第三方应用去opt,找共享软件
去/usr/local等等。虽然不是完全固定的,但也总称的上是有迹可寻。
数据存储方式。对于7-7的图有个总体的理解就可以了,primary superblock的概念
就和Dos下的fat表的概念一样,记录了文件inode的存储位置。而backup superblock
就是primary superblock的备份。常见的在我们newfs一块硬盘的时候,显示一大堆
数字,中间用逗号分割开的就是各个backup superblock的存储位置。这样,当文件
系统报superblock(primary superblock)错误的时候,就可以用backup superblock
的内容来修复。
系统指针。可能是在编程的时候才会用到的内容,直接指针,单间接指针,双间接指针,
三间接指针。其可访问的物理地址逐步增大。
数据块。在数据块的使用上和dos下几乎一样,我想大家看起来应该没有什么难度,
而去shadow inode的理解,就是知道在使用acl的时候才会用到。
3、创建文件系统。使用newfs对用format处理完毕的硬盘进行操作。newfs实际上就
是对硬盘进行高级格式化的过程。在使用中有几个参数,但都不常用。一是-m 的参数,
对minfree进行调整。一个是-i参数,对inode接点的数量进行调整。对minfree的操
作是fstyp -v /dev/dsk/xxxxxx |grep minfree 来查找,用tunefs -m %minfree来调整。
问题:
1、lost+found目录的作用是什么?
2、ufs文件系统的文件最大是多少M?
3、fstyp是对原始设备还是块设备操作的?
2、会在format中使用$符号吗??
1、当使用fsck检查文件系统的时候,有时候它会报发现有丢失的文件,这时候选择保
存的话,就会将该文件另寸到文件系统的lost+found目录下。很合适的名字:)
2、1TByte
3、都可以
1、mount命令和mnttab
mount的参数:
read/write 读/写
setuid 允许使用setuid
logging 允许使用日志。
在盘中一个区域里作日志(所有活动)这时若系统突然掉电,则内存中
数据丢失,而loging FS中还有保留的记录。
largefile 允许创建大于2G的文件。
在后三个参数前加no就是否定的选项。
noatime 不记录对文件的访问时间的改变
on error=action: 当出现错误时的处理方式
panic 强迫系统shutdown,这里是缺省的。
lock 锁定文件系统
umount 强制umount文件系统。
/etc/mnttab文件,在以前的版本是真正的正文文件,用户可以编辑,在这里是虚的,
与每次系统启动时的实际mount情况有关。
2、/etc/vfstab文件
格式:一行7个字段,用tab分割,-表示没有。
一个很重要的文件,在它里面,且mount at boot 为yes文件系统都将在开机时自动
mount到整个系统中。
注意除了一些fd /proc等的虚文件系统,象/,/usr,swap这样的实系统的
mount at boot选项也是no。那是因为这些系统包含系统启动所需要的程序,所以系统
在启动时自动mount它们。等检测到/etc/vfstab时它们已经是mounted状态,所以是
no选项,以免重复mount。
另外mount mountall umount umountall命令也和vfstab文件有一些关系。例如:
mount aaa,则系统检查vfstab文件,发现aaa对应的是/dev/dsk/cxtxdxsx,则执行
挂接,否则会报错。
还有:mountall -l 只mount vfstab文件中的local FS
3、fuser命令
fuser -cu /mountpoint,看当前有什么进程和此文件系统有关
fuser -ck /mountpoint,杀掉所有和此文件系统有关的进程
用fuser和kill比比较好,也方便。但注意不要杀/,/usr,/var等重要的系统。
用umount -f也是可以,但容易丢失数据。
4、软盘和光盘的使用
系统中有vold守护进程来管理。当自动检测到光/软盘的增加,则自动mount。即:
mount /vol/dev/aliases/cdrom0 /cdrom/cd_卷名
ln -s /cdrom/cd_卷名 /cdrom/cdrom0
相关的文件:
/etc/vold.con卷管理配置文件,定义介质插入/弹出时应执行的动作,使用什么设备,
什么文件系统。
/etc/rmmount.conf自动安装,卸载共享的光盘/软盘。
这两个文件都是配置好的,请不要做任何改动。
问题:
1、对于noatime的参数:
呵呵,做实验了吗??应该有问题吧???是否用ls -l看,使用和不使用这个参数
没有不同,这是为什么?
2、当我们手动mount一个光驱的时候会用mount -F hsfs 。。。来挂接,为什么在有
的时候就不使用-F的参数呢?系统在那里默认定义的?答案
1、你们真做实验了吗??没有??回去做实验先!!!
对这个概念的理解就是下面的两个命令:
ls -l
ls -ln
一个是列的是修改时间,一个是列的是访问时间,noatime就不记录访问时间。
2、/etc/vfstab
/etc/default/fs 本地
/etc/dfs/fstypes 远程
1、fsck
fsck是可以说是使用次数第一的工具(系统自己使用占90%以上)。它是FS完整性
检查,包括supblk,cylgrpblk,inode.tab,data区等。检查的原理是:冗余发。修
复时按照实际情况调整记录信息。
lost+found目录:在fsck的时候,将找不到父目录的那些文件拷贝到该目录中,并
以i节点号作为文件名。
当系统启动的时候会使用fsck对文件系统进行扫描,并相应的报出扫描结果。例
如:/dev/rdsk/c0t0d0s7 stable等。
后面是Fs的状态。其中,clean表示文件系统umount后无人用,stable表示文件系
统用过,但却是完整的,好的。而出一大堆的话,还有什么fragment %什么的的那
都表示文件系统上有乱的地方,那么就应该进入系统后使用fsck来整理。提起这个
来,我想说说在非法关机后(各种原因),再次启动的时候会有很多的情况,上面
说的是一种情况,再厉害一些是系统只能进入但用户状态,最厉害的是连单用户的
状态都无法进入(肯定是/和/usr区有问题。这是因为fsck对/区的扫描无法通过的
话,系统当然无法启动,而fsck调用的一些函数库又在/usr上。。。。)
当系统的状态是clean,stable和logging的状态的时候(logging??不知道的看上
一课吧)fsck不运行。
2、fsck的使用
本课讲的三个参数:
-o f 对系统进行强制检查,不论系统是否在clean等状态
-o p 非交互式检查并修复文件系统,对有的问题则立即退出
-o b=xx 用来修复超级块的错误,就是将备份的超级块内容拷入超级块中。Solaris对
超级块很重视,它的备份有很多,一般的b=32就可以了,如果不行可以使用命令
newfs -N /dev/rdsk/cxtxdxsx来查看超级块的位置,其中任何一个备份块都可使用
3、一些错误的情况
一、RECONNECT
表示目录丢失,可将其存入lost+found中再作转移。回答yes
二、SUPERBLK坏(注意是坏,不是wrong)
修复见上面(如果是wrong就随便了,修不修都可以)
三、CLEAR
删i节点,可能会错
四、REMOVE
删文件,一般给出文件名。file=....
五、ADJUST
调整连接数。实际数与原记录不符。回答yes
六、SALVAGE
自由列表计数不正确。回答yes
(题外话:其实我使用一般都是yes过去的,而且书上说不能在正在mount的文件系统上
操作,否则有可能导致文件系统损坏。但我也没有碰到过用fsck导致发生错误的情况。
不过还是建议大家操作的时候规范一些,否则出错了不要来找我呀。尤其是考试的时候)
4、df和du命令
最长用的是
df -k看现在系统的挂接和使用情况
du -ks看一个目录的总容量。
别的我觉的不常用,而且书上讲的也很清楚,就不在这里说了。
问题:
没有!!!!没什么特别的东西吧,这一课。contatenation时应该注意:
1。在所有的HD上都要做一个Replica Slice,不用太大。
2。在可能需要修正swap空间来获得足够的多余空间作Replica Slice的时候,应执行以
下命令:halt
boot -s
swap -l (查看一下)
swap -d slice (暂时移除swap slice,这里是指你的交换分区)
swap -l (确认)
用format来重新分区,从swap slice中分出一小块来作为Replice Slice.
newfs这一小块Replice Slice
swap -a swap slice (重新激活swap分区)
exit
3.在做newfs时应小心认清各对应关系。
4。执行metatool & (disksuite的GUI)
5.创建一个Metadevice database,在每个Replica Slice上放两个Replicas
6。创建Contat/Strip模型,把欲Contact的诸分区都拖入,ok reboot
7。执行Growfs -M /home1 /dev/md/rdsk/d1 (/home1是metadevice mount
point,/dev/md/rdsk/d1是raw模式的metadevice)
8。等growfs完成之后,Contatenation即告完成。1.从Solaris系统中获得联机帮助
Solaris 系统提供了非常丰富的联机帮助.这些帮助主要以两种形式存在,一种是命令
的参考手册页(Reference Manual Pages,也即我们常说的man page),另外一种是
Answer Book,是Sun公司的资料的电子版。
使用Solaris联机帮助的方法:
a. 使用Reference Manual Page
在命令行上使用man命令:
如:$ man ls
b. 使用Answer Book
在命令行上使用answerbook命令
如:$ answerbook
2. Man Page的组织
Unix的man page是按照节(section)来组织的.当我们使用man ls的时候,会看到ls(1),
这个括号中的1就表示ls的man page位于section 1。
section通常是由一个主section名和一个可选的次section名组成.主section名通常是
一个数字,次section名通常是一个或多个字母组成.
Solaris中各 section 所对应的内容:
1: User Commands and UtilitIEs
2: System Calls
3: C Library Functions
4: File formats
5: Headers,tables and Macros
6: Games and demos
7: Device and Network Interfaces
8: Maintance and Accounting commands
9: Device driver interfaces
3.Man Page的存放位置
a.系统本身的 man page存放在/usr/share/man/man*目录中, /usr/man 是
/usr/share/man的一个软链接.
注:在安装操作系统时,man page是可选安装。如果未安装,可将其它机器上的
/usr/share/man目录 mount 到本机上。或使用安装光盘将相应的package装上。
b.很多应用软件有自己的man page.它们的缺省的安装目录通常是/usr/local/man/man*.通
常可以通过修改该软件的配置文件来指定新的安装目录(只需设置到/some/Directory/man
这一层)
4.设置 Man Page的搜索路径
当使用man命令查看某个命令或文件的帮助时,man要根据系统的环境变量MANPATH的值来
确定搜索的路径。当MANPATH变量未设置时,man 命令缺省查找/usr/share/man目录。
MANPATH的格式:
MANPATH=dir1:dir2:dir3:...dirn; export MANPATH
设置MANPATH的方法
(1).临时性修改MANPATH
在命令行上输入以下命令:
$ MANPATH=$MANPATH:/xxx/xxx/man
$ export MANPATH
(2).永久性修改MANPATH
在用户自己的 .profile文件中加入上述两行内容
5.man 命令的高级使用技巧
a.使用 -s 选项明确指定man page的section 号
如:$ man -s 4 passwd
-s 选项非常有用。因为man的搜索顺序是根据man.cf中的设置来进行的。当man找到一个
匹配时,就不再往下找了。所以当你想查看一下/etc/passwd文件的格式而不是想了解
passwd命令的使用时,光使用man passwd 你永远达不到目的。这时使用man -s 4 passwd,
就强制man只搜索section 4中的文件。
b.使用 -f 选项列出某个命令的全部man page 的一行性摘要
该用法等同于 whatis 命令
注:使用该选项或whatis命令时,要用到man的 windex数据库。如果没有windex文件,
可以使用catman -w 来创建该文件。
如:$ whatis ls
ls ls (1) - list contents of directory
ls ls (1b) - list the contents of a directory
c.使用 -k 选项列出一行性摘要中含有给定关键字的所有命令
该用法等同于 apropos 命令
如:$ apropos shadow
lckpwdf lckpwdf (3c) - manipulate shadow passWord database lock file
putspent putspent (3c) - write shadow password file entry
pwconv pwconv (1m) - installs and updates /etc/shadow with information from /etc/passwd
shadow shadow (4) - shadow password file
ulckpwdf lckpwdf (3c) - manipulate shadow password database lock file
d.使用 -d 选项查看man 命令的工作过程
6. 使用 Answer Book
Answer Book在Solaris系统中是作为一个package而组织的,它也是系统的可选安装.
使用Answer book的方法
$ answerbook
* 如何使用装在其它机器上的 Answer Book?
例如:liszt 上的用户要使用public主机上的AnswerBook
step 1: 在 public 上执行以下命令:
$ DISPLAY=liszt:0.0 ; export DISPLAY
step 2: 在 liszt 上执行以下命令: 机名为sampdt,ip 10.1.1.1
1 /etc/hosts 主机名解析
#
# Internet host table
#
127.0.0.1 localhost
10.1.1.1 sampdt loGhost
10.1.1.46 test.china.org
10.1.1.3 sidemo
2 /etc/hostmane.hme0 网络接口名
sampdt
3 /etc/netmasks 网络掩码
4 /etc/inetd.conf 服务项目定义
5 /etc/defaultroot 设定路由
6 /etc/nsswitch.files 设定名字搜索顺序
7 /etc/defaultrouter 缺省路由
做为DNS服务器
建立/etc/named.boot
named.boot格式:
Directory /etc/namedb
cache . named.root
primary 0.0.127.in-addr.arpa named.local
primary domain name file
远程访问命令
1. rlogin 在远程机上注册
格式 : rlogin hostname -l username
2. rsh 在远程机上执行一个程序
格式 : rsh hostname -l username order
3. rcp 在远程系统之间拷贝文件
格式 : rsh host:filename filename
访问鉴别相关文件
当rlogin,rsh,rcp命令时,有几个文件对网络安全是很重要的.
/etc/passwd
如远程系统的口令文件有本地用户的登记项,否则必须使用 [-l] 选项以指明不同用户,可支持root用户。
$home/.rhosts
rlogin,rsh,rcp首先检查用户主目录下的.rhosts文件,如主机及用户被列在文件中,则此用户为可信任主机,不需口令即可登录,如远程鉴
别失败,则正常询问口令
/etc/hosts.equiv
作用与.rhosts 文件类似,文件中列出用户对于本机为可信任用户,不需口令即可登录(除超级用户)
网络监控
1.rusers 标识网络上注册用户
格式:rusers -la
2.rup 标识网络上主机
命令格式:rup
3.ping 检测主机连接状况
命令格式:ping [hostname|IP address]
4.spray ping命令格式为低层协议,spray使用高层协议
命令格式:spray hostname
5.netstat 显示与网络有关的各种数据结构
命令格式:netstat -[r| i]n
-r :显示路由信息 -i :显示接口信息
6.ifconfig 显示网络接口
命令格式:ifconfig -a
其中 lo0: 本机自回馈接口 le0: 10M接口 hme0:100M接口 hme1:第二100M接口
7.netstat 显示与网络有关的各种数据结构
命令格式:netstat -[r| i]n -r :显示路由信息
-i :显示接口信息
8.route 路由设置
命令格式:route [add|delete] 设置网络路由
defaultrouter
step 3: 在 public 上执行answerbook 命令
$ answerbook 1)确保原盘和目的盘几何特性相同
2)成为超级用户
3)在用主盘的系统中输入touch /reconfigure,有主盘的系统需要/reconfigure文件,以便在重新启动时发现复制盘
4)输入init 0关闭系统
5)将复制盘连接到系统并开机
6)在OK提示符下输入boot
7)输入dd if=/dev/dsk/device-name of=/dev/dsk/device-name bs=blocksize (输入文件if是主盘设备,输入文件of是复制盘设备)
8)输入fsck /dev/rdsk/device-name (检测新的文件系统)
9)输入mount /dev/rdsk/device-name /mnt 加载复制盘的root文件系统。
10)编辑复制盘上的/etc/vfstab文件,指向正确的设备名。
11)输入umount/mnt ,卸载复制盘的root文件系统。
12)输入init 0关闭系统。
13)输入boot diskN -s以单用户模式引导复制盘。
14)输入sys-uconfig恢复配置复制盘,在该盘配置恢复后系统关闭。
15)输入boot diskN 引导复制盘
16)提供相关的系统信息。(HOSTNAME TIMEZONE IP...)
17)系统完成,即作为超级用户登录验证系统信息。
例:
#dd if=/dev/dsk/c0t0d0s2 of=/dev/dsk/c0t1d0s2 bs=100k
#fsck /dev/rdsk/c0t1d0s2
#mount /dev/rdsk/c0t1d0s2 /mnt
#cd /mnt/etc
#vi /etc/vfstab
#cd /;umount /mnt
#init 0
OK boot disk2 -s
#sys-unconfig
OK boot disk2 -s1.指定磁带特性
当不指定任何磁带特性时,ufsdump命令使用默认值集合。可以指定磁带盒(-c)、密度(-d)、大小(-s)和磁道数(-t)。注意可以以任意顺序指
定选项,只要对应的参数顺序一致即可。
2.使用OIC-150备份文件系统
要执行文件系统的完全备份,所在用户必须退出登录,且系统必须进入单用户模式。
在磁带设备名前添加remote-host:,可以从远程驱动器备份或者恢复文件。
remote-host:/dev/rmt/unit
例如:远程磁带设备名为/dev/rmt/0,则在系统oak上为 oak:/dev/rmt/0
例:
以下步骤完成文件系统的0级备份:
1)输入init s ,进入单用户模式。
2)插入磁带。
3)输入 ufsdump 0cuf /dev/rmt/unit /dev/rdsk/cntndns0
其中,0表示0级(完全)备份,c表示盒式磁带,u表示更新备份记录,f和后面的设备名指定设备文件。输入要备份的文件系统所在的原盘片。
4)如果备份需要多个磁带,ufsdump命令通知何时更换磁带。
5)在磁带上制作写有命令、文件系统和日期的标签。
增量备份
1)系统进入单用户模式。
2)成为超级用户。
3)在磁带驱动器中插入磁带。
4)输入 ufsdump [1-9]ucf/dev/rmt/unit /dev/rdsk/cntndnsn
5)从磁带驱动器中取出磁带并作标签。
恢复备份的文件系统
ufsrestore命令从使用ufsdump命令创建的备份中复制文件到当前目录。可以使用ufsrestore命令从0级备份和以后的增量全国人民代表大会
中恢复整个文件系统层次,或者从任何备份磁带中恢复单个或者多个文件。恢复的文件具有初始的所有者、最后修改的时间以及模式。
1.确定使用哪个磁带
1)询问用户文件或者文件系统丢失的日期或者该文件恢复的最佳日期。
2)参照备份计划查找包含该文件或者文件系统的上次备份的日期。要获得文件的最近版本,从最高级到最低级,从最近到较近日期反向操作
增量备份。
3)如果有一个使用ufsdump -a 选项创建的在线存档文件,输入ufsrestore ta archive-name /path/filenames 。确认使用了file-name的
全路径。显示文件和它们存储的介质的列表。
4)获得包含备份的介质。
5)输入 ufsrestore tf device-name /path/filename 确认使用filename的全路径。
6)如果在一个磁带上有多个备份文件,可以使用-s n选项定位要使用的磁带的备份。例:ufsrestore xfs /dev/rmt/0 5
例:
#init s
#umount /mount-point
#newfs /dev/rdsk/c0t0d0s7 提示符。
6)创建要恢复的文件列表
列出目录内容: ls
更换目录: cd Directory-name
要添加目录或者文件名到要恢复的文件列表中:add file-name
要保持当前目录的模式不变: setmodes 选n
7)列表完成后,输入extract
8)输入卷号并按回车键。
9)输入quit返回
10)使用ls -l 命令列出恢复的文件和目录。
11)检查列表。
12)使用mv命令将文件移到适合的目录中
4.从备份磁带中恢复单个文件
1)成为超级用户
2)在磁带驱动器中插入备份磁带
3)输入 cd /var/tmp
4)输入 ufsrestore xf /dev/rmt/unit file-name 回车。x选项通知ufsrestore命令复制file-name参数指定的文件或目录。显示"set owner/
mode for'.'?[yn]"信息。
5)输入n ,保持当前目录的模式不变
6)输入文件所在的卷号,如果只有一卷,输入1
7)输入ls -l file-name ,显示为文件和目录。
8)使用mv命令将文件移到适合的目录中。
上一篇: Solaris 进程工具在Solaris2.6以及更高的版本重提供了一个命令集,使用它们可以获得有关活跃进程详细
的技术信息,命令及参数如下,我帮大家整理出来:
pstop pid  停止进程
prun pid  重新启动进程
ptime pid  使用微状态计算进程时间
pwait pid  等待指定的进程终止
pcred pid 显示可信度    *
pfiles pid 显示已打开文件的fstat和fcntl信息   *
pflags pid 显示每个lwp的/proc跟踪标志,等待和待有信号量以及其他状态信息  *
pldd  pid 显示链接到每个进程的动态链接库   *
pmap pid  显示地址映射空间   *
psig pid 显示信号操作    *
pstack pid 显示每个lwp的十六进制与符号堆跟踪   *
ptree pid 显示包含指定PID的进程树
pwdx  pid 显示当前工作目录   *
后面加*的必须是超级用户执行。
至于具体怎么用,要看大家设想了,呵呵,我已经写的很详细了,嘿嘿,大家可以用到
进程的操作,要看怎么用了,呵呵,反正我觉得非常有用的。
这些工具在/usr/proc/bin/里面。
上一篇: Solaris 服务器配置多网卡---- 在网络设计中,在服务器端,为了防止网络传输过载或出于连接多子网的需要,往往要为服务器配置多块网卡。下面介绍如何为Sun服务器来配置新网卡。
---- 一.安装新网卡
---- 1.通知操作系统在重新启动时检测新硬件.命令如下:
---- #touch /reconfigure
---- 2.关闭服务器和电源.
---- #shutdown -i5 -g60 -y
---- 此命令通知连接的客户机,服务器将在60秒(-g60)后关闭;运行级别5(-i5)指明如果硬件支持,就自动关闭服务器电源。
---- 3.物理安装新网卡
---- 小心取下服务器背板上的插板,移去网卡上的托架,安好网卡,再插回原位,最后将网线插入新网卡接口,启动服务器。
---- 二.配置新网卡
---- 1.检查新网卡的设备号
---- 服务台器启动后,用以下命令来检查分配给新网卡的设备号,这与把网卡安装在哪个槽上有关;
---- #dmesg
---- 此命令执行后将显示所有用户的设备号,如原有网卡的设备号为hme0,新网卡的设备号为hme1等;
---- 2.为新网卡配置主机名和IP地址
---- 在/etc 目录用 vi 建立名为 hostname. 后跟新网卡的设备号(如hostname.hme1)的文件,其内容为绑定所给网卡的主机名;修改/etc/hosts文件,增加一条记录,其前半部分为新网卡的IP地址,加空格后跟新网卡的主机名(hostname.hme1)。
---- 如:
10.10.10.100 sun1 #first network adapter
88.1.1.10 sun2 #second network adapter
---- 3.路由功能
---- 操作系统将自动开启多网卡的路由功能,若想关闭路由功能,可用如下命令:
---- #touch /etc/notrouter
---- 完成以上步骤后重新启动系统可用如下命令使配置生效
---- #shutdown -i6 -g60 -y
---- 最后不要忘记修改DNS或NIS服务器,以使网络的其它主机能与之的通讯.
---- 以上方法需要Root用此权限在Sun Enterprise 3000服务器和Salaris 2.6 server操作系统上测试通过.系统运行级别有8种,分别为:
运行级别 意义
0 进入PROM状态(OK状态)
1 管理状态(所有文件系统都挂上的单用户模式,禁止其他用户登录)
2 多用户模式(没有网络文件共享服务)
3 多用户模式(有网络文件共享服务)
4 未使用
5 退出操作系统并关机
6 重新启动机器
S,s 单用户模式
init
init命令用于改变操作系统的运行级别。
命令格式:
init [ 0123456Ss ]
# init 0
INIT: New run level: 0
The system is coming down. Please wait.
System services are now being stopped.
Print services stopped.
Stopping the syslog service.
syslogd: going down on signal 15
Aug 14 14:54:30 snmpdx: received signal 15
The system is down.
syncing file systems... done
Program terminated
Type help for more information
ok
shutdown
用于改变操作系统运行级别。
命令格式:
shutdown [ -y ] [ -g seconds ] [ -i init-state ] [message]
选项:
y 系统提示时默认回答为YES
g 过多长时间改变
i 想要的运行级别
message 给所有登录用户的信息
# shutdown -y -g 0 -i 0
Shutdown started. Mon Dec 15 15:13:57 PST 1997
Broadcast Message from root (console) on mcmurdo Mon Dec
15 15:13:57...
THE SYSTEM IS BEING SHUT DOWN NOW ! ! !
Log off now or risk your files being damaged
Changing to init state 0 - please wait
ok
halt
进入0运行级别
poweroff
关闭系统并切断电源
reboot pkginfo
查看当前操作系统已经安装的软件包。
# pkginfo | more
application SUNWAxg Solaris XGL 3.3 AnswerBook
application SUNWaadm Solaris 7 System Administrator Collection
system SUNWab2m Solaris Documentation Server Lookup
system SUNWab2r Solaris Documentation Server
system SUNWab2s Solaris Documentation Server
system SUNWab2u Solaris Documentation Server
application SUNWabda Sun Ultra 5/10 Hardware AnswerBook
application SUNWabe Solaris 7 User Collection
application SUNWabsdk Solaris 7 Software Developer Collection
pkginfo [ -d [ device | pathname ] ] [ -l ] pkg_name
参数:
-d 软件包所在的设备路径
-l 软件包的详细描述
pkg_name 软件包的 名字
# pkginfo -d /cdrom/cdrom0/s0/Solaris_2.7/Product -l SUNWaudio
PKGINST: SUNWaudio
NAME: Audio applications
CATEGORY: system
ARCH: sparc
VERSION: 3.6.4,REV=1.98.08.13
BASEDIR: /
VENDOR: Sun Microsystems, Inc.
DESC: Audio binarIEs
PSTAMP: dtbuild37s19980813171753
HOTLINE: Please contact your local service provider
STATUS: spooled
FILES: 9 spooled pathnames
2 Directories
3 executables
4 package information files
700 blocks used (approx)
pkgrm
pkgrm用于删除软件包
语法:
pkgrm package_name
# pkgrm SUNWaudio
The following package is currently installed:
SUNWaudio Audio applications
(sparc) 3.6.4,REV=1.98.08.13
Do you want to remove this package? y
## Removing installed package instance
## Verifying package dependencies.
WARNING:
The package depends on the package
currently being removed.
WARNING:
The package depends on the package
currently being removed.
WARNING:
The package depends on the package
currently being removed.
WARNING:
The package depends on the package
currently being removed.
Dependency checking failed.
Do you want to continue with the removal of this package [y,n,?,q]
注:如果某个文件被多个软件包共用,则只当最后的包被删除时才被删除。
pkgadd
使用pkgadd添加软件包
命令格式:
pkgadd [ -d [device | pathname ]] pkg_name
# pkgadd -d /cdrom/cdrom0/s0/Solaris_2.7/Product SUNWaudio
Processing package instance from
Audio applications
(sparc) 3.6.4,REV=1.98.08.13
Copyright 1998 Sun Microsystems, Inc. All rights reserved.
Using as the package base directory.
## Processing package information.
## Processing system information.
2 package pathnames are already properly installed.
## Verifying package dependencies.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.
This package contains scripts which will be executed with super-user
permission during the process of installing this package.
Do you want to continue with the installation of [y,n,?] y
Installing Audio applications as
## Installing part 1 of 1.
Installation of was successful.
重新启动系统BootPROM相当于PC的CMOS,可以在BootRPOM下检测硬件和设置启动选项。
Sun系统包含下列两样基本硬件:
? BootPROM芯片
? 非易失性存储器(NVRAM):保存主机的ID号和启动选项设置
BootPROM基本命令
? banner
ok banner
Sun UltraSPARC 60 UPA/PCI (2 X UltraSPARC-II 296MHz), Keyboard Present
OpenBoot 3.11, 256 MB memory installed, Serial #3159808.
Ethernet address 8:0:22:1a:e7:3f, Host ID: 72303700.
ok
banner命令显示系统的基本配置信息,包括机器型号、CPU数量和主频、内存大小、以太网地址、主机序列号等。
? boot 命令及参数
ok boot [device_name] - [options]
选项包括:
a 交互式启动操作系统
r 重新配置操作系统硬件信息
s 操作系统进入调试状态(单用户模式)
v 显示启动信息的详细情况
ok boot disk2 -r
? printenv命令
printenv命令显示NVRAM变量的设置和缺省值。
ok printenv
Parameter Name Value Default Value
tpe-link-test? true true
output-device ttya screen
input-device ttya keyboard
sbus-probe-list f0123 f0123
keyboard-click? false false
diag-file
diag-device net net
boot-file
boot-device disk2 disk
auto-boot? true true
More [,,q] ? q
ok
? setenv命令
setenv设置PROM的参数值,常用的参数有:
参数 值 意义
auto-boot? true 下次自动启动操作系统
false 下次启动停在OK状态
boot-device cdrom 从光驱启动操作系统
disk2 从第二个硬盘启动操作系统
注:由于Ultra 5没有内置SCSI口,只能加块带SCSI口的网卡。此时设置启动盘应该是:
ok setenv boot-device /pci@1f,0/pci@1/pci@1/SUNW,isptwo@4/sd@2,0:a
Ultra 60外置硬盘的启动应为:
ok setenv boot-device /pci@1f,4000/SCSI@3,1/disk@2,0:a
? set-defaults
将NVRAM的所有参数复原为默认值
机器启动时的键盘输入
? stop
如果在系统加电自检时按下Stop键,就取消POST(加电自检)诊断,然后停留在OK状态。
? Stop+d
在系统自检时同时按下stop和d键,系统将自动转到诊断模式,诊断模式下系统将更完全地进行自检。
? Stop+n
如果由于NVRAM的设置不正确而导致系统无法正确启动时,可以在系统加电自检时同时按下stop和n键。它的作用是将NVRAM的参数值设为默认值。
? Stop+a
同时按下stop和a键将中断操作系统的运行,退到OK状态。
警告:尽量不要在操作系统运行时按stop+a,这将导致操作系统停止并且导致数据的丢失。在万不得以的时候,在按下stop+a后,键入sync命令用以将内存的数据同步到硬盘中。
查找系统设备
? probe-scsi-all
ok probe-scsi-all
Target 3
Unit 0 Disk SEAGATE ST1480 SUN0424626600190016
Copyright (c)
All Rights Reserved
Target 6
Unit 0 Removable Read Only device SONY CD-ROM
这个命令查找系统的所有SCSI设备。
注:如果从操作系统中退出后再运行此命令可能会造成系统的死机。请先设置auto-boot?为false后再运行reset-all,系统将重新自检,停留在OK状态下,然后可以运行这个命令。
? probe-ide
查找系统的所有IDE设备。
ok probe-ide
Device 0 ( Primary Master )
ATA Model : ST 34342A
Device 1 ( Primary Slave )
Not Present
Device 2 ( Secondary Master )
removable ATAPI Model : CDR-8240B
Device 3 ( Secondary Slave )
Removable ATAPI Model yyyyyyyyyyyyyyy
注:如果从操作系统中退出后再运行此命令可能会造成系统的死机。请现设置auto-boot?为false后再运行reset-all,系统将重新自检,停留在OK状态下,然后可以运行这个命令。
设备检测
? eject
将软盘放入软驱,然后在输入eject,软盘将自动弹出。
? watch-net-all
测试所有网卡和网络状态。每个网卡测试分两部分:loop-back测试和网络线路测试。如果loop-back(网卡自环)通过,说明网卡状态良好。如果网络线路测试没通过,说明网线没接收到信号,可能是网线没接好或是网线不好ifconfig
ifconfig用于配置网卡地址,改动后立即生效,但并不保存配置,下次启动后失效。
# ifconfig -a
lo0: flags=849 mtu 8232
inet 127.0.0.1 netmask ff000000
hme0: flags=863 mtu 1500
inet 172.16.255.2 netmask ffff0000 broadcast 172.16.255.255
ether 8:0:20:ee:11:51
#ifconfig hme0 172.16.3.3 netmask 255.255.255.0
#ifconfig ?a
lo0: flags=849 mtu 8232
inet 127.0.0.1 netmask ff000000
hme0: flags=863 mtu 1500
inet 172.16.3.3 netmask ffffff00 broadcast 172.16.3.255
ether 8:0:20:ee:11:51
? /etc/hosts
想要永久更改配置,则要更改配置文件,以网卡hme0为例:
#more /etc/hostname.hme0
Sunland
#more /etc/hosts
127.0.0.1 localhost
172.16.255.2 Sunland loGhost
#vi /etc/hosts
#more /etc/hosts
127.0.0.1 localhost
172.16.3.3 Sunland loghost
#more /etc/netmasks
#
# The netmasks file associates Internet Protocol (IP) address
# masks with IP network numbers.
#
# network-number netmask
#
# The term network-number refers to a number obtained from the Internet Network
# Information Center. Currently this number is restricted to being a class
# A, B, or C network number. In the future we should be able to support
# arbitrary network numbers per the Classless Internet Domain Routing
# guidelines.
#
# Both the network-number and the netmasks are specifIEd in
# "decimal dot" notation, e.g:
#
# 128.32.0.0 255.255.255.0
#vi /etc/netmasks
#more /etc/netmasks
#
# The netmasks file associates Internet Protocol (IP) address
# masks with IP network numbers.
#
# network-number netmask
#
# The term network-number refers to a number obtained from the Internet Network
# Information Center. Currently this number is restricted to being a class
# A, B, or C network number. In the future we should be able to support
# arbitrary network numbers per the Classless Internet Domain Routing
# guidelines.
#
# Both the network-number and the netmasks are specified in
# "decimal dot" notation, e.g:
#
# 128.32.0.0 255.255.255.0
172.16.3.0 255.255.255.0
#reboot增加用户组
groupadd命令增加用户组
groupadd [-g gid] group
说明:
g 制定组的ID号
gid 组的ID号(不能与现有的组ID号重复)
group 组名
#groupadd ?g 100 sun
增加用户
useradd命令增加用户组
useradd [-u uid | -g group] | -d dir | -s shell | -c comment | -m [-k skel_dir] ] login
说明:
u 指定用户ID号
g 制定所在组
d 指定用户目录
s 制定用户SHELL
c 用户的注释
m 建立用户目录
login 用户的登录名
#useradd ?u 1233 ?g sun ?d /export/home/sun ?c “Sun test user.” ?m ?s /usr/bin/sh sun/etc/hostname.interface
Interface是网卡的型号,有le、hme等。Le是十兆网卡,hme为百兆网卡等等。后面跟一个数字,第一个十兆网卡为le0,第二个为le1;第二个百兆网卡为hme0,第二个为hme1等等。
文件的内容是这块网卡的名字,如Sunrise、Sunny。
#more /etc/hostname.le0
Sunrise
# more /etc/hostname.hme0
Sunny
/etc/hosts文件
系统名与IP地址的映射
与/etc/hostname.interface 协同工作,配置本机网卡地址
# more /etc/hosts
127.0.0.1 localhost loGhost
172.16.255.1 Sunrise
172.18.255.1 Sunny
系统名不是机器名,机器名是唯一的,要更改机器名,用命令:hostname。
有了/etc/hostname.interface和/etc/hosts两个文件,系统就知道如何配置网卡了,如第一个百兆网卡的名字是Sunny,其对应的地址是172.18.255.1。
/etc/netmasks文件
将网络的IP地址与网络地址联系一起,划分子网
如果是标准网段,则不需要配置
标准网段:
A类网:0-127(127用于本地地址) 掩码:255..0.0.0
B类网:128-191 掩码:255.255.0.0
C类网:192-223 掩码:255.255.255.0
D类网:224-254(用于多址广播)
要配一个B类地址:172.16.255.1掩码为:255.255.255.0,则在/etc/netmasks文件中写:172.16.255.0 255.255.255.0
ifconfig命令
检测网络端口状态
#ifconfig -a
配置网络端口地址
#ifconfig le0 172.16.255.1 netmask 255.255.255.0
配置网络端口状态
#ifconfig le0 up/down
配置网络端口是否可用
#ifconfig le0 plumb/unplumb
ping命令 第一章:系统概念(System Concepts)
Objectives
Upon completion of this module, you should be able to
Match the three parts of an operating system (kernel, shell, and file system) to their definitions
Identify the three most common shells in the Solaris environment
Distinguish between multitasking and multiuser
Describe the clIEnt-server relationship
Define the following basic system terms: host, host name, network,
IP (Internet Protocol) address, client, and server
操作系统的主要三个部分
Unix操作系统是基于文件的,操作系统的主要三个部分是:
Kernel
Shell
File structure
Kernel 是操作系统的核心,它的主要功能是:
管理系统的设备、内存、进程以及守护进程
系统程序与系统硬件之间接口
执行所有的命令
管理:
Swap space(交换分区) ? 系统运行时保留的一部分磁盘空间
Daemons (守护进程)? 处理特定的系统任务
shell 是用户与kernel之间的接口。它就像是命令的解释器或翻译器。Shell接收你输入的命令,对你的输入作出解释,然后就将它发送给kernel执行。
操作系统的 Shells种类
Solaris系统中有三种shell:
Bourne shell ($) ? 这是Solaris的缺省shell。Bourne shell为 AT&T UNIX 环境而开发。(/usr/bin/sh)
Korn shell ($) ? 是Bourne shell的一个超级。它增加了一些功能,如:别名、历史记录以及命令行编辑等。(/usr/bin/ksh)
C shell (%) ?C shell的语法类似于C语言,并且,C shell有些功能与 Korn shell相类似。(/usr/bin/csh)
Solaris环境的文件结构是分成的目录树结构,类似于Dos的文件结构。是一些有特定目的而组织在一起的目录、子目录和文件。
目录 (Directory) ? 其他目录和文件所在处
子目录(Subdirectory) ? 属于其他目录的所有目录
根目录(/)位于目录树的最顶层,包含 :
/usr目录包含系统的一些命令、工具、库文件等 。
/opt目录包含的三方应用软件。
/dev目录包含诸如磁盘、键盘、磁带机、显示器等地设备驱动程序。
/etc目录包含系统配置文件,如用户口令文件等等。
/export目录一般包含用于NFS共享的目录。
/export/home目录包含用户的个人主目录。
/kernel目录包含系统结构的kernel文件。这个目录下的文件genunix是系统的UNIX kernel 。
虚拟内存操作系统??交换分区(Swap Space)
虚拟内存操作系统增大了物理内存,它将硬盘中的一部分空间用于存储暂时不用内存数据。这块硬盘空间叫做交换分区。与Windows下的SWAP文件的功能相似。
守护进程(Daemons)
守护进程是在后台运行的程序,它负责系统的某个特定的功能,比如打印。
系统管理的一些常见的概念:
主机(Host) ? 网络环境下的某台计算机系统。
主机名(Host name) ? 某台系统的名字,网络中的任何系统都必须有自己的主机名。
IP地址(IP address) ? 网络软件用于鉴别网络中某台机器的一个数字符号。
客户机(Client) ? 使用网络中一个和多个服务的主机和进程。
服务器(Server) ? 在网络中提供一个或多个服务的主机和进程。
网络(Network) ? 许多机器连接在一起、可以互相通信的集合。
Solaris有下列特性:
多任务(Multitasking) ? 多个进程或应用程序可以同时运行。
多用户(Multiuser) ? 同时可以有多个用户访问系统资源。
分布处理(Distributed processing) ? 通过网络使用资源。
检测网络状态
测试网络速度目录:
概述
◆ /proc/目录简介
◆ procfs的实现
后记
--------------------------------------------------------------------------
概述:
进程文件系统 -- procfs -- 允许像管理文件那样直接管理内核进程。
进程文件系统,procfs,是一个伪文件系统,提供了内核进程表的文件系统接口,
Jim Mauro 在这里概要介绍了procfs。
翻译本文的目的在于编写64-bit下的SLKM,欢迎对此感兴趣的朋友交流。
--------------------------------------------------------------------------
◆ /proc/目录简介
进程文件系统,procfs,是一个伪文件系统,它允许对一些非传统意义上的文件
通过标准文件I/O接口进行访问。procfs将Solaris内核进程架构进行了抽象,比如当前系统中所有运行着的进程会在/proc/目录下有所体现。系统中每个进程对应/proc/目录下的一个子目录,子目录名即相应进程号(PID),所有进程号子目录构成了/proc/目录的全部内容。
许多提供进程数据和控制点的内核数据结构在/proc//子目录下有相应反映,
比如,多线程进程中每个LWP的相关数据和控制结构体现在/proc//lwp/
中。 /proc/目录下的对象不是真实磁盘文件,这些对象位于内核内存中,用户执行ls(1)命令显示/proc/目录结构时,系统读取内核内存并返回相应内容。
通过/proc,相对简便地就可以获取进程信息,比如进程执行环境、内核资源利
用率。进程控制和procfs直接相关,procfs最初的设计目的很简单,就是为编写调试器提供一组接口,现在已经有了相当大的改进。
Solaris系统在/usr/proc/bin/目录下提供了一组工具从/proc中析取进程信息,
同时可以进行简单的进程控制。可以参看proc(1)手册页。进程状态命令ps(1)也利用了procfs接口。
下面列举可以通过/proc文件系统获取的控制和信息数据,关于这些文件的详细
信息参看proc(4)手册页。
/proc -- procfs的根目录
/proc/ -- 某一确定进程的根目录,进程PID正是子目录名
/proc//as -- 进程地址空间,即struct proc结构中p_as成员。换句话说,进
程地址空间以/proc//as文件的形式展现出来,通过这个伪文件系统接口可以访
问相应进程地址空间。
struct as * p_as; /* 进程地址空间指针 */
# ls -l /proc/53/as
-rw------- 1 root root 1458176 2月 8 17:34 /proc/53/as
struct proc结构定义在/usr/include/sys/proc.h文件中。
/proc//ctl -- 一个进程控制文件。可以只写打开该文件,然后给相应进程发
送控制信息。可以停止、启动进程,设置进程停止于某一特殊事件。这演示了procfs的强大和便捷。进程控制、事件跟踪可以通过打开相应进程的控制文件完成,只需要写入期待行为的控制信息。参看proc(4)手册了解控制信息和控制函数的详细介绍。
/proc//status -- 进程状态信息。对应/usr/include/sys/procfs.h文件里定
义的struct pstatus结构。proc(4)手册页里也有描述。这个结构中有一个成员
lWPStatus_t pr_lwp; /* status of the representative lwp */
该成员对应一个有代表性的LWP(轻量级进程)。单线程进程只有一个LWP,很容易选定这个有代表性的LWP。那些多线程进程通常有多个LWPs,一个内核函数遍历当前进程的所有LWPs,根据他们的状态选取这个有代表性的LWP。首先选取正在执行中的LWP,如果不存在这样的LWP,按照可运行、休眠、停止的顺序选取LWP。
/proc//lstatus -- lwpstatus结构数组,进程中每个LWP对应一个lwpstatus结构。struct lwpstatus结构定义在/usr/include/sys/procfs.h文件中。
/proc//psinfo -- 类似ps(1)命令提供的进程信息。对应struct psinfo结构,
类似struct pstatus结构,struct psinfo结构中有一个成员
lwpsinfo_t pr_lwp; /* information for representative lwp */
该成员的对应一个有代表性的LWP。
/proc//lpsinfo -- lwpsinfo结构数组,进程中每个LWP对应一个lwpsinfo结构
/proc//map -- 地址空间映射信息,可以用pmap(1)命令显示这些数据信息。
/proc//rmap -- 进程中保留地址空间段。用pmap -r命令显示这些数据信息。
/proc//xmap -- 扩展地址空间映射信息。用pmap -x命令显示这些数据信息。
/proc//cred -- 进程身份验证信息,对应/usr/include/sys/procfs.h文件中
定义的struct prcred结构。
/proc//sigact -- sigaction结构数组,描述和本进程相关的所有信号设置。
struct sigaction结构定义在/usr/include/sys/signal.h文件中。
/proc//auxv -- auxv_t结构数组,包含进程执行时传递给动态链接器的初始值。
auxv_t结构定义在/usr/include/sys/auxv.h文件中。
/proc//ldt -- 局部描述符表(LDT),仅存于Intel x86架构。
/proc//usage -- 进程资源利用率的相关数据,对应struct prusage结构,该
结构定义在/usr/include/sys/procfs.h文件中。
/proc//lusage -- prusage结构数组,对应各个LWP资源利用状况。
/proc//pagedata -- 进程地址空间的另外一种表现方式,可以用于跟踪页面级
的引用和修改。参看struct prpageheader结构定义。
/proc//watch -- prwatch结构数组。通过写控制文件/proc//ctl可以设
置PCWATCH操作,此时建立该文件。允许监视一个或多个地址空间范围,当访问这些
被监视页面时,产生一次陷入。
scz注:这个功能和SoftIce的BPR功能类似,adb支持这种陷入,不知是否利用了
procfs
/proc//cwd -- 到进程当前工作目录的符号链接
/proc//root -- 到进程根目录的符号链接(和上面那个什么区别)
/proc//fd -- 这是一个子目录,包含进程打开的文件句柄
/proc//fd/nn -- 对应进程打开的某个确定的文件句柄
/proc//object -- 这是一个子目录,包含进程相关的可执行文件以及动态链接
库。
/proc//object/nn -- 二进制目标文件。进程对应的可执行文件名为a.out,其
余是进程相关的动态链接库文件。
object目录提供的信息是进程级的,每个/proc//目录有一个lwp子目录,提供
了LWP级的信息:
/proc//lwp -- 这是一个子目录,包含进程中所有LWPs的信息
/proc//lwp/ -- 这是一个子目录,包含对应lwpid的LWP信息
/proc//lwp//lwpctl -- 一个控制文件,通过它可以在LWP级上针对每
个LWP发布控制操作
/proc//lwp//lwpstatus -- LWP状态信息,对应lwpstatus结构,该结
构定义在/usr/include/sys/procfs.h文件中
/proc//lwp//lwpsinfo -- 对应lwpsinfo结构,同样定义在
/usr/include/sys/procfs.h文件中
/proc//lwp//lwpusage -- LWP资源利用信息,对应prusage结构
/proc//lwp//xregs -- 这个文件是处理器架构相关的,某些平台上可
能没有这个文件。对于SPARC系统,这个文对应/usr/include/sys/procfs_isa.h文件中定义的prxregset结构。
/proc//lwp//gWindows -- 常规寄存器窗口。这个文件仅存于SPARC架
构的系统,描述LWP使用的常规寄存器组(硬件上下文的一部分),对应gwindows结构,该结构定义在/usr/include/sys/regset.h文件中。
/proc//lwp//asrs -- 辅助寄存器组,仅存于SPARC V9(UltraSPARC)架
构,专为SPARC V9架构定义的一组额外的硬件寄存器,要求sun4u、64-bit内核(Solaris 7及其后续版本)、64-bit进程。注意,64-bit内核可以运行32-bit进程,但是32-bit进程没有这样一个文件与之对应。
--------------------------------------------------------------------------
◆ procfs的实现
procfs是通过动态可加载内核模块的方式实现的。系统启动时自动加载
/kernel/fs/procfs,/etc/vfstab文件中存在缺省/proc入口,系统启动过程中/proc将被mount上来。mount过程中将调用procfs的prinit()和prmount()函数,它们为procfs初始化vfs(虚拟文件系统)结构,为根目录/proc/创建并初始化一个vnode。vfs结构定义在/usr/include/sys/vfs.h文件中,vnode结构定义在/usr/include/sys/vnode.h文件中。
/proc目录所涉及的内核内存空间绝大部分是动态分配的。但是系统支持的最大
进程数(可以通过/etc/system的max_nprocs参数配置)决定了/proc下子目录插槽数目,这个是静态分配初始化的。内核变量procdir是一个指向procent结构数组的指针,每个procent结构对应一个procfs目录入口,procent结构数组元素数量源自系统启动时初始化的v.v_proc变量的值,也就是系统支持的最大进程数。
scz注:在Solaris Kernel Hacking过程中,应该习惯使用下面这两种命令,很多未公开内核数据结构在/usr/include下的头文件中有相当体现,然后利用nm命
令确认当前内核正在使用这些内核数据结构或者内核函数。
# find /usr/include -name "*" | xargs grep -i "procdir"
# /usr/ccs/bin/nm -x /dev/ksyms | grep -i "|procdir"
[1433] |0x0000104570d0|0x000000000008|OBJT |LOCL |0 |ABS |procdir
# /usr/ccs/bin/nm -x /dev/ksyms | grep -i "|v$"
[8741] |0x00001041e1f4|0x00000000003c|OBJT |GLOB |0 |ABS |v
[6634] |0x00001041e1f4|0x00000000003c|OBJT |GLOB |0 |ABS |v
每个procent结构中pe_proc成员指向对应的proc结构,pe_next成员指向数组的下一个元素(scz:不但是数组,也形成链表)。整个procdir数组由进程PID结构的pid_prslot成员索引。创建进程时(fork())系统在procdir数组中为之分配一个元素,参看图1。
--------------------------------------------------------------------------
+--------+ +---->+---------+  +------------+ | +---------+ | |
内 +--------+ | pid_prslot |----+ | pe_proc | +---------+ | |
程 | p_pidp |----> +------------+ | | pe_proc | +-------------+ +->+----------+ procdir |
| proc | | | pr_next ----|--+ | | prc_slot ---->+---------+ |
| structure | /proc | | pr_common --|--|-+ +----------+ | pe_proc --+
| +---------+ | /| | pr_files ---|--|----------------+ | pe_next |
| | | | vnode | | pr_vnode | | | +---------+
一 | | p_trace -------------->+---------+ | | | | pe_proc |
| | p_plist | | | | |vnode | | | | | pe_next |
个 | | | | | | |structure| | | | +---------+
| +---------+ | | | | | | | | | pe_proc |
多 | | +--|-|v_data | | | | | pe_next |
| kthread LWP | /proc | +---------+ | | | +---------+
线 | +---------+ | / +-------------+ | | | pe_proc |
| | | | /lwp/ vnode | | | pe_next |
程 | | t_trace -----+ prnode | | +---------+
| | | | | +->+-------------+ +----------+| +---------+
程 | kthread LWP | | | | pr_files | | | prc_slot || | |
| +---------+ | | | | pr_vnode | | +----------+| | |
| | | | +-------->+---------+ | | | | |
| | t_trace -----+ | | |vnode | | | |
| | | | | | | |structure| | | |
| +---------+ | | | | | | | | +-->+---+ array of
+-------------+ | +--|-|v_data | | | | | pointers
| | +---------+ | | +---+ to vnodes
| +-------------+ | | | for all files
/proc//lwp | | +---+ within the
/ vnode | prnode | | | Directory
| +->+-------------+ +----------+ +---+
| | | pr_files | | prc_slot | | |
| | | pr_vnode | +----------+ +---+
+-------->+---------+ |
| | |vnode | |
| | |structure| |
| | | | |
+--|-|v_data | |
| +---------+ |
+-------------+
图3. 一个多线程进程所涉及结构之间的关联
--------------------------------------------------------------------------
下面是在我的Sun工作站上找到的相应头文件内容:
/usr/include/sys/proc/prdata.h
typedef struct prnode
{
vnode_t * pr_next; /* list of all vnodes for process */
prcommon_t * pr_common; /* common data structure */
prcommon_t * pr_pcommon; /*
* process common data structure
* 和上面那个成员什么区别
*/
vnode_t ** pr_files; /* contained files array (directory) */
vnode_t pr_vnode; /* embedded vnode 这里不是指针 */
} prnode_t;
/*
* Common file object to which all /proc vnodes for a specific process
* or lwp refer. One for the process, one for each lwp.
*/
typedef struct prcommon
{
int prc_slot; /* process slot number */
} prcommon_t;
/usr/include/sys/vnode.h
/*
* All of the fIElds in the vnode are read-only once they are initialized
* (created) except for:
* v_flag: protected by v_lock
* v_count: protected by v_lock
* v_pages: file system must keep page list in sync with file size
* v_filocks: protected by flock_lock in flock.c
* v_shrlocks: protected by v_lock
*/
typedef struct vnode
{
CADdr_t v_data; /* private data for fs */
} vnode_t;
/usr/include/sys/thread.h
typedef struct _kthread
{
struct vnode * t_trace; /* pointer to /proc lwp vnode */
} kthread_t;
图3演示了打开一个procfs文件进行读写时部分相关procfs数据结构和它们之间
的关联。注意到一个进程相关的所有vnodes通过prnode结构的pr_next成员链接起来。当引用一个procfs目录以及目录下的文件对象时,内核动态创建必要的数据结构支持这种文件I/O请求,同时也是动态销毁相关数据结构。无论什么时候针对procfs目录或文件做open(2)请求或者列举procfs目录或文件,它们似乎总是在那里,类似冰箱里的灯,当你打开冰箱的时候它总是亮着的,但是关上冰箱门之后它事实上关闭着。
通过procfs所能访问到的数据显然总是位于内核proc结构以及其他一些数据结构
中,这些数据结构共同构成了Solaris内核中完整的进程模型。应用程序通过procfs可以获取进程数据,控制进程执行。这样做的好处是隐藏了内核进程模型的底层细节,以一种相对普通的方式析取感兴趣的数据、进行进程控制。请求发生时建立这种动态抽象,只要针对特定文件的访问存在,这种动态抽象就一直保持着。
针对procfs的文件I/O操作遵循传统方式,打开文件获取文件句柄,读写,关闭
文件句柄。通过vnode开关表机制进行procfs相关vnode操作时,创建并初始化prnode和prcommon结构,这通常是应用程序文件请求导致的结果。实际的procfs vnode操作由相关的查找、读写函数处理/proc目录下的对象。
procfs遍历和读取请求采用一组函数指针实现,这组函数实现procfs文件类型相
关操作。文件类型分两层维护。在vnode的v_type成员中,procfs文件类型定义成VPROC。而prnode结构的pr_type成员定义了这个特定procfs文件的类型。procfs文件类型直接描述了/proc目录结构,参看/usr/include/sys/proc/prdata.h文件。
/*
* Node types for /proc files (directories and files contained therein).
*/
typedef enum prnodetype
{
PR_PROCDIR, /* /proc */
PR_PIDDIR, /* /proc/ */
PR_AS, /* /proc//as */
PR_CTL, /* /proc//ctl */
PR_STATUS, /* /proc//status */
PR_LSTATUS, /* /proc//lstatus */
PR_PSINFO, /* /proc//psinfo */
PR_LPSINFO, /* /proc//lpsinfo */
PR_MAP, /* /proc//map */
} prnodetype_t;
打开一个procfs文件时的基本流程如图4所示。
--------------------------------------------------------------------------
open( "/proc//", O_RDONLY );
| Specific procfs directory object
代| vn_open() lookup functions are invoked
| through the pr_lookup_function[]
码| +----> lookupxxx() array
| | VOP_LOOKUP() -> prlookup()
流| | index based on type
| | pr_lookup_function +-----------------------+
程| | | pr_lookup_piddir() |\
| | Construct full path name, +-----------------------+ \
| | looking up each element | pr_lookup_lwpdir() | \
| | in the path. +-----------------------+ prgetnode()
| | | pr_lookup_objectdir() | /
| | +-----------------------+ /
| | | | |/
| | ...... | ......
| | |
| +-------------------------------------------+
| VOP_OPEN() -> propen()
V
图4. 打开一个procfs文件时的基本流程
--------------------------------------------------------------------------
图4中流程从应用程序开始,针对一个procfs文件做open(2)系统调用。进入
vnode内核层(vn_open()),完成一系列查找以构建目标/proc文件的完整路径名。通过vnode层的宏进入文件系统相关操作。在上面的图例中,VOP_LOOKUP()解析成procfs的pr_lookup()函数。pr_lookup()完成访问权限检查并根据目录文件类型调用相应的procfs函数,比如pr_lookup_piddir()针对/proc/目录进行查找工作。每个pr_lookup_xxx()目录查找函数完成某些目录类型相关的工作,然后调用prgetnode()获取prnode。
prgetnode()为/proc文件创建prnode(其中内嵌了vnode),并初始化prnode和vnode结构的某些成员。对于/proc/和/proc//lwp/,还会创建
prcommon结构,挂接到prnode结构上,并部分初始化。注意,对于/proc下的目录文件,为了正确反映目录文件类型,vnode类型从VPROC(初始设置)改变成VDIR,表示这是一个procfs目录文件。
一旦完整路径名构建完毕,通过VOP_OPEN()宏进入文件系统相关的open()函数。procfs的propen()函数完成prnode和vnode结构的其余初始化以及针对特定文件类型的访问测试工作。一旦propen()完成,控制返回到vn_open()。最终一个代表procfs文件的文件句柄返回给主调者。
读取一个procfs数据文件(和目录文件相对)类型打开流程,read()系统调用最终
进入procfs的prread()函数。procfs实现为每个可用文件对象(不同的数据结构)定义了一个数据文件对象相关的读函数,比如pr_read_psinfo()、pr_read_pstatus()、
pr_read_lwpsinfo()等等。这些函数指针构成一个数组,以文件类型做下标进行索引,prread()最终调用了它们。整个流程类似lookup操作。
Solaris 7 的procfs实现是基于64-bit内核的,但是同时支持32-bit和64-bit应
用,在/proc层次结构上提供了32-bit版本的可用数据文件。在64-bit Solaris 7内核中,描述每个/proc文件对象内容的数据结构同时拥有32-bit版本和64-bit版本,比如lwpstatus和lwpstatus32、psinfo和psinfo32等等。针对每个32-bit版本的结构定义,相应pr_read_xxx()函数做了支持32-bit数据模式的编码。
procfs用户并不会意识到64-bit内核中多种数据模式实现。调用到prread()时,
它会检查主调者使用的数据模式,并激活相应数据模式的函数。这里有一个例外,读取/proc//as(地址空间)文件时,主调者必须拥有与/proc//as文件一样的
数据模式,换句话说,64-bit内核中32-bit应用程序可以读取另外一个32-bit进程的AS(地址空间)文件,但是不能读取另外一个64-bit进程的AS文件。
scz注:我觉得这里倒不如说,/proc//as本身是拥有单一数据模式的,要么
32-bit,要么64-bit,不可得兼。而其他/proc数据文件对象可能同时支持两
种数据模式。
pr_read_xxxx()函数从内核里读取相关数据,然后写入相应的procfs数据结构,最终返回给主调者。例如,pr_read_psinfo()从目标进程的proc结构、cred结构和as结构读取数据,写入psinfo结构中相应成员。访问内核数据时靠proc结构的p_lockp成员确定的互斥锁进行同步,这样确保每次只有一个客户线程能够访问per-process或per-lwp内核数据。
很少需要写访问procfs文件。姑且不考虑写目录创建数据文件,典型的写操作就
是为了发出某些控制消息写进程或LWP控制文件。控制消息(参看proc(1))包括stop/start消息,信号跟踪和控制,故障管理,执行控制(比如进入/退出某个系统调用时暂停)以及地址空间访问监视。
迄今为止,我们讨论的都是用标准系统调用对procfs文件进行I/O操作,目前从
普通应用级程序员编程访问/proc文件来说这是唯一的办法。然而另外有一组特定针对procfs的访问接口,proc(1)中介绍的/usr/proc/bin/下的命令(随Solaris分发)使用了这组接口。这组接口位于libproc.so动态链接库,属于未公开的接口。Sun公司正在着手准备关于这组接口的文档,做为标准Solaris APIs提供出来。图5展示了以前讨论过的内核中procfs模块与各层之间的接口关系。
--------------------------------------------------------------------------
+---------------------+--------------------------+
| custom /proc code | /usr/proc/bin/ |
+------------------+ | +-----------------------+
| stdio interfaces | | |\\\\\\\\libproc\\\\\\\\|
+------------------+--+--+--------------+\\\\\\\\|
| system calls |\\\\\\\\| user
-----------------------------------------------------------------
+---------------------------------------+\\\\\\\\| kernel
| vnode layer |\\\\\\\\|
+---------------------------------------+--------+
| procfs |
+------------------------------------------------+
图5. procfs模块与各层之间的接口关系
--------------------------------------------------------------------------
图5演示了多条到达procfs内核例程的路径。开发者通常通过系统调用进入vnode层,这是前面过介绍的方式。而proc(1)命令更多构建在libproc.so提供的接口上。为什么需要这组动态链接库接口呢,提供一组简单易用的例程用于应用程序开发,减少直接使用内核机制带来的复杂性。控制一个进程的执行,尤其是多线程进程,非常复杂,需要一组真正属于API层的编码接口,而不是内核层的编码接口。
向控制文件的头8个字节(如果是LP64内核,就是头16个字节)写入一个操作码和
可选的操作数,完成进程控制。写进程控制文件的路径也要经过vnode层,最终调用了procfs的prwritectl()函数。允许在一次写调用中向控制文件写入多个控制消息(操作码和操作数),prwritectl()会将一次写入的多个控制消息分成独立的操作码/操作数对,顺序提交给内核的pr_control()函数,pr_control()函数将设置进程或LWP相应的标志,以指明控制机制启动,比如某一事件发生时暂停。控制函数在proc(4)手册页中介绍。
进程/LWP控制的实现与内核中进程/LWP子系统紧密结合,P区、U区、LWP和内核线程结构中各种域一起协作完成通过procfs进行的进程管理和控制。建立进程控制包括设置标志和位掩码字段,用于跟踪那些导致进程、线程进入、离开内核的事件,包括信号、系统调用、故障情形。对应这些事件的进入、离开内核的点定义得比较充分,为进程状态改变提供了自然的控制机制。
系统调用、信号和故障分别对应数据类型sysset_t、sigset_t和fltset_t。如果
指定发生某系统调用时暂停,此时尚未从进程读取提供给该系统调用的参数。如果指定离开某系统调用时暂停,此时来自系统调用的返回值已经提交给进程。可以指定发生某种故障时进入内核陷门处理程序。可以指定接收到某个信号时暂停或者从系统调用、内核陷门处理程序返回,可以通过信号唤醒进程。
可以在进程虚拟地址空间中指定一片区域处在监视中,当针对这片区域进行被监
视类型的操作(比如读、写访问),也就是监视事件发生时,产生一次监视点陷入,典型地导致进程、LWP暂停,这通过跟踪FLTWATCH故障或者捕捉非阻塞的SIGTRAP信号实现。
某些情况下为了析取进程信息、进行进程控制,控制进程可能需要目标进程临时
完成某种特殊的操作。例如,pfiles(1)命令可以列出目标进程打开的每个文件的信息,这需要目标进程针对每个打开的文件句柄做stat(2)系统调用。运行在Solaris系统上的进程典型地花费大量时间阻塞在某个系统调用上,为了获得目标进程的控制权完成控制进程提交的任务,需要在目标进程阻塞时抢夺CPU,保护当前系统调用状态,当控制进程提交的任务完成后恢复保存的系统调用状态继续执行目标进程原来的任务。
为了达到这个目的,procfs实现了另外一个代理LWP,而不是使用目标进程中现
有LWP,否则状态保存、恢复更加复杂。procfs提供了一种机制创建代理LWP(注意PCAGENT控制消息)。代理LWP创建成功后将是目标进程中唯一可运行LWP,直到它消亡。
目标进程中执行代理LWP以完成控制进程提交的任务,比如在目标进程中执行系统调用。然后销毁代理LWP,恢复保存的进程/LWP状态。proc结构中有一个成员p_agenttp,指向创建的代理LWP。内核代码通过检查该指针判断目标进程中是否存在代理LWP。
kthread_t * p_agenttp; /* thread ptr for /proc agent lwp */
proc(4)手册页介绍了进程控制的更多细节。
--------------------------------------------------------------------------


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22249/showart_147963.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP