4、Hadoop集群安装

所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。

4.1 安装hadoop

首先用root用户登录"Master.Hadoop"机器,查看我们之前用FTP上传至"/home/Hadoop"上传的"hadoop-1.0.0.tar.gz"。

Hadoop集群系列:Hadoop安装配置(2)_命名

接着把"hadoop-1.0.0.tar.gz"复制到"/usr"目录下面。

cp /home/hadoop/hadoop-1.0.0.tar.gz /usr

Hadoop集群系列:Hadoop安装配置(2)_下一步_02

下一步进入"/usr"目录下,用下面命令把"hadoop-1.0.0.tar.gz"进行解压,并将其命名为"hadoop",把该文件夹的读权限分配给普通用户hadoop,然后删除"hadoop-1.0.0.tar.gz"安装包。

cd /usr #进入"/usr"目录

tar –zxvf hadoop-1.0.0.tar.gz #解压"hadoop-1.0.0.tar.gz"安装包

mv hadoop-1.0.0 hadoop #将"hadoop-1.0.0"文件夹重命名"hadoop"

chown –R hadoop:hadoop hadoop #将文件夹"hadoop"读权限分配给hadoop用户

rm –rfhadoop-1.0.0.tar.gz                #删除"hadoop-1.0.0.tar.gz"安装包

Hadoop集群系列:Hadoop安装配置(2)_文件夹_03

解压后,并重命名。

Hadoop集群系列:Hadoop安装配置(2)_下一步_04

把"/usr/hadoop"读权限分配给hadoop用户(非常重要)

Hadoop集群系列:Hadoop安装配置(2)_用户登录_05

删除"hadoop-1.0.0.tar.gz"安装包

Hadoop集群系列:Hadoop安装配置(2)_服务器_06

最后在"/usr/hadoop"下面创建tmp文件夹,把Hadoop的安装路径添加到"/etc/profile"中,修改"/etc/profile"文件(配置java环境变量的文件),将以下语句添加到末尾,并使其有效:

# set hadoop path

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

1)在"/usr/hadoop"创建"tmp"文件夹

mkdir /usr/hadoop/tmp

Hadoop集群系列:Hadoop安装配置(2)_服务器_07

2)配置"/etc/profile"

vim /etc/profile

Hadoop集群系列:Hadoop安装配置(2)_用户登录_08

配置后的文件如下:

Hadoop集群系列:Hadoop安装配置(2)_文件夹_09

3)重启"/etc/profile"

source /etc/profile

Hadoop集群系列:Hadoop安装配置(2)_下一步_10

4.2 配置hadoop

1)配置hadoop-env.sh

该"hadoop-env.sh"文件位于"/usr/hadoop/conf"目录下。

Hadoop集群系列:Hadoop安装配置(2)_命名_11

在文件的末尾添加下面内容。

# set java environment

export JAVA_HOME=/usr/java/jdk1.6.0_31

Hadoop集群系列:Hadoop安装配置(2)_下一步_12

Hadoop配置文件在conf目录下,之前的版本的配置文件主要是Hadoop-default.xml和Hadoop-site.xml。由于Hadoop发展迅速,代码量急剧增加,代码开发分为了core,hdfs和map/reduce三部分,配置文件也被分成了三个core-site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。

2)配置core-site.xml文件

修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。

<configuration>

<property>

<name>hadoop.tmp.dir</name>

<value>/usr/hadoop/tmp</value>

(备注:请先在 /usr/hadoop 目录下建立 tmp 文件夹)

1.<description>A base for other temporary directories.</description>
2.</property>
3.<!-- file system properties -->
4.<property>
5.<name>fs.default.name</name>
6.<value>hdfs://192.168.1.2:9000</value>
7.</property>
8.</configuration>

备注:如没有配置hadoop.tmp.dir参数,此时系统默认的临时目录为:/tmp/hadoo-hadoop。而这个目录在每次重启后都会被干掉,必须重新执行format才行,否则会出错。

用下面命令进行编辑:

Hadoop集群系列:Hadoop安装配置(2)_服务器_13

编辑结果显示如下:

Hadoop集群系列:Hadoop安装配置(2)_下一步_14

3)配置hdfs-site.xml文件

修改Hadoop中HDFS的配置,配置的备份方式默认为3。

<configuration>

<property>

<name>dfs.replication</name>

