配置nfs文件系统

.NFS的概念

1.NFS概念:Network File System,是主机间通过网络进行文件共享的网络协议,最早由Sun公司提出,多用于Unix操作系统,它允许用户将远程主机的文件系统看做好象是本地文件系统一样,并且是可安装的,可读的和可写的。系统使用与本地文件系统一样的命令mountNFS文件系统挂接在本地文件树结构上。

2.NFS术语 

 拥有实际的物理磁盘并且通过NFS将这个磁盘共享的主机叫NFS文件服务器,通过NFS访问远程文件系统的主机叫NFS客户机。一个NFS客户机可以利用许多NFS服务器提供的服务。相反,一个NFS服务器可以与多个NFS客户机共享它的磁盘。一个共享了部分磁盘的NFS服务器可以是另一个NFS服务器的客户机。 

   NFS服务器输出的目录叫远程资源并且通常写作:host:pathname  其中host是文件服务器的名字而pathname是服务器上被输出目录的绝对路径。 

   远程资源被安装到客户机上的那个目录叫安装点(mount  point) 

3.NFS输入输出规则 

 规则一:NFS输出目录,服务器输出的是目录而不是文件系统 

 规则二:如果服务器已经输出了一个目录,如/usr/local,并且有一个文件系统安装在/usr/local 

/extra,那么/usr/local/extra的内容在客户端看不到,除非服务器明确地输出了它,或客户机明确地安装了它。 

 规则三:客户机可以安装一个输出目录的子目录,前提是此子目录不是另一个文件系统 

 规则四:一个主机不可以将一个输入的目录再次输出。例如,如果一个主机通过NFS安装/usr/local,它就不能将/usr/local输出给另外的主机。 

 规则五:一个已经输出目录的子目录不可以再输出,除非子目录在一个不同的文件系统上。还是举个例子:假设你要按只读方式输出根文件系统的跟(/)目录,但是又要按读写方式输出/tmp目录。你不可能做到这一点,除非/tmp被安装在不同于跟的文件系统

.NFS安装

只需安装两个软件包即可,通常被默认安装

#rpm -q nfs-utils portmap 

插入linux的第一张光盘

#mount /mnt/cdrom #cd /RedHat/RPMS #rpm –ivh nfs-utils-1.0.1-2.9.i386.rpm  #rpm –ivh portmap-4.0-54.i386.rpm

portmap软件包中的portmap服务,为NFS提供RPC服务的支持.nfs-utils软件包中提供了NFS服务器程序和相应的维护工具,#rpm –ql nfs-utils

支持RPC的概念:使进程产生的调用看起来象是一个普通的调用,而真正的执行是在其他进程中——也许是一个远程系统中的进程。各种RPC执行协议都朝着一个共同的目标在发展,那就是用隐藏执行细节来简化进程间通信的复杂性。

RPC机制的核心概念就是将函数调用产生的数据串行化到一个顺序流中,然后在连接接收端对它进行重组。这两种行为同步发生,就好象传统的过程化编程一样。RPC客户端进程发出一个看似标准的函数调用,但是,这个调用不会在本地执行,调用参数被打包并传递到一个远程的执行环境当中,在那里它们再被传入真正的执行函数当中。在完成函数执行后,执行结果又被串行化传回客户端,再由客户端函数传给调用者。

.NFS的配置

1.服务器的配置:NFS服务器的配置文件exports,export文件在目录/etc/下,用于配置NFS服务器所提供的目录共享.exports文件默认设置为空,这也是出于安全性的考虑,exports(输出)文件

要输出的共享目录 客户端主机地址(设置选项)

/home/share       *(sync,ro)

共享目录:设置系统中需要为共享的目录路径

客户端主机地址:192.168.1.19 abc.com指定域名的主机 192.168.1.0/24指定网段中的所有主机 *.abc.com指定域中的所有主机 *所有主机

设置选项:sync设置NFS服务器同步写磁盘(async:资料会先暂存于内存当中,而非直接写入硬盘),ro设置输出的共享目录只读(rw不能共同使用)

2.NFS服务器的启动与停止

启动NFS服务器

#service portmap start

#service nfs start

查询NFS服务器状态:#service portmap status #service nfs status

设置NFS服务器的自动启动状态

#chkconfig –list portmap|nfs查看nfs服务的自动启动状态

#chkconfig –level 35 portmap|nfs on指定运行级,由数字 0 7 构成的字符串

3.showmount命令:查询NFS服务器的共享目录状态

#showmount -h显示showmount命令的联机帮助

#showmount [NFS服务器主机地址]:显示连接到指定NFS服务器的所有主机

#showmount -e [NFS服务器主机地址]显示指定NFS服务器的输出目录列表

#showmount -d [NFS服务器主机地址]显示指定NFS服务器中已被客户端连接的所有输出目录

#showmount -a [NFS服务器主机地址]显示指定NFS服务器的所有客户端主机及其所连接的目录,例#showmount -a

4.NFS客户端配置

#mount 192.168.1.57:/home/public /mnt/nfshare

#mount |grep nfs查询该目录的挂载状态

