centos支持rar解压

添加centos系统对rar文件的支持。
[root@localhost ~]# wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz
[root@localhost ~]# tar -zxvf rarlinux-4.0.1.tar.gz

rar/
rar/readme.txt
rar/default.sfx
rar/whatsnew.txt
rar/license.txt
rar/order.htm
rar/rar
rar/unrar
rar/rar_static
rar/technote.txt
rar/rarfiles.lst
rar/makefile
rar/rar.txt
[root@localhost ~]# cd rar
[root@localhost rar]# make

mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib
[root@localhost rar]# rar x moumou.rar
-bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

处理这个问题
[root@localhost rar]# cp rar_static /usr/local/bin/rar
cp: overwrite `/usr/local/bin/rar'? y

已可以正常解压
root@localhost rar]# rar x moumou.rar

RAR 4.01 Copyright (c) 1993-2011 Alexander Roshal 28 May 2011
Shareware version Type RAR -? for help
Extracting from moumou.rar

Creating moumou OK
Creating moumou/css OK
Extracting moumou/css/default.css OK

 

Centos Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。

Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。

利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

#!/bin/sh

#comments

Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。

编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:

chmod +x filename.sh

执行脚本的方法是:

./filename.sh

下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。

#!/bin/sh

#print hello world in the console window

a = "hello world"

echo $a

Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:

variable_name = variable_value

如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:

echo "Hi, $as"

就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:

echo "Hi, ${a}s"

单引号中的变量不会进行变量替换操作。

关于变量,还需要知道几个与其相关的Linux命令。

env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。

下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。

{C} 1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ]; then
4 cat<<HELP
5      ren -- renames a number of files using sed regular expressions
6
7      USAGE: ren 'regexp' 'replacement' files
8      EXAMPLE: rename all *.HTM files in *.html:
9      ren 'HTM$' 'html' *.HTM
10
11 HELP
12      exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ]; then
23     newfile=`echo "$file" | sed  "s/${OLD}/${NEW}/g"`
24         if [ -f "$newfile" ]; then
25             echo "ERROR: $newfile exists already"
26         else
27             echo "renaming $file to $newfile "
28             mv "$file" "$newfile"
29         fi
30 fi
31 done

 

我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:

if …; then

elif …; then

else

fi

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f "$file" ] 判断$file是否是一个文件

[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性

[ -n "$a" ] 判断变量$a是否有值,测试空串用-z

[ "$a" = "$b" ] 判断$a和$b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。

第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。

十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。

然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:

while [ cond1 ] && { || } [ cond2 ] …; do

done

for var in …; do

done

for (( cond1; cond2; cond3 )) do

done

until [ cond1 ] && { || } [ cond2 ] …; do

done

在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。

第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:

case var in

pattern 1 )

… ;;

pattern 2 )

… ;;

*)

… ;;

esac

 

我们再就下面一个例子,看看case语句的用法。

while getopts vc: OPTION

do

case $OPTION in

c) COPIES=$OPTARG

ehco "$COPIES";;

v) echo "suyang";;

\?) exit 1;;

esac

done

上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:

getopts option_string variable

option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。

上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。

第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:

select var in …; do

break;

done

例如,下面这段程序的输出是:

#!/bin/bash

echo "Your choice?"

select var in "a" "b" "c"; do

break

done

echo $var

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

Your choice?

1) a

2) b

3) c

第三,Shell Script中也可以使用自定义的函数,其语法形式如下:

functionname()

{

}

例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。

第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。

sh ?x filename.sh

这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

 

Linux 系统如何禁ping, CentOS 禁ping

Linux系统,CentOS操作系统如何设置禁止别人ping我们自己的服务器,下面给大家介绍一些常用的方法:

1、以root账户进入系统,然后编辑文件icmp_echo_ignore_all
vi /proc/sys/net/ipv4/icmp_echo_ignore_all
0 表示允许ping
1 表示禁止ping

可以直接运行以下命令
[root@00isp ~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
[root@00isp ~]# echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

此上两条命令的效果实时生效,可以用另外的机器ping来测试是否生效。以上方式只是临时性的禁ping 重启后会失效,如果想要重启过后也不能ping可以做如下操作

/etc/rc.d/rc.local中增加一行
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

另外可以在配置文件 /etc/sysctl.conf 文件中增加一行
net.ipv4.icmp_echo_ignore_all=1

2、使用IPTables禁止PING

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
这下是别人不能ping你,你也不能ping别人,其实使用iptable最简单
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -s 192.168.29.1 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 -s 192.168.29.1 -j ACCEPT

 

CentOS mini 默认无法上网和配置IP

CentOS  mini默认是无法上网,需要进行如下设置:

一、编辑网络设置:

修改ONBOOT值为yes

1 DEVICE=eth0
2 HWADDR=00:0C:29:4E:B7:C9
3 TYPE=Ethernet
4 UUID=a3d55d06-78fe-4542-a44a-d95cb5667cd6
5 ONBOOT=no
6 NM_CONTROLLED=yes
7 BOOTPROTO=dhcp

二、重启network服务

service network restart

手动配置IP:

vi  /etc/sysconfig/network-scripts/ifcfg-ethx

linux-iplinux-ip

CMake和Configure项目的安装与反安装

Configure:
项目安装:
比如用源码包安装gaim 的

./configure --prefix=/opt/gaim make make install

如果安装mlterm

./configure --prefix=/opt/mlterm make make install

把源码包安装的软件,都指定安装在 /opt目录中

项目删除:
如果删除,就删除相应的软件目录;

有些软件要在解压安装目录中执行

make uninstall

这样就卸载掉了

CMake:

项目安装:
1、首先安装CMake工具

wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz tar xvzf cmake-2.8.4.tar.gz cd cmake-2.8.4 ./configure make make install

以安装MySQL 5.5.9为例,执行:

tar zxvf mysql-5.5.9.tar.gz cd mysql-5.5.9/ rm CMakeCache.txt cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/-DMYSQL_DATADIR=/home/mysql/data/-DEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306-DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_DEBUG=0-DWITH_INNOBASE_STORAGE_ENGINE=1-DMYSQL_USER=mysql

这些参数的意思:
-DCMAKE_INSTALL_PREFIX=/data/mysql 准备安装到那里
-DEFAULT_CHARSET=utf8 默认的字符集
-DMYSQL_TCP_PORT=3306 数据库的监听端口
-DMYSQL_UNIX_ADDR=/tmp/mysql3306.sock 本机连回数据库的unix socket
-DWITH_DEBUG=0 关闭debug模式
-DWITH_INNOBASE_STORAGE_ENGINE=1 打开innodb引擎

make && make install

项目删除:
CMake 默认不提供 uninstall 这个 target,想要的话,输入:

xargs rm < install_manifest.txt

对于不修改配置的项目足够了,manifest.txt 是CMake 生成的安装文件列表。

源码安装lnmp

4.mysql
/lnmp/cmake/bin/cmake \
-DCMAKE_INSTALL_PREFIX=/lnmp/mysql \
-DMYSQL_DATADIR=/lnmp/mysql/data \
-DSYSCONFDIR=/lnmp/mysql/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/lnmp/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make && make install
yum -y install ncurses-devel
新安装的mysql如果需要密码,查看cat /root/.mysql_secret中即为mysql的默认root密码
进入后set password="123456";
安装完成后需要添加php扩展,先cd到php安装源文件ext/gd(以安装gd为例)
/php路径/bin/phpize 生成configure文件
./configure --with-php-config=/php路径/bin/php-config
php查看安装的模块php -m
加入环境变量例子(环境变量地址:/etc/profile)
PATH=/lnmp/mysql/bin:$PATH
export PATH
source /etc/profile

 

/etc/passwd 和 /etc/shadow 文件内容及其解释

默认情况下,/etc/passwd 存储有关本地用户的信息

/etc/passwd 采用以下格式:

/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間1

1)username        UID到名称的一种映射,用户名

2)password         保存密码的位置,现在保存在/etc/shadow 中

3)UID                   用户ID

4)GID                  主组ID

5)GECOS            字段存储任意文本,用户注释

6)/home/dir          用户的家目录

7)shell                 用户登入后使用的shell名称
passwd文件是普通的文本文件,可以手工修改文件中的用户信息(usermod),或者最后添加新行以增加新的用户(useradd)。

如果同时2个人修改文件passwd的话,有毁坏文件的危险。建议采用vipw命令,它可以将passwd文件锁住,以防止其他人同时使用。

用户密码存储在/etc/shadow,格式为(以“:”为分割符):

/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間2

 

1)用户名

2)加密的密码

3)上次更改密码的日期(从1970-1-1开始)

4)最短密码期限(按天计算,0 = 无最短期限)

5)最长密码期限(按天计算)

6)密码警告期限(按天计算,0 = 未指定警告)

7)密码非活动期限(按天计算)

8)账号到期时间(从1970-1-1开始)

9)保留域

/etc/shadow 由 pwconv 命令根据/etc/passwd中的数据自动产生。

/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間3

改使用者的密码 — passwd

参数

-l 关闭账号密码。效果相当于usermod -L,只有root才有权使用此项。
-u 恢复账号密码。效果相当于usermod -U,同样只有root才有权使用。
-g 修改组密码。gpasswd的等效命令。
-f 更改由finger命令访问的用户信息。
-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用。
-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用。

/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間4

更改密码时效 — chage

参数

-m 密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M 密码保持有效的最大天数。
-W 用户密码到期前,提前收到警告信息的天数。
-E 帐号到期的日期。过了这天,此帐号将不可用。
-d 上一次更改的日期。
-I(大写的i) 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l 列出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間5
关于账号时间图示:
/etc/passwd 和 /etc/shadow 文件内容及其解释 - 梦に者 - 梦に空間6

 

Centos 安装 crontab

安装crontab: yum install crontabs 
说明:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置 

查看crontab服务状态: service crond status 
手动启动crontab服务: service crond start 
查看crontab服务是否已设置为开机启动,执行命令: ntsysv 
加入开机自动启动: chkconfig --level 35 crond on

1,crontab命令

功能说明:设置计时器。

语  法:crontab [-u <用户名称>][配置文件] 或 crontab [-u <用户名称>][-elr]

补充说明:cron是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使 用计时器的功能。其配置文件格式如下:
Minute Hour Day Month DayOFWeek Command

参  数:
-e  编辑该用户的计时器设置。
-l  列出该用户的计时器设置。
-r  删除该用户的计时器设置。
-u<用户名称>  指定要设定计时器的用户名称。

2,crontab 格式

基本格式 :
* *  *  *  *  command
分 时 日 月 周  命令

第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列 表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

crontab特殊的符号说明:

"*"代表所有的取值范围内的数字。特别要注意哦!

"/"代表每的意思,如"*/5"表示每5个单位

"-"代表从某个数字到某个数字

","分散的数字
crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart 
上面的例子表示每晚的21:30重启 apache。

 

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 
上面的例子表示每月1、 10、22日的4 : 45重启apache。

 

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 
上面的例子表示每周六、周日的1 : 10重启apache。

 

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

 

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart 
上面的例子表示每星期六的11 : 00 pm重启apache。

 

* */1 * * * /usr/local/etc/rc.d/lighttpd restart 
每一小时重启apache

 

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 
晚上11点到早上7点之间,每 隔一小时重启apache

 

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 
每月的4号与每周一到周三 的11点重启apache

 

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart 
一月一号的4点重启apache

 

*/30 * * * * /usr/sbin/ntpdate 210.72.145.44 
每半小时同步一下时间

 

-------------------------------- 如何查看crontab的日志记录 --------------------------------------------------------

昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang在了什么地方。

1.  linux
看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

2.  unix
在 /var/spool/cron/tmp文件中,有croutXXX001864的tmp文件,tail 这些文件就可以看到正在执行的任务了。

3. mail任务
在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况。

 

CentOS 6.3 NFS的安装配置、启动及mount挂载方法

一、环境介绍:

服务器:centos 192.168.1.225

客户端:centos 192.168.1.226

二、安装:

NFS的安装配置:
centos 5 :

yum -y install nfs-utils portmap

centos 6(在CentOS 6.3当中,portmap服务由rpcbind负责) :

yum -y install nfs-utils rpcbind

三、服务器端配置:

1、创建共享目录:

[root@centos2 /]# mkdir /usr/local/test

2、NFS文件配置:

[root@centos2 /]# vi /etc/exports 
#增加一行:
/usr/local/test/ 192.168.1.226(rw,no_root_squash,no_all_squash,sync)

:x保存退出;

使配置生效:

[root@centos2 /]# exportfs -r

注:配置文件说明:

/usr/local/test/ 为共享的目录,使用绝对路径。
192.168.1.226(rw,no_root_squash,no_all_squash,sync) 为客户端的地址及权限,地址可以是一个网段,一个IP地址或者是一个域名,域名支持通配符,如:*.youxia.com,地址与权限中间没有空格,权限说明:
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。

3、启动:

centos6:

[root@centos2 /]# service rpcbind start

Starting rpcbind:                                          [  OK  ]
[root@centos2 /]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
[root@centos2 /]#

centos 5

[root@centos2 /]# service portmap start
[root@centos2 /]# service nfs start
[root@centos2 /]#

四、客户端挂载:

1、创建需要挂载的目录:

[root@localhost ~]# mkdir /usr/local/test
[root@localhost ~]#

2、测试挂载:

[root@localhost ~]# showmount -e 192.168.1.225
Export list for 192.168.1.225:
/usr/local/test 192.168.1.226
[root@localhost ~]#

如果显示:rpc mount export: RPC: Unable to receive; errno = No route to host,则需要在服务端关闭防火墙(稍候会详细说)。

3、挂载:

[root@localhost ~]# mount -t nfs 192.168.1.225:/usr/local/test /usr/local/test

[root@localhost ~]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
192.168.1.225:/usr/local/test on /usr/local/test type nfs (rw,vers=4,addr=192.168.1.225,clientaddr=192.168.1.226)
[root@localhost ~]#

如果信息如上显示则挂载成功!

4、测试:

客户端生成一个文件:

[root@centos2 /]# cd /usr/local/test/
[root@centos2 test]# echo "hello nfs test">>test
[root@centos2 test]# ll
total 4
-rw-r--r-- 1 root root 15 Apr  9 13:24 test
[root@centos2 test]#

服务端检查:

[root@centos2 /]# cd /usr/local/test/
[root@centos2 test]# ll
total 4
-rw-r--r-- 1 root root 15 Apr  9 13:24 test
[root@centos2 test]#

挂载成功!

五、解除挂载:

[root@localhost ~]# umount /usr/local/test

[root@localhost ~]# mount
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
[root@localhost ~]#

如果遇到:umount.nfs: /usr/local/test: device is busy

可能用命令:

[root@localhost /]# fuser -m -v /usr/local/test

                     用户     进程号 权限   命令
/usr/local/test/:              root       2798 ..c.. bash
                     root       2996 ..c.. su
[root@localhost /]# kill -9 2798

[root@localhost /]# kill -9 2996

[root@localhost /]# umount /usr/local/test
[root@localhost /]#

六、服务器端防火墙设置(NFS 开启防墙配置):

1、修改/etc/service,添加以下内容(端口号必须在1024以下,且未被占用)

# Local services
mountd 1011/tcp #rpc.mountd
mountd 1011/udp #rpc.mountd
rquotad 1012/tcp #rpc.rquotad
rquotad 1012/udp #rpc.rquotad

2、重起Linux NFS服务

service nfs restart

3、此时rpc相关端口已经被固定,可以为Linux NFS添加防火墙规则

#portmap
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 111 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 111 -j ACCEPT
#nfsd
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 2049 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 2049 -j ACCEPT
#mountd
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 1011 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 1011 -j ACCEPT
#rquotad
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 1012 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 1012 -j ACCEPT
#rpc.statd
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p tcp --dport 32768 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.0/254 -p udp --dport 32768 -j ACCEPT

---TCP方法成功-------------------------------------------
-A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1011 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1012 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 32768 -j ACCEPT

客户端在挂载的时候遇到的一个问题如下,可能是网络不太稳定,NFS默认是用UDP协议,换成TCP协议即可:

mount -t nfs 192.168.1.225:/usr/local/test /usr/local/test  -o proto=tcp -o nolock

/etc/init.d/iptables restart #最后重启防火墙使配置生效
防火墙端口说明:
portmap或者rpcbind(CentOS 6.x)使用:tcp/udp 111
nfs使用:tcp/udp 2049
mountd使用: TCP/UDP 892
rquotad使用:tcp/udp 875
status使用: TCP/UDP 1001-1004共四个端口
nlockmgr使用:TCP/32803端口 UDP/32769端口

rpcinfo -p 查看rpcbind使用的端口号