<value>1</value>

(备注:replication 是数据副本数量,默认为3,salve少于3台就会报错)

</property>

<configuration>

用下面命令进行编辑:

Hadoop集群系列:Hadoop安装配置(2)_用户登录_15

编辑结果显示如下:

Hadoop集群系列:Hadoop安装配置(2)_文件夹_16

4)配置mapred-site.xml文件

修改Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。

1.<configuration>
2.<property>
3.<name>mapred.job.tracker</name>
4.<value>http://192.168.1.2:9001</value>
5.</property>
6.</configuration>

用下面命令进行编辑:

Hadoop集群系列:Hadoop安装配置(2)_文件夹_17

编辑结果显示如下:

Hadoop集群系列:Hadoop安装配置(2)_命名_18


5)配置masters文件

有两种方案:

(1)第一种

修改localhost为Master.Hadoop

(2)第二种

去掉"localhost",加入Master机器的IP:192.168.1.2

为保险起见,启用第二种,因为万一忘记配置"/etc/hosts"局域网的DNS失效,这样就会出现意想不到的错误,但是一旦IP配对,网络畅通,就能通过IP找到相应主机。

用下面命令进行修改:

Hadoop集群系列:Hadoop安装配置(2)_文件夹_19

编辑结果显示如下:

Hadoop集群系列:Hadoop安装配置(2)_下一步_20

6)配置slaves文件(Master主机特有)

有两种方案:

(1)第一种

去掉"localhost",每行只添加一个主机名,把剩余的Slave主机名都填上。

例如:添加形式如下

Slave1.Hadoop

Slave2.Hadoop

Slave3.Hadoop

(2)第二种

去掉"localhost",加入集群中所有Slave机器的IP,也是每行一个。

例如:添加形式如下

192.168.1.3

192.168.1.4

192.168.1.5

原因和添加"masters"文件一样,选择第二种方式。

用下面命令进行修改:

Hadoop集群系列:Hadoop安装配置(2)_命名_21

编辑结果如下:

Hadoop集群系列:Hadoop安装配置(2)_服务器_22

现在在Master机器上的Hadoop配置就结束了,剩下的就是配置Slave机器上的Hadoop。

一种方式是按照上面的步骤,把Hadoop的安装包在用普通用户hadoop通过"scp"复制到其他机器的"/home/hadoop"目录下,然后根据实际情况进行安装配置,除了第6步,那是Master特有的。用下面命令格式进行。(备注:此时切换到普通用户hadoop)

scp ~/hadoop-1.0.0.tar.gz hadoop@服务器IP:~/

例如:从"Master.Hadoop"到"Slave1.Hadoop"复制Hadoop的安装包。

Hadoop集群系列:Hadoop安装配置(2)_服务器_23

另一种方式是将 Master上配置好的hadoop所在文件夹"/usr/hadoop"复制到所有的Slave的"/usr"目录下(实际上Slave机器上的slavers文件是不必要的, 复制了也没问题)。用下面命令格式进行。(备注:此时用户可以为hadoop也可以为root)

scp -r /usr/hadoop root@服务器IP:/usr/

例如:从"Master.Hadoop"到"Slave1.Hadoop"复制配置Hadoop的文件。

Hadoop集群系列:Hadoop安装配置(2)_用户登录_24

上图中以root用户进行复制,当然不管是用户root还是hadoop,虽然Master机器上的"/usr/hadoop"文件夹用户hadoop有权限,但是Slave1上的hadoop用户却没有"/usr"权限,所以没有创建文件夹的权限。所以无论是哪个用户进行拷贝,右面都是"root@机器IP"格式。因为我们只是建立起了hadoop用户的SSH无密码连接,所以用root进行"scp"时,扔提示让你输入"Slave1.Hadoop"服务器用户root的密码。

查看"Slave1.Hadoop"服务器的"/usr"目录下是否已经存在"hadoop"文件夹,确认已经复制成功。查看结果如下:

Hadoop集群系列:Hadoop安装配置(2)_文件夹_25

从上图中知道,hadoop文件夹确实已经复制了,但是我们发现hadoop权限是root,所以我们现在要给"Slave1.Hadoop"服务器上的用户hadoop添加对"/usr/hadoop"读权限。

以root用户登录"Slave1.Hadoop",执行下面命令。

