设为首页 收藏本站
查看: 805|回复: 0

[经验分享] Hadoop之文件系统Shell

[复制链接]

尚未签到

发表于 2016-12-4 11:03:10 | 显示全部楼层 |阅读模式
  概述:

  文件系统(FS)Shell包含各种类-Shell的命令,直接和Hadoop分布式文件系统(HDFS)交互,也支持对其他文件系统的支持,例如:本地文件系统FS,HFTP FS,S3 FS,和其他。FS Shell的调用:

bin/hadoop fs <args>
  所有的FS shell命令都要带URI路径作为参数,URI的格式是:scheme://authority/path。如果是HDFS,则scheme是hdfs,如果是本地文件系统,则scheme是file。
  scheme和authorty是可选的,如果没有指定,默认的scheme是在配置文件中指定的。一个HDFS文件或目录如:/parent/child用HDFS表示,则是:hdfs://parent/child或者简单的写成/parent/child(但是前提条件是你配置文件指向的是hdfs://namenodehost)。
  大多数的FS shell命令,其实和linux是对应的。不同之处每个命令都有具体的描述,错误信息会通过错误输出stderr,其他信息通过stdout输出。
  如果使用hdfs,那么hdfs dfs和hadoop fs是类似的。

appendToFile
  使用: hadoop fs -appendToFile <localsrc> ... <dst>
  将一个本地文件系统的源文件或多个源文件追加到目标文件系统,也可以读取标准输入的数据,追加到目标文件系统。

    hadoop fs -appendToFile localfile /user/hadoop/hadoopfile 将本地文件localfile追加到目标文件系统/user/hadoop/hadoopfile
hadoop fs -appendToFile localfile1 localfile2 /user/hadoop/hadoopfile  将本地文件localfile1和2追加到目标文件系统/user/hadoop/hadoopfile
hadoop fs -appendToFile localfile hdfs://nn.example.com/hadoop/hadoopfile  将本地文件localfile追加到指定目标文件系统的/user/hadoop/hadoopfile
hadoop fs -appendToFile - hdfs://nn.example.com/hadoop/hadoopfile   从标准输入读取数据
  返回值:
  返回0则成功,1则失败。

cat
  使用: hadoop fs -cat URI [URI ...]
  将指定URI的内容用标准输出stdout输出。
  例子:

hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
  返回值:
  返回0则成功,1则失败。

checksum

使用: hadoop fs -checksum URI [URI ...]  返回文件的校验和信息。
  例子:


[iyunv@nn1 bin]# hadoop fs -checksum file:///usr/apache/hadoop-2.4.1/bin/1.txt file:///usr/apache/hadoop-2.4.1/bin/2.txt
file:///usr/apache/hadoop-2.4.1/bin/1.txtNONE
file:///usr/apache/hadoop-2.4.1/bin/2.txtNONE
[iyunv@nn1 bin]# hadoop fs -checksum hdfs://10.0.1.78:8020/test1 /apps/hive/install/hive-exec-0.13.1.jar
hdfs://10.0.1.78:8020/test1MD5-of-0MD5-of-512CRC32C0000020000000000000000008f708c9e4a4ec19d554a96c72b655932
/apps/hive/install/hive-exec-0.13.1.jarMD5-of-0MD5-of-512CRC32C00000200000000000000000060814965c82060d526756df03bf81383

chgrp
  使用: hadoop fs -chgrp [-R] GROUP URI [URI ...]
  改变文件组,这个用户必须是文件的拥有者,或者是超级管理员。
  参数


  • -R 如果文件是目录的话,命令将会递归生效。跟很多Linux的命令类似。

chmod
  使用: hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
  改变文件的的权限,这个用户必须是文件的拥有者,或者是超级管理员。
  参数


  • -R 如果文件是目录的话,命令将会递归生效。跟很多Linux的命令类似。

chown
  使用: hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
  改变文件的拥有者. 这个游湖
  Options


  • -R 如果文件是目录的话,命令将会递归生效。跟很多Linux的命令类似。

copyFromLocal
  使用: hadoop fs -copyFromLocal <localsrc> URI
  从本地文件系统考本到集群上,出了资源文件必须是本地文件之外,和put命令类似。

  参数:


  • -f  如果文件存在,则覆盖。

