• Hadoop学习之环境搭建和解决方案


    2013.10.11~

    准备条件:

    HADOOP稳定版本1.2.1

    java版本jdk-7u40-linux-i586.tar

    CENTOS版本6.4

    VMware workstation

    需要用到的工具:

    SecureCRT和FlashFXP

    时常更新和备份配置,这个很重要,因为软件是通过ssh实现的,如果之前使用过后,改主机名或者更改ip,它之前的配置信息会妨碍你的连接,直到你非常的蛋疼认为究竟是防火墙的问题呢还是防火墙的问题呢?

     

    用虚拟机VMware装机

    (一把辛酸泪啊,哭穷,只有一台电脑做虚拟机做实验,为了节省我可怜的内存和硬盘所以只好一台简化桌面centos,一台简化指令centos,别人上传的方法都是四五个实机做实验,辛酸啊)

    硬盘方案我提倡个人分配,主机名一定要提前弄好不要变,不然很多信息会更改,后期让你想不坑都不行,例如ssh联机或者hadoop 格式化,都是非常操蛋的,配置要一样之外,参数最好还要用主机名,不要用IP

    /boot:用来存放与Linux系统启动有关的程序,比如启动引导装载程序等,建议大小为100MB。

    /usr:用来存放Linux系统中的应用程序,其相关数据较多,建议大于3GB以上。

    /var:用来存放Linux系统中经常变化的数据以及日志文件,建议大于1GB以上。

    /home:存放普通用户的数据,是普通用户的宿主目录,建议大小为剩下的空间。

    /:Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为5GB以上。

    /tmp:将临时盘在独立的分区,可避免在文件系统被塞满时影响到系统的稳定性。建议大小为500MB以上。

    swap:实现虚拟内存,建议大小是物理内存的1~2倍。

    建立一般用户,用一般用户来应付日常的系统操作。

    useradd hadoop

    passwd  hao123

     

    配置集群hosts

    vim /etc/hosts

    192.168.1.200 Master

    192.168.1.202 Slave1

    ping测试

    *可以修改主机配置信息

    hostname

    vim /etc/sysconfig/network

    cat /proc/net/dev       查看目前使用的网络端口是哪一个

    vim /etc/sysconfig/network-scripts/ifcfg-eth0

     

    vim /etc/sysconfig/network-scripts/ifcgf-eth0

    service network restart

     

    setenforce 0

    getenforce

    vim /etc/sysconfig/selinux

    SELINUX=disabled 

     

    安装VSFTP服务器

    yum -y install vsftpd

    touch /var/log/vsftpd.log

    chkconfig vsftpd on

    chkconfig --list | grep vsftpd

    service vsftpd restart

     

     

     

    vim /etc/vsftpd/vsftpd.conf

    修改以下内容(去掉注释)

    anonymous_enable=YES --> anonymous_enable=NO //不允许匿名用户访问,默认是允许

    xferlog_file=/var/log/vsftpd.log #设定vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来

    #idle_session_timeout=600 --> idle_session_timeout=600 //会话超时,客户端连接到ftp但未操作,默认被注释掉,可根据个人情况修改

    #async_abor_enable=YES --> async_abor_enable=YES //支持异步传输功能,默认是注释掉的,去掉注释

    #ascii_upload_enable=YES --> ascii_upload_enable=YES //支持ASCII模式的下载功能,默认是注释掉的,去掉注释

    #ascii_download_enable=YES --> ascii_download_enable=YES //支持ASCII模式的上传功能,默认是注释掉的,去掉注释

    #ftpd_banner=Welcome to blah FTP service //FTP的登录欢迎语,本身是被注释掉的,去不去都行

    #chroot_local_user=YES --> chroot_local_user=YES

    //禁止本地用户登出自己的FTP主目录,本身被注释掉,去掉注释

     下面几个都是已经去掉的,只是写出来,明白其用意。

    local_enable=YES //允许本地用户访问,默认就是YES,不用改

    write_enable=YES //允许写入,默认是YES,不用改

    local_umask=022 //上传后文件的权限掩码,不用改

    dirmessage_enable=YES //开启目录标语,默认是YES,开不开无所谓,我是默认就行

    xferlog_enable=YES //开启日志,默认是YES,不用改

    connect_from_port_20=YES //设定连接端口20

    xferlog_std_format=YES //设定vsftpd的服务日志保存路径,不用改

    pam_service_name=vsftpd //设定pam服务下vsftpdd的验证配置文件名,不用改

    userlist_enable=YES //拒绝登录用户名单,不用改

    TCP_wrappers=YES //限制主机对VSFTP服务器的访问,不用改(通过/etc/hosts.deny和/etc/hosts.allow这两个文件来配置)

    按照上面修改完之后,按键盘"Esc"退出编辑,再按":",并在后面输入"wq",进行保存并退出。

     

     

    查看与管理ftp服务:

    启动ftp服务:service vsftpd start

    查看ftp服务状态:service vsftpd status

    重启ftp服务:service vsftpd restart

    关闭ftp服务:service vsftpd stop

     

     

     

     

    配置iptables防火墙

    service iptables status

    vim /etc/sysconfig/iptables

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

     

    设置selinux中ftp端口问题

    getsebool -a | grep ftp

    setsebool -P ftp_home_dir 1

    setsebool -P allow_ftpd_full_access 1

    service vsftpd restart

    service iptables restart

     

     

    搭建SSH服务器

    rpm –qa | grep openssh

    rpm –qa | grep rsync

    yum install ssh 
    yum install rsync

    service sshd restart

    一般用户下

    mkdir .ssh

    chmod 700 .ssh

    vim /etc/ssh/sshd_config

    Protocol 2 # 使用SSH2协议

    RSAAuthentication yes # 启用 RSA 认证

    PubkeyAuthentication yes # 启用公钥私钥配对认证方式

    AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

    PasswordAuthentication no # 禁止密码验证登陆(根据需要,不过一般启用了密钥,就不用密码了)

     

    Master下

    ssh-keygen -t rsa -P ''

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

    chmod 600 ~/.ssh/authorized_keys

    service sshd restart

    ssh localhost

    scp ~/.ssh/id_rsa.pub hadoop@192.168.1.3:~/

     

    Slave下

    mkdir ~/.ssh

    chmod 700 ~/.ssh

    cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

    chmod 600 ~/.ssh/authorized_keys

    vim /etc/ssh/sshd_config

    RSAAuthentication yes # 启用 RSA 认证

    PubkeyAuthentication yes # 启用公钥私钥配对认证方式

    AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

    service sshd restart

    rm -r id_rsa.pub

    测试Master到Slave1

    !建立Master和每个Slave之间的ssh连接,slave和slave之间是不用的!

     

     

     

    ssh失败解决方案

    清除/.ssh/known_hosts

    修改/etc/ssh/sshd-config文件,将其中的PermitRootLogin no修改为yes,PubkeyAuthentication yes修改为no,AuthorizedKeysFile .ssh/authorized_keys前面加上#屏蔽掉,PasswordAuthentication no修改为yes就可以了。

     

     

     

     

    通过FTP软件将软件Jdk和Hadoop稳定版本送到Master一般用户目录

     

    root用户下

    安装JDK

    mkdir /usr/java

    cp /home/hadoop/jdk-7u40-linux-i586.tar.gz /usr/java

    chmod +x jdk-7u40-linux-i586.tar.gz

    tar -zxvf jdk-7u40-linux-i586.tar.gz

    rm jdk-7u40-linux-i586.tar.gz

    vim /etc/profile

    # set java environment

    export JAVA_HOME=/usr/java/jdk1.7.0_40/

    export JRE_HOME=/usr/java/jdk1.7.0_40/jre

    export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

    export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

    source /etc/profile

    java -version

    scp ~/home/hadoop/jdk-7u40-linux-i586.tar.gz hadoop@192.168.1.3:~/

     

    hadoop下 

    安装HADOOP

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

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

    chmod +x hadoop-1.2.1.tar.gz

    tar -zxvf hadoop-1.2.1.tar.gz 

     mv hadoop-1.2.1 hadoop

    chown -R hadoop:hadoop hadoop 

    rm –rf hadoop-1.2.1.tar.gz 

    vim /etc/profile

    # set hadoop path

    export HADOOP_HOME_WARN_SUPPRESS=1

    export HADOOP_HOME=/usr/hadoop

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

    export CLASSPATH=$CLASSPATH:$HADOOP_HOME/hadoop-core-1.2.1.jar

    source /etc/profile

    hadoop version

    mkdir /usr/hadoop/tmp

     以下hadoop有三个模式可以测试,建议如果学习,可以一个一个试,然后“还原”,因为本人现在学习不够深入,除了知道缓存路径tmp文件,log文件之外,其余的缓存路径并不是很清楚。而且每一个的测试貌似都会产生一些缓存文件,对全分布式的搭建貌似有影响,所以,不推荐大家一个一个的去试,然后再搭建全分布式。我是尝试了多次后,一次性全分布式搭建成功的,前边的几次都是惨不忍睹啊,什么情况都有

    测试本地模式

    cd /usr/hadoop/conf

    vim hadoop-env.sh

    export JAVA_HOME=/usr/java/jdk1.7.0_40/

     

    cd usr/hadoop

    mkdir input 

    cp conf/*.xml input 

    hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 

    cat output/*

     

    vim core-site.xml

    <configuration>

         <property>

             <name>fs.default.name</name>

             <value>hdfs://Master:9000</value>

         </property>

    </configuration>

     

    vim hdfs-site.xml

    <configuration>

         <property>

             <name>dfs.replication</name>

             <value>1</value>

         </property>

    </configuration>

     

    vim mapred-site.xml

    <configuration>

         <property>

             <name>mapred.job.tracker</name>

             <value>localhost:9001</value>

         </property>

    </configuration>

     

    测试伪分布式模式

    hadoop namenode -format

    start-all.sh

    NameNode - http://localhost:50070/
    JobTracker - http://localhost:50030/

    cd /usr/hadoop/

    hadoop fs -put conf input

    hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'

    hadoop fs -cat output/*

    stop-all.sh

     

    分布式模式Cluster Setup

     

    要在Master创建 /home/dev/hdfs/name 目录,在 slaves上创建 /home/dev/hdfs/data 目录,并chmod g-w /home/dev/hdfs/data(权限不对的话datanode无法启动)

    Master:  touch /home/dev/hdfs/name

    Slaves:   /home/dev/hdfs/data

    chmod g-w /home/dev/hdfs/data

     

    Master:

    cat masters:

    Master

    cat slaves:

    Slave1

    Slave2

     

    conf/hadoop-env.sh

    export JAVA_HOME=/usr/java/jdk1.7.0_40/

     

    conf/core-site.xml:

    <configuration>

    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/hadoop/tmp</value>
    <description>A base for other temporary directories.</description>
    </property>

    <property>

            <name>fs.default.name</name>

            <value>hdfs://Master:9000</value>

        </property>

    </configuration>

    conf/hdfs-site.xml:

    <configuration>

    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>

         <property>

             <name>dfs.name.dir</name>

             <value>/home/dev/hdfs/name</value>

         </property>

         <property>

             <name>dfs.data.dir</name>

             <value>/home/dev/hdfs/data</value>

         </property>

    </configuration>

     

    conf/mapred-site.xml:

    <configuration>

        <property>

            <name>mapred.job.tracker</name>

            <value>Master:9001</value>

        </property>

     

    </configuration>

    scp -r /usr/hadoop root@Slave1.Hadoop:/usr/

    scp -r /usr/hadoop root@Slave2.Hadoop:/usr/

    scp -r /usr/hadoop root@Slave3.Hadoop:/usr/

     

    Slave1.Hadoop@chown -R hadoop:hadoop hadoop

    Slave2.Hadoop@chown -R hadoop:hadoop hadoop


    Slave3.Hadoop@chown -R hadoop:hadoop hadoop

    vim /etc/profile

    # set hadoop path

    export HADOOP_HOME_WARN_SUPPRESS=1

    export HADOOP_HOME=/usr/hadoop

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

    export CLASSPATH=$CLASSPATH:$HADOOP_HOME/hadoop-core-1.2.1.jar

    source /etc/profile

    hadoop version

    启动及验证hadoop
    1)、格式化hdfs文件系统

    Master.Hadoop@hadoop namenode -format

    2)、启动hadoop

    opping secondarynamenode
    [root@Master ~]# start-all.sh 
    Warning: $HADOOP_HOME is deprecated.

    验证Hadoop
    1)、jps验证

    @jps
    9176 NameNode
    9563 Jps
    9323 SecondaryNameNode
    9403 JobTracker

    2)、hadoop dfsadmin -report 验证

    hadoop dfsadmin -report
    Warning: $HADOOP_HOME is deprecated.


    Configured Capacity: 56238575616 (52.38 GB)
    Present Capacity: 43917987840 (40.9 GB)
    DFS Remaining: 43917864960 (40.9 GB)
    DFS Used: 122880 (120 KB)
    DFS Used%: 0%
    Under replicated blocks: 0
    Blocks with corrupt replicas: 0
    Missing blocks: 0


    -------------------------------------------------
    Datanodes available: 3 (3 total, 0 dead)


    Name: 192.168.1.101:50010
    Decommission Status : Normal
    Configured Capacity: 18746191872 (17.46 GB)
    DFS Used: 40960 (40 KB)
    Non DFS Used: 4097277952 (3.82 GB)
    DFS Remaining: 14648872960(13.64 GB)
    DFS Used%: 0%
    DFS Remaining%: 78.14%
    Last contact: Tue Sep 17 03:43:40 PDT 2013

     


    Name: 192.168.1.100:50010
    Decommission Status : Normal
    Configured Capacity: 18746191872 (17.46 GB)
    DFS Used: 40945 (39.99 KB)
    Non DFS Used: 4109647887 (3.83 GB)
    DFS Remaining: 14636503040(13.63 GB)
    DFS Used%: 0%
    DFS Remaining%: 78.08%
    Last contact: Tue Sep 17 03:43:38 PDT 2013

     


    Name: 192.168.1.103:50010
    Decommission Status : Normal
    Configured Capacity: 18746191872 (17.46 GB)
    DFS Used: 40975 (40.01 KB)
    Non DFS Used: 4113661937 (3.83 GB)
    DFS Remaining: 14632488960(13.63 GB)
    DFS Used%: 0%
    DFS Remaining%: 78.06%
    Last contact: Tue Sep 17 03:43:40 PDT 2013

    11、停止hadoop
    stop-all.sh 
    Warning: $HADOOP_HOME is deprecated.
    stopping jobtracker
    192.168.1.103: stopping tasktracker
    192.168.1.101: stopping tasktracker
    192.168.1.100: stopping tasktracker
    stopping namenode
    192.168.1.101: no datanode to stop
    192.168.1.103: stopping datanode
    192.168.1.100: no datanode to stop
    192.168.1.102: stopping secondarynamenode


    12)网页验证
    1)、访问http://192.168.1.102:50030

    2)、http://192.168.1.102:50070

    13)、站在象杯上说hello

    mkdir input

    cd input

    echo "hello world">test1.txt

    echo "hello  hadoop">test2.txt


    cd ..

    hadoop dfs -put input in

     


    hadoop jar hadoop-1.2.1-examples.jar wordcount in out

    hadoop jar  hadoop-examples-1.2.1.jar wordcount in out

     

    hadoop dfs -cat out/*

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    常见问题

    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原配置文件的前提下,采用"方案二",在"/etc/profile"文件添加上面内容,并用命令"source /etc/profile"使之有效。

      1)切换至root用户

     

      2)添加内容

     

      3)重新生效

     

    5.2 解决"no datanode to stop"问题

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

     

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

    第一种解决方案如下:

    stop-all.sh

     

      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:///tmp 

           hadoop  fs -rmr /tmp

        二、停止 hadoop   

           stop-all.sh

        三、删除/tmp/hadoop*

           rm -rf /tmp/hadoop*

        四、格式化hadoop

           hadoop namenode -format

        五、启动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"文件

     

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

    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 createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink

      INFO hdfs.DFSClient: Abandoning block blk_-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: Cannot delete ..., 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):Got exception while serving blk_-5911099437886836280_1292 to /172.16.100.165: 

      java.net.SocketTimeoutException: 480000 millis timeout while 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] 

      at org.apache.hadoop.net.SocketIOWithTimeout.waitForIO(SocketIOWithTimeout.java:185) 

      at org.apache.hadoop.net.SocketOutputStream.waitForWritable(SocketOutputStream.java:159) 

      …… 

      It seems there are many reasons that it can timeout, the example 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 nonzero status of 255.

      at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:424)

      错误原因:

      Set mapred.jobtracker.retirejob.interval and mapred.userlog.retain.hours to higher value. By default, their values are 24 hours. 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] mode file...

      说明:

      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] [-i identity_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。

    -i identity_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.zip root@www.mydomain.com:/home/linux/others/soft

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

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

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

      (2) 复制目录:

      命令格式:

    scp -r local_folder remote_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 看到更细致的英文说明。

     

     

     

     

     

     

     

    1

  • 相关阅读:
    修改NavigationBarItem的字体大小和颜色的使用方法
    iOS 大文件断点下载
    iOS 文件下载
    UITableView优化
    iOS 应用的生命周期
    iOS RunLoop简介
    iOS 线程间的通信 (GCD)
    iOS 多线程GCD的基本使用
    iOS 多线程GCD简介
    CSS--复习之旅(一)
  • 原文地址:https://www.cnblogs.com/waterfox/p/3397379.html
Copyright © 2020-2023  润新知