chown -R hadoop:hadoop(用户名:用户组) hadoop(文件夹)

Hadoop集群系列:Hadoop安装配置(2)_用户登录_26

接着在"Slave1 .Hadoop"上修改"/etc/profile"文件(配置 java 环境变量的文件),将以下语句添加到末尾,并使其有效(source /etc/profile):

# set hadoop environment

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH :$HADOOP_HOME/bin

如果不知道怎么设置,可以查看前面"Master.Hadoop"机器的"/etc/profile"文件的配置,到此为此在一台Slave机器上的Hadoop配置就结束了。剩下的事儿就是照葫芦画瓢把剩余的几台Slave机器按照《从"Master.Hadoop"到"Slave1.Hadoop"复制Hadoop的安装包。》这个例子进行部署Hadoop。

4.3 启动及验证

1)格式化HDFS文件系统

在"Master.Hadoop"上使用普通用户hadoop进行操作。(备注:只需一次,下次启动不再需要格式化,只需start-all.sh)

hadoop namenode -format

某些书上和网上的某些资料中用下面命令执行。

Hadoop集群系列:Hadoop安装配置(2)_文件夹_27

我们在看好多文档包括有些书上,按照他们的hadoop环境变量进行配置后,并立即使其生效,但是执行发现没有找见"bin/hadoop"这个命令。

Hadoop集群系列:Hadoop安装配置(2)_文件夹_28

其实我们会发现我们的环境变量配置的是"$HADOOP_HOME/bin",我们已经把bin包含进入了,所以执行时,加上"bin"反而找不到该命令,除非我们的hadoop坏境变量如下设置。

# set hadoop path

export HADOOP_HOME=/usr/hadoop

export PATH=$PATH: $HADOOP_HOME :$HADOOP_HOME/bin

这样就能直接使用"bin/hadoop"也可以直接使用"hadoop",现在不管哪种情况,hadoop命令都能找见了。我们也没有必要重新在设置hadoop环境变量了,只需要记住执行Hadoop命令时不需要在前面加"bin"就可以了。


Hadoop集群系列:Hadoop安装配置(2)_命名_29

Hadoop集群系列:Hadoop安装配置(2)_文件夹_30

从上图中知道我们已经成功格式话了,但是美中不足就是出现了一个警告,从网上的得知这个警告并不影响hadoop执行,但是也有办法解决,详情看后面的"常见问题FAQ"。

2)启动hadoop

在启动前关闭集群中所有机器的防火墙,不然会出现datanode开后又自动关闭。

service iptables stop

使用下面命令启动。

start-all.sh

Hadoop集群系列:Hadoop安装配置(2)_用户登录_31

执行结果如下:

Hadoop集群系列:Hadoop安装配置(2)_命名_32


可以通过以下启动日志看出,首先启动namenode 接着启动datanode1,datanode2,…,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,tasktracker2,…。

启动 hadoop成功后,在 Master 中的 tmp 文件夹中生成了 dfs 文件夹,在Slave 中的 tmp 文件夹中均生成了 dfs 文件夹和 mapred 文件夹。

查看Master中"/usr/hadoop/tmp"文件夹内容

Hadoop集群系列:Hadoop安装配置(2)_文件夹_33

查看Slave1中"/usr/hadoop/tmp"文件夹内容。

Hadoop集群系列:Hadoop安装配置(2)_文件夹_34

3)验证hadoop

(1)验证方法一:用"jps"命令

在Master上用 java自带的小工具jps查看进程。

Hadoop集群系列:Hadoop安装配置(2)_用户登录_35


在Slave1上用jps查看进程。

Hadoop集群系列:Hadoop安装配置(2)_服务器_36

如果在查看Slave机器中发现"DataNode"和"TaskTracker"没有起来时,先查看一下日志的,如果是"namespaceID"不一致问题,采用"常见问题FAQ6.2"进行解决,如果是"No route to host"问题,采用"常见问题FAQ6.3"进行解决。

(2)验证方式二:用"hadoop dfsadmin-report"

用这个命令可以查看Hadoop集群的状态。

Master服务器的状态:

Hadoop集群系列:Hadoop安装配置(2)_用户登录_37

Slave服务器的状态

Hadoop集群系列:Hadoop安装配置(2)_用户登录_38


4.4 网页查看集群

1)访问"http:192.168.1.2:50030"