例子:
[iyunv@nn1 bin]# cat 1.txt
1111
[iyunv@nn1 bin]# cat 2.txt
22222222
[iyunv@nn1 bin]# hadoop fs -copyFromLocal 1.txt /fish/1.txt   //将本地文件拷贝到HDFS的文件/fish/1.txt
[iyunv@nn1 bin]# hadoop fs -cat /fish/1.txt  //查看
1111
[iyunv@nn1 bin]# hadoop fs -copyFromLocal -f 2.txt /fish/1.txt  //加-f参数覆盖HDFS的文件/fish/1.txt
[iyunv@nn1 bin]# hadoop fs -cat /fish/1.txt //查看,是文件2.txt的内容
22222222


copyToLocal
  使用: hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>
  将集群文件拷贝到本地文件系统。除了目标路径仅限于本地文件,和get命令类似。 -ignorecrc 选项复制CRC校验失败的文 件。使用-crc 选项复制文件以及CRC信息。
  


count
  使用: hadoop fs -count [-q] [-h] [-v] <paths>
  计算目录下文件和目录的数量,大小情况,使用-count的输出项有:DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME
  使用-count -q的输出项有: QUOTA, REMAINING_QUATA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME
  -h option shows sizes in human readable format.
  -v 多显示一个标题行(hadoop-2.4.1没有参数

[iyunv@nn1 bin]# hadoop fs -count -h
-count: Illegal option -h
Usage: hadoop fs [generic options] -count [-q] <path> ...例子:

  • hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
  • hadoop fs -count -q hdfs://nn1.example.com/file1
  • hadoop fs -count -q -h hdfs://nn1.example.com/file1
  • hdfs dfs -count -q -h -v hdfs://nn1.example.com/file1
  返回值:
  返回0则成功,-1则失败。
  


cp
  使用: hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest>
  从源文件拷贝到目标文件,这个命令允许多个源,目标路径必须是一个目录。


  参数:


  • -f  如果目标路径已经存在,则覆盖。
  • -p  该选择会保留文件的属性[topx] (timestamps(时间戳), ownership(所有权), permission(权限), ACL, XAttr)。 如果-p没有指定参数,那么就保存timestamps(时间戳), ownership(所有权), permission(权限)。如果指定了-pa,那么同时保留权限信息。因为ACL的等级要比permission(权限)更高级。-p选项决定了是否保留原始的namespace信息。
  例子:

//HDFS文件拷贝到本地文件系统
[iyunv@nn1 bin]# hadoop fs -cp /apps/tez-0.4.1/tez-api-0.4.1-incubating.jar file:///home
[iyunv@nn1 bin]# ll /home/
total 748
drwx------   2 azkaban hadoop   4096 Aug 21  2014 azkaban
drwx------. 11 hadoop  hadoop   4096 Jul 30 09:48 hadoop
drwxr-xr-x   4 root    root     4096 Jul 22 12:40 root
-rw-r--r--   1 root    root   752262 Aug  7 14:59 tez-api-0.4.1-incubating.jar
//HDFS文件拷贝到HDFS
[iyunv@nn1 bin]# hadoop fs -cp /apps/tez-0.4.1/tez-api-0.4.1-incubating.jar /fish/
[iyunv@nn1 bin]# hadoop fs -ls /fish/
Found 4 items
-rw-r--r--   3 root   supergroup        894 2015-08-07 12:31 /fish/3.txt
-rw-r--r--   3 fish   supergroup        193 2015-04-27 20:35 /fish/multi.txt
drwxr-xr-x   - hadoop supergroup          0 2015-04-28 10:32 /fish/out
-rw-r--r--   3 root   supergroup     752262 2015-08-07 15:00 /fish/tez-api-0.4.1-incubating.jar
//本地文件拷贝到本地文件系统
[iyunv@nn1 bin]# hadoop fs -cp file:///home/tez-api-0.4.1-incubating.jar file:///usr/
返回值:  返回0则成功,-1则失败。
  


df
  使用: hadoop fs -df [-h] URI [URI ...]
  显示空闲空间
  参数:


  • -h 用更人性化的方式展示文件的大小(例如,用67108864代替64M)
  例子:

[iyunv@nn1 bin]# hadoop fs -df -h /fish
Filesystem   Size     Used  Available  Use%
hdfs://nns  1.3 T  360.5 G    848.8 G   26%
//hdfs://nns文件系统,集群中总共有1.3T的空间,使用了360G,可以的还有848.8G,使用了百分之26%


du
  使用: hadoop fs -du [-s] [-h] URI [URI ...]
  显示文件和目录的大小,如果是目录则是该目录中所有文件的大小,如果是单个文件,则显示该文件的小大

参数:

  • -s 显示指定目录下所有文件整体的大小,而非逐个显示文件或目录的大小
  • -h 用更人性化的方式展示文件的大小(例如,用67108864代替64M)
  例子:


  • hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://nn.example.com/user/hadoop/dir1
  返回值:返回0则成功,-1则失败。

dus
  使用: hadoop fs -dus <args>
  显示一个文件长度的摘要.
  Note: 该命令已经过期,使用hadoop fs -du -s替代。

expunge
  使用: hadoop fs -expunge
  清空垃圾箱.

find
  (官方文档有,Hadoop2.4.1不存在这个命令)

  使用: hadoop fs -find <path> ... <expression> ...
  查找所有匹配指定表达式的文件,并且将选定的操作应用于它们。如果没有路径被指定,那么默认查找当前工作目录,如果没有指定表达式, 默认是:-print

例子:  hadoop fs -find / -name test -print
  返回值:返回0则成功,-1则失败。

get
  使用: hadoop fs -get [-ignorecrc] [-crc] <src> <localdst>
  拷贝文件到本地系统,使用通过“-ignorecrc”选项校验失败的文件,使用“-crc”选项,则可以拷贝文件和CRC信息。
  例子:


  • hadoop fs -get /user/hadoop/file localfile
  • hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile

返回0的成功和非零则错误。


getfacl
  使用: hadoop fs -getfacl [-R] <path>
  展示文件或目录的ACL(访问控制列表)信息。如果目录有默认的ACL,那么也会展示默认的ACL。
  参数:


  • -R: 递归的获取所有文件和目录的ACL

  • path: 文件或目录列表
  例子:


  • hadoop fs -getfacl /file
  • hadoop fs -getfacl -R /dir

返回0的成功和非零则错误。

setfacl
  使用: hadoop fs -setfacl [-R] [-b |-k -m |-x <acl_spec> <path>] |[--set <acl_spec> <path>]
  设置文件和目录的控制列表(ACLs)。
  参数:


  • -b: 删除所有扩展的acl信息,除了基本的acl信息(所有者,群组,其他)将被保留,以保证权限的兼容性;
  • -k: 删除默认的ACL
  • -R: 对所有文件或目录递归的应用这些操作。
  • -m: 修改ACL,新的条目加入到ACL,旧的规则会被保留;
  • -x: 删除指定的ACL条目。其他ACL条目保留。

  • --set: 完全取代现在的ACL规则,替换成新的ACL规则。新的ACL规则中必须包含用户、分组以及其他保证兼容性的权限信息;

  • acl_spec: 逗号分隔的ACL列表

  • path: 需要修改的文件或目录路径。

例子:

  • hadoop fs -setfacl -m user:hadoop:rw- /file
  • hadoop fs -setfacl -x user:hadoop /file
  • hadoop fs -setfacl -b /file
  • hadoop fs -setfacl -k /dir
  • hadoop fs -setfacl --set user::rw-,user:hadoop:rw-,group::r--,other::r-- /file
  • hadoop fs -setfacl -R -m user:hadoop:r-x /dir
  • hadoop fs -setfacl -m default:user:hadoop:r-x /dir

返回值: 返回0为成功,-1则失败。



getfattr
  (官方文档有,Hadoop2.4.1不存在这个命令)

  使用: hadoop fs -getfattr [-R] -n name | -d [-e en] <path>
  显示文件或目录的扩展属性的name和value(如果存在的话)。
  参数:


  • -R: 递归列出目录中所有文件和目录的属性。
  • -n name: 转储指定名称的扩展属性。
  • -d: 转储关联路径的所有扩展属性
  • -e encoding: 对检索出来的值进行编码。可用的编码方式(encoding)包括text、hex和base64。使用text的话,检索出的值已双引号括起来的字符串形式展现;使用hex或者base64的话,检索出的值分别以0x或者0s打头的编码形式展现。

  • path: 文件和目录。
  例子:


  • hadoop fs -getfattr -d /file
  • hadoop fs -getfattr -R -n user.myAttr /dir
  返回0的成功和非零则错误。

setfattr
  (官方文档有,Hadoop2.4.1不存在这个命令)

  使用: hadoop fs -setfattr -n name [-v value] | -x name <path>
  为文件或者目录设置一个扩展属性:name和value。
  参数:


  • -b: 删除所有扩展的acl信息,基本的acl信息(所有者,群组,其他)将被保留,以保证权限的兼容性;
  • -n name: 扩展的属性名称
  • -v value: 扩展的属性值. 对于值有三种不同的编码方式。如果参数是以双引号括起来的,那么这个值是字符串。如果参数是以0x或0X打头的,那么它是16进制的数字。如果参数是以0s或0S打头的,那么它的编码方式是base64。
  • -x name: 删除扩展的属性

  • path: 文件或者目录
  例子:


  • hadoop fs -setfattr -n user.myAttr -v myValue /file
  • hadoop fs -setfattr -n user.noValue /file
  • hadoop fs -setfattr -x user.myAttr /file

返回值: 返回0为成功,-1则失败

getmerge
  使用: hadoop fs -getmerge <src> <localdst> [addnl]
  以一个源目录和一个本地目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于在每个文件结尾添加一个换行符。


//将HDFS的/fish文件夹的文件,合并到本地/home/4.txt文件。
hadoop fs -getmerge /fish fish:///home/4.txt




help
  使用: hadoop fs -help
  返回使用说明



ls
  使用: hadoop fs -ls [-d] [-h] [-R] [-t] [-S] [-r] [-u] <args>
  参数:


  • -d: 像普通文件一样列出来。
  • -h: 用更直观的方式显示文件大小 (例如 64.0m 替代 67108864).
  • -R: 递归子目录列表。
  • -t: 按修改时间排序(最近一次排第一)
  • -S: 按输出的文件大小排序
  • -r: 反向排序
  • -u: 使用访问时间而不是显示和排序的时间。
  ls命令会返回一下文件的状态:

permissions(权限) number_of_replicas(副本数量) userid(用户ID) groupid(分组ID) filesize(文件大小) modification_date(修改日期) modification_time(修改时间) filename(文件名)




  对于目录,ls会返回目录中的第一级内容,显示格式如下

permissions(权限) userid(用户ID) groupid(分组ID) modification_date(修改日期) modification_time(修改时间) dirname(目录名称)




  目录中的文件默认以文件名称排序
  例子:


  • hadoop fs -ls /user/hadoop/file1

返回值: 返回0为成功,-1则失败


lsr
  使用: hadoop fs -lsr <args>
  ls命令的递归版本
  注意: 这个耳鸣了是过期的,可以用hadoop fs -ls -R



mkdir
  使用: hadoop fs -mkdir [-p] <paths>
  以URI作为路径,创建目录。

  参数:


  • -p 和Linux的mkdir -p类似,如果父路径不存在,会创建父路径。
  例子:

[iyunv@nn1 bin]# hadoop fs -mkdir file:///home/a1 file:///home/a2
[iyunv@nn1 bin]# ll /home/
total 20
drwxr-xr-x   2 root    root   4096 Aug  8 09:45 a1
drwxr-xr-x   2 root    root   4096 Aug  8 09:45 a2
[iyunv@nn1 bin]# hadoop fs -mkdir /home/a1 /home/a2
[iyunv@nn1 bin]# hadoop fs -ls /home/
Found 2 items
drwxr-xr-x - root supergroup 0 2015-08-08 09:47 /home/a1
drwxr-xr-x - root supergroup 0 2015-08-08 09:47 /home/a2


返回值: 返回0为成功,-1则失败


moveFromLocal
  使用: hadoop fs -moveFromLocal <localsrc> <dst>
  除了本地路径在被拷贝后会被删除。其他类似于put命令



moveToLocal

使用: hadoop fs -moveToLocal [-crc] <src> <dst>  目前为止还未实现。



mv
  使用: hadoop fs -mv URI [URI ...] <dest>
  将文件从源路径移动到目标路径(文件和目录都可以移动),这个命令允许多个源,但是目标路径必须是一个目录,跨文件系统的移动文件是不允许的。
  例子:


  • hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -mv hdfs://nn.example.com/file1 hdfs://nn.example.com/file2 hdfs://nn.example.com/file3 hdfs://nn.example.com/dir1

返回值: 返回0为成功,-1则失败


put
  使用: hadoop fs -put <localsrc> ... <dst>
  从本地文件系统拷贝单个源,或者多个源到目标文件系统,也可以从标准输入写入到目标文件系统。


  • hadoop fs -put localfile /user/hadoop/hadoopfile
  • hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
  • hadoop fs -put localfile hdfs://nn.example.com/hadoop/hadoopfile

  • hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.

返回值: 返回0为成功,-1则失败


rm
  使用: hadoop fs -rm [-f] [-r |-R] [-skipTrash] URI [URI ...]
  删除参数指定的文件。
  参数:


  • -f 强行删除。执行删除时显示对要删除的文件的分析信息,当文件不存在的时候也不会调整返回信息;
  • -R 递归的删除目录下面的所有内容
  • -r 和-R一样
  • -skipTrash 该参数会忽略回收站,如果启用,则彻底的删除,目录规模超大的时候这个选项是很有用的。如果没有用这个参数,删除的文件会在回收站中找到。
  例子:


  • hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir

返回值: 返回0为成功,-1则失败


rmdir
  使用: hadoop fs -rmdir [--ignore-fail-on-non-empty] URI [URI ...]
  删除目录
  参数:



  • --ignore-fail-on-non-empty: 当使用通配符的时候,如果一个目录还包含文件,将不会删除失败。
  例子:


  • hadoop fs -rmdir /user/hadoop/emptydir



rmr

使用:hadoop fs -rmr [-skipTrash] URI [URI ...]  递归删除
  注意:这个命令是过期的,可以使用fs -rm -r命令代替。



setrep
  使用: hadoop fs -setrep [-R] [-w] <numReplicas> <path>
  改变某个文件的复制因子,如果path是一个路径,那么这个命令就递归的修改所有文件的复制因子

  

  参数:


  • -w 使用这个参数,命令会等待复制因子修改完成,这可能需要很长时间。
  • -R 向后兼容,没有实际效果。
  例子:

[iyunv@nn1 bin]# hadoop fs -stat "%b %F %u:%g %o %y %n %r" /fish/1.txt
14 regular file root:supergroup 134217728 2015-08-07 07:50:15 1.txt 3  //开始的副本数是3
[iyunv@nn1 bin]# hadoop fs -setrep -w 4 /fish/1.txt  //修改副本数为4
Replication 4 set: /fish/1.txt
Waiting for /fish/1.txt ....................................................................................................................................................................................................................................................................................................................................................setrep: `/fish/1.txt': No such file or directory
[iyunv@nn1 bin]# hadoop fs -stat "%b %F %u:%g %o %y %n %r" /fish/1.txt<pre name="code" class="java">14 regular file root:supergroup 134217728 2015-08-07 07:50:15 1.txt 4  //结束的副本数为4



返回值: 返回0为成功,-1则失败


stat
  使用: hadoop fs -stat [format] <path> ...
  根据文件/目录打印出指定格式的统计信息。接受的格式:所有块文件大小(%b),类型(%F),所属分组(%g),名称(%n),块大小(%o),副本数量(%r),所属用户名(%u),和修改时间(%y,%Y),%y展示“yyyy-MM-dd HH:mm:ss”格式的UTC时间,%Y则显示1970年到现在的毫秒数。如果没有指定日期格式,默认则为%y
  例子:


  • hadoop fs -stat "%F %u:%g %b %y %n" /file
  返回值: 返回0为成功,-1则失败



tail
  使用: hadoop fs -tail [-f] URI
  标准输出中,显示文件末尾的1K的内容

参数:

  • -f 文件增长时,输出真假的内容。
  例子:


  • hadoop fs -tail pathname
  返回值: 返回0为成功,-1则失败



test
  使用: hadoop fs -test -[defsz] URI

参数

  • -d: 如果是路径是目录,则返回0,
  • -e: 如果路径存在,则返回0.
  • -f: 如果路径是文件,则返回0.
  • -s: 如果路径不为空,返回0
  • -z: 如果文件长度为0,则返回0
  例子:


  • hadoop fs -test -e filename



text
  使用: hadoop fs -text <src>
  将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。




touchz
  使用: hadoop fs -touchz URI [URI ...]
  创建一个长度为0的文件。
  例子:


  • hadoop fs -touchz pathname
  返回值: 返回0为成功,-1则失败



usage
  Usage: hadoop fs -usage command
  返回单个命令的帮助。
  例子:hadoop fs -usage du

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-309493-1-1.html 上篇帖子: hadoop pig vertica 下篇帖子: 【Hadoop六】基于Yarn的Hadoop Map Reduce工作流程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表