#umount /mnt/nfshare卸载卸NFS共享目录

超级详细Tcpdump 的用法

第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网??上的特定的网络协议,实际上它是"ether" 的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,’&&’;或运算 是’or’ ,’││’;这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
使用-c参数指定要监听的数据包数量,
使用-w参数指定将监听到的数据包写入文件中保存

A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1

B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用   括号时,一定要
#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )

C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1

E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
# tcpdump udp port 123

F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname

G 下面的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname

H 我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0 gateway Gatewayname

I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
#tcpdump -i eth0 host hostname and port 80

J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
:(在命令行中适用   括号时,一定要
#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )

L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
   #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
   #tcpdump tcp port 23 host 210.27.48.1

第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,’&&’;或运算 是’o
r’ ,’||’;
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
#tcpdump ?i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump ?i eth0 host hostname and src port 80 源端口是80 一般是提供http的服务的主机
如果条件很多的话 要在条件之前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

如果在ethernet 使用混杂模式 系统的日志将会记录

May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode

tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。

FreeBSD磁盘组织学习笔记

FreeBSD磁盘组织学习笔记
在FreeBSD中分区与文件系统是一一对应的,它这里的分区和常用的在Windows中的分区的意思不一样(如:MS-DOS分区),在FreeBSD中,将一块硬盘可以最多分成四个slice(片段),每一个slice上又可以分成最多8个分区(partition),这里的一个slice就相当与Windows里面的一个分区看成为一个slice,在FreeBSD中将一个slice分成8个(partition)分区,分别表示为a,b,c,d,e,f,g,h,传统上a,b,c,d分区有特别的意义,如a表示root分区,b表示swap分区,c表示整个slice,d表示整个硬盘。但在FreeBSD-2.0.5 Release后,只需要C定位为整个slice,其他各盘可以互换,但一般还是依照传统。
Slice 其编号是从1到4,Slice编号在设备名后面,并有一个s前缀,从1开始,如da0s1是第一个SCSI磁盘驱动器的第一个Slice,每个磁盘上只能有四个物理Slice,自己可以在物理Slice中使用适当的类型来创建逻辑Slice,这些扩展Slice 编号从5开始,因此ad0s5是第一个IDE磁盘中第一个扩展Slice; Slice“专项指定”物理驱动器,和其他驱动器都包含partitions,那几个partition都是字母从a 到h来标记,如ad1s3e表示第二快IDE磁盘上第三个Slice的第五个partition。
磁盘设备的代码
代码 说明
ad ATAPI (IDE) 磁盘
da SCSI 直接存取磁盘
acd ATAPI (IDE) 光驱
cd SCSI 光驱
fd 软驱

样例磁盘, Slice, 和 Partition 它们的命名
命名 说明
ad0s1a 在首个IDE磁盘(ad0)上的 第一个slice (s1)里的 第一个partition (a)。
da1s2e 在第二个SCSI磁盘(da1)上的 第二个slice(s2)里的 第五个partition(e

一个磁盘的布局
从在系统里的首个IDE磁盘图表可以显示出FreeBSD的见解。假设磁盘大小为4 GB,它里面包含了两个2 GB 大小的slices (但在MS-DOS叫partitions)。 首个slice是一个MS-DOS磁盘叫C:,而第二个slice是FreeBSD配置好的slice。 FreeBSD配置好的slice有三个partitions和另一个交换分区。

关于/proc 文件系统

1. Linux和freebsd下都有/proc 文件系统,它是内存里的一个虚拟的文件系统

2. /proc 文件系统在Linux和freebsd 下的异同
Linux                                                               freebsd
df -h 时不显示                                                df -h 时显示,并占用100%
含有进程及其它系统信息                             只含有进程信息

 

3. /proc文件系统内容解释

/proc 文件系统是一个假的文件系统。它不存在在磁盘某个磁盘上。而是由核心在内存中产生。用于提供关于系统的信息(originally about processes, hence the name)。下面说明一些最重要的文件和目录。 /proc 文件系统在proc man页中有更详细的说明。

/proc/1 
关于进程1的信息目录。每个进程在/proc 下有一个名为其进程号的目录。
/proc/cpuinfo 
处理器信息,如类型、制造商、型号和性能。
/proc/devices 
当前运行的核心配置的设备驱动的列表。
/proc/dma 
显示当前使用的DMA通道。
/proc/filesystems 
核心配置的文件系统。
/proc/interrupts 
列出使用中的中断号,这在硬件冲突的诊断中十分有用。
/proc/ioports 
当前使用的I/O端口。
/proc/kcore 
系统物理内存映象。与物理内存大小完全一样,但不实际占用这么多内存;it is generated on the fly as programs access it. (记住:除非你把它拷贝到什么地方,/proc 下没有任何东西占用任何磁盘空间。)
/proc/kmsg 
核心输出的消息。也被送到syslog 
/proc/ksyms 
核心符号表。
/proc/loadavg 
系统"平均负载";3个没有意义的指示器指出系统当前的工作量。
/proc/meminfo 
存储器使用信息,包括物理内存和swap。
/proc/modules 
当前加载了哪些核心模块。
/proc/net 
网络协议状态信息。
/proc/self 
到查看/proc 的程序的进程目录的符号连接。当2个进程查看/proc 时,是不同的连接。这主要便于程序得到它自己的进程目录。
/proc/stat 
系统的不同状态,such as the number of page faults since the system was booted.
/proc/uptime 
系统启动的时间长度。
/proc/version 
核心版本。

 

相关资料: http://www.ibm.com/developerworks/cn/linux/l-proc.html

问题:不知道freebsd下的系统信息如何方便地得到?

PHP中的错误与异常

1. PHP中的错误与异常时不同的,try 不能捕获到函数中非throw产生的错误,set_error_handler函数可以设置错误处理句柄,set_exception_handler可以设置异常处理句柄,不过,异常一般不这么做,都是用try{}catch(){}来处理的。

2. 不像C语言,函数的返回值可以标识函数是否执行成功,也可以标识可能产生的错误类型,如open函数在打开错误时总返回-1,但是错误原因可能是不同的,只是可以通过errno全局变量来获取详细的错误号,虽然php同样有fopen函数,但是没有类似errno的全局变量(可能是我没有发现,但愿有)。

根分区只读后会产生很多奇怪的问题

 

 1. 卸载一个分区后,df 仍显示该分区,因为根分区只读,卸载操作成功了,但修改根分区下配置文件的操作没有成功,通过strace发现,df是读文件的,好像读的是/etc/mtab

2. /root 的历史命令没有记录,因为根分区只读,而root刚好在根分区,所以history文件无法修改就没有记录

3.  。。。

令人琢磨的 history 命令

大家知道 history命令可以列出最近执行过的命令,而且我们也知道,最近执行过的命令是存放在用户目录下的.bash_history 文件中的;但是有一点令人迷惑,我同时以同一个用户身份打开两个终端,交替在两个终端中执行命令,这时,我们分别在每个终端中使用history命令,显示的都是当前终端里刚执行过的命令,而不是两个终端执行的命令的交叉显示,我们说,执行过的命令是存入文件的,而打开文件,发现里面没有我们刚执行过的命令,这时我们不得不怀疑,刚才执行过的命令并没有立即写history文件,肯定是先缓存起来了,那么什么时候才写文件呢?目前我只知道当exit的时候是要写文件的,其它的时候,如果执行的命令足够多了,会写文件吗?这个还不清楚。

我起初是考虑使用strace 看看history是怎么执行的,但是计算机死活说history不是命令,type history 看看,原来history是内置命令,不是文件,所以strace就不管了,由此也知道了,strace 不能跟踪内置命令,因为strace可以跟踪一个进程(使用进程的pid),如果内置命令也是要产生进程的话,肯定是可以跟踪的,猜想内置命令执行时并不产生一个进程

注意:默认history命令列出很多曾经执行的命令,如果只要后n条,可以history n

 

strace 也能用,直接strace bash进程就行了

关于cookie

关于cookie曾经研究过一些,现在补充一些:

1. 进程cookie的实现
从http协议的角度来讲,进程cookie和文件cookie都是用Set-Cookie 来发送的,其区别就是进程cookie没有设置过期时间,而文件cookie有过期时间,PHPSESSIONID是典型的没有过期时间的cookie,不过,除此之外,我们自己设置cookie时只要不指定过期时间,都是进程cookie的,只保留在内存中,不写入cookie文件,达到重启浏览器session失效的效果。不过,还有一点需要注意,也是我从来没有注意到的,PHPSESSIONID也不是说绝对就是进程cookie的,在php.ini 中有下述设置:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 10

该设置是指定设置PHPSESSIONID这个cookie时(不影响其它进程cookie的设置是否指定过期时间,0 为不指定,这是正常情况,这样PHPSESSIONID就被设置为进程cookie,如果非0 ,那么发送PHPSESSIONID的Set-Cookie 头时就是含有过期时间的,对于浏览器而言,不管该cookie叫什么名字或起什么作用,只要有过期时间,就是文件cookie(即:写入文件),因为session是要重启浏览器就失效的,所以,我建议将此值设置为0;另外,如果设置的时间比较短而且客户端与服务器的时间差又比较大,可能就无法登陆,因为session刚设置就失效,服务器上的一个将来的时间可能对客户端来说已经是过去的时间了。

2. php发展到4.0 以后,register_globals 一般都设置为off ,所以,我不建议使用session_register();函数,直接使用$_SESSION这个全局变量更好,也方便。

3. 关于PHP加速器eaccelarator默认的编译禁用session的说明:

PHP 资源类型 — stream

PHP 中有一中特殊的变量叫资源,其中一种资源类型叫 stream,这里就说说stream

1. 获取可以使用的流:
print_r(stream_get_wrappers());

2. 注册一个用 PHP 类实现的 URL 封装协议,允许用户实现自定义的协议处理器和流,详细请参看手册,
boolean stream_register_wrapper ( string protocol,  string classname )

3. stream_context_* 类的函数 (还没来及看呢)