Hadoop集群系列:Hadoop安装配置(2)_文件夹_39

2)访问"http:192.168.1.2:50070"

Hadoop集群系列:Hadoop安装配置(2)_服务器_40

5、常见问题FAQ

5.1 关于 Warning: $HADOOP_HOME is deprecated.

hadoop 1.0.0版本,安装完之后敲入hadoop命令时,老是提示这个警告:

Warning: $HADOOP_HOME is deprecated.

经查hadoop-1.0.0/bin/hadoop脚本和"hadoop-config.sh"脚本,发现脚本中对HADOOP_HOME的环境变量设置做了判断,笔者的环境根本不需要设置HADOOP_HOME环境变量。

解决方案一:编辑"/etc/profile"文件,去掉HADOOP_HOME的变量设定,重新输入hadoop fs命令,警告消失。

解决方案二:编辑"/etc/profile"文件,添加一个环境变量,之后警告消失:

export HADOOP_HOME_WARN_SUPPRESS=1

解决方案三:编辑"hadoop-config.sh"文件,把下面的"if - fi"功能注释掉。

Hadoop集群系列:Hadoop安装配置(2)_下一步_41

我们这里本着不动Hadoop原配置文件的前提下,采用"方案二",在"/etc/profile"文件添加上面内容,并用命令"source /etc/profile"使之有效。

1)切换至root用户

Hadoop集群系列:Hadoop安装配置(2)_文件夹_42


2)添加内容

Hadoop集群系列:Hadoop安装配置(2)_文件夹_43

3)重新生效

Hadoop集群系列:Hadoop安装配置(2)_用户登录_44

5.2 解决"no datanode to stop"问题

当我停止Hadoop时发现如下信息:

Hadoop集群系列:Hadoop安装配置(2)_用户登录_45

原因:每次namenode format会重新创建一个namenodeId,而tmp/dfs/data下包含了上次format下的id,namenodeformat清空了namenode下的数据,但是没有清空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下的所有目录。

第一种解决方案如下:

1)先删除"/usr/hadoop/tmp"

rm -rf /usr/hadoop/tmp

2)创建"/usr/hadoop/tmp"文件夹

mkdir /usr/hadoop/tmp

3)删除"/tmp"下以"hadoop"开头文件

rm -rf /tmp/hadoop*

4)重新格式化hadoop

hadoop namenode -format

5)启动hadoop

start-all.sh

使用第一种方案,有种不好处就是原来集群上的重要数据全没有了。假如说Hadoop集群已经运行了一段时间。建议采用第二种。

第二种方案如下:

1)修改每个Slave的namespaceID使其与Master的namespaceID一致。

或者

2)修改Master的namespaceID使其与Slave的namespaceID一致。

该"namespaceID"位于"/usr/hadoop/tmp/dfs/data/current/VERSION"文件中,前面蓝色的可能根据实际情况变化,但后面红色是不变的。

例如:查看"Master"下的"VERSION"文件

Hadoop集群系列:Hadoop安装配置(2)_用户登录_46

本人建议采用第二种,这样方便快捷,而且还能防止误删。

5.3 Slave服务器中datanode启动后又自动关闭

查看日志发下如下错误。

ERROR org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException: Call to ... failed on local exception:java.net.NoRouteToHostException: No route to host

解决方案是:关闭防火墙

service iptables stop

5.4 从本地往hdfs文件系统上传文件

出现如下错误:

INFO hdfs.DFSClient: Exception in createBlockOutputStreamjava.io.IOException: Bad connect ack with firstBadLink

INFO hdfs.DFSClient: Abandoning blockblk_-1300529705803292651_37023

WARN hdfs.DFSClient: DataStreamer Exception:java.io.IOException: Unable to create new block.

解决方案是:

1)关闭防火墙

service iptables stop

2)禁用selinux

编辑 "/etc/selinux/config"文件,设置"SELINUX=disabled"

5.5 安全模式导致的错误

出现如下错误:

org.apache.hadoop.dfs.SafeModeException: Cannotdelete ..., Name node is in safe mode

在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。

解决方案是:关闭安全模式

hadoop dfsadmin -safemode leave

5.6 解决Exceeded MAX_FAILED_UNIQUE_FETCHES

出现错误如下:

Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES;bailing-out

程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了。

解决方案是:修改2个文件。

1)"/etc/security/limits.conf"

vim /etc/security/limits.conf

加上:

soft nofile 102400

hard nofile 409600

2)"/etc/pam.d/login"

vim /etc/pam.d/login

添加:

session required /lib/security/pam_limits.so

针对第一个问题我纠正下答案:

这是reduce预处理阶段shuffle时获取已完成的map的输出失败次数超过上限造成的,上限默认为5。引起此问题的方式可能会有很多种,比如网络连接不正常,连接超时,带宽较差以及端口阻塞等。通常框架内网络情况较好是不会出现此错误的。

5.7 解决"Too many fetch-failures"

出现这个问题主要是结点间的连通不够全面。

解决方案是:

1)检查"/etc/hosts"

要求本机ip 对应 服务器名

要求要包含所有的服务器ip +服务器名

2)检查".ssh/authorized_keys"

要求包含所有服务器(包括其自身)的public key

5.8 处理速度特别的慢

出现map很快,但是reduce很慢,而且反复出现"reduce=0%"。

解决方案如下:

结合解决方案5.7,然后修改"conf/hadoop-env.sh"中的"export HADOOP_HEAPSIZE=4000"

5.9解决hadoop OutOfMemoryError问题

出现这种异常,明显是jvm内存不够得原因。

解决方案如下:要修改所有的datanode的jvm内存大小。

Java –Xms 1024m -Xmx 4096m

一般jvm的最大内存使用应该为总内存大小的一半,我们使用的8G内存,所以设置为4096m,这一值可能依旧不是最优的值。

5.10 Namenode in safe mode

解决方案如下:

bin/hadoop dfsadmin -safemode leave

5.11 IO写操作出现问题

0-1246359584298, infoPort=50075, ipcPort=50020):Gotexception while serving blk_-5911099437886836280_1292 to /172.16.100.165:

java.net.SocketTimeoutException: 480000 millis timeoutwhile waiting for channel to be ready for write. ch :java.nio.channels.SocketChannel[connected local=/

172.16.100.165:50010 remote=/172.16.100.165:50930]

atorg.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185)

atorg.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159)

……

It seems there are many reasons that it can timeout, theexample given in HADOOP-3831 is a slow reading client.

解决方案如下:

在hadoop-site.xml中设置dfs.datanode.socket.write.timeout=0

5.12 status of 255 error

错误类型:

java.io.IOException: Task process exit with nonzerostatus of 255.

atorg.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:424)

错误原因:

Set mapred.jobtracker.retirejob.interval andmapred.userlog.retain.hours to higher value. By default, their values are 24hours. These might be the reason for failure, though I'm not sure restart.

解决方案如下:单个datanode

如果一个datanode 出现问题,解决之后需要重新加入cluster而不重启cluster,方法如下:

bin/hadoop-daemon.sh start datanode

bin/hadoop-daemon.sh start jobtracker

6、用到的Linux命令

6.1 chmod命令详解

使用权限:所有使用者

使用方式:chmod [-cfvR] [--help] [--version] modefile...

说明:

Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。

mode :权限设定字串,格式如下:[ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。

-c : 若该档案权限确实已经更改,才显示其更改动作

-f : 若该档案权限无法被更改也不要显示错误讯息

-v : 显示权限变更的详细资料

-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)

--help : 显示辅助说明

--version : 显示版本

范例:

将档案 file1.txt 设为所有人皆可读取

chmod ugo+r file1.txt

将档案 file1.txt 设为所有人皆可读取

chmod a+r file1.txt

将档案 file1.txt 与file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入

chmod ug+w,o-w file1.txt file2.txt

将 ex1.py 设定为只有该档案拥有者可以执行

chmod u+x ex1.py

将目前目录下的所有档案与子目录皆设为任何人可读取

chmod -R a+r *

此外chmod也可以用数字来表示权限如chmod 777 file

语法为:chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1

若要rwx属性则4+2+1=7;

若要rw-属性则4+2=6;

若要r-x属性则4+1=7。

范例:

chmod a=rwx file 和 chmod 777 file 效果相同

chmod ug=rwx,o=x file 和 chmod 771 file 效果相同

若用chmod 4755 filename可使此程式具有root的权限

6.2 chown命令详解

使用权限:root

使用方式:chown [-cfhvR] [--help] [--version]user[:group] file...

说明:

Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。

user : 新的档案拥有者的使用者

IDgroup : 新的档案拥有者的使用者群体(group)

-c : 若该档案拥有者确实已经更改,才显示其更改动作

-f : 若该档案拥有者无法被更改也不要显示错误讯息

-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案

-v : 显示拥有者变更的详细资料

-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)

--help : 显示辅助说明

--version : 显示版本

范例:

将档案 file1.txt 的拥有者设为users 群体的使用者 jessie

chown jessie:users file1.txt

将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport

chown -R lamport:users *

-rw------- (600) -- 只有属主有读写权限。

-rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。

-rwx------ (700) -- 只有属主有读、写、执行权限。

-rwxr-xr-x (755) -- 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。

-rwx--x--x (711) -- 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。

-rw-rw-rw- (666) -- 所有用户都有文件读、写权限。这种做法不可取。

-rwxrwxrwx (777) -- 所有用户都有读、写、执行权限。更不可取的做法。

以下是对目录的两个普通设定:

drwx------ (700) - 只有属主可在目录中读、写。

drwxr-xr-x (755) - 所有用户可读该目录,但只有属主才能改变目录中的内容

suid的代表数字是4,比如4755的结果是-rwsr-xr-x

sgid的代表数字是2,比如6755的结果是-rwsr-sr-x

sticky位代表数字是1,比如7755的结果是-rwsr-sr-t

6.3 scp命令详解

scp是 secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。

scp命令的用处:

scp在网络上不同的主机之间复制文件,它使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而安全的远程拷贝文件。

scp命令基本格式:

scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-iidentity_file]

[-l limit] [-o ssh_option] [-P port] [-S program]

[[user@]host1:]file1 [...] [[user@]host2:]file2

scp命令的参数说明:

-1    强制scp命令使用协议ssh1

-2    强制scp命令使用协议ssh2

-4    强制scp命令只使用IPv4寻址

-6    强制scp命令只使用IPv6寻址

-B    使用批处理模式(传输过程中不询问传输口令或短语)

-C    允许压缩。(将-C标志传递给ssh,从而打开压缩功能)

-p 保留原文件的修改时间,访问时间和访问权限。

-q    不显示传输进度条。

-r    递归复制整个目录。

-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

-c cipher    以cipher将数据传输进行加密,这个选项将直接传递给ssh。

-F ssh_config    指定一个替代的ssh配置文件,此参数直接传递给ssh。

-iidentity_file        从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。

-l limit    限定用户所能使用的带宽,以Kbit/s为单位。

-o ssh_option    如果习惯于使用ssh_config(5)中的参数传递方式,

-P port 注意是大写的P, port是指定数据传输用到的端口号

-S program    指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

scp命令的实际应用

1)从本地服务器复制到远程服务器

(1) 复制文件:

命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

第1,2个指定了用户名,命令执行后需要输入用户密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名

实例:

scp /home/linux/soft/scp.ziproot@www.mydomain.com:/home/linux/others/soft

scp /home/linux/soft/scp.ziproot@www.mydomain.com:/home/linux/others/soft/scp2.zip

scp /home/linux/soft/scp.zipwww.mydomain.com:/home/linux/others/soft

scp /home/linux/soft/scp.zipwww.mydomain.com:/home/linux/others/soft/scp2.zip

(2) 复制目录:

命令格式:

scp -r local_folderremote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要输入用户密码;

第2个没有指定用户名,命令执行后需要输入用户名和密码;

例子:

scp -r /home/linux/soft/root@www.mydomain.com:/home/linux/others/

scp -r /home/linux/soft/www.mydomain.com:/home/linux/others/

上面 命令 将 本地 soft 目录 复制 到 远程 others 目录下,即复制后远程服务器上会有/home/linux/others/soft/目录。

2)从远程服务器复制到本地服务器

从远程复制到本地的scp命令与上面的命令雷同,只要将从本地复制到远程的命令后面2个参数互换顺序就行了。

例如:

scp root@www.mydomain.com:/home/linux/soft/scp.zip/home/linux/others/scp.zip

scp www.mydomain.com:/home/linux/soft/ -r /home/linux/others/

linux系统下scp命令中很多参数都和ssh1有关,还需要看到更原汁原味的参数信息,可以运行man scp 看到更细致的英文说明。