centos6.3配置MFS服务器

前端之家收集整理的这篇文章主要介绍了centos6.3配置MFS服务器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、简介

MooseFS(Moose File System,mfs)是一种分布式文件系统,它将数据分布在网络中的不同服务器上,支持FUSE(用户空间文件系统Filesystem in Userspace,简称FUSE),客户端挂载后可以作为一个 普通的Unix 文件系统使用MooseFS。
MooseFS中共有四种角色:主控服务器master server、主控备份服务器Metalogger server、存储块服务器chunkserver、客户端主机client。

主控服务器负责各个存储服务器的管理、文件读写调度、文件空间回收以及恢复、多节点拷贝。
主控备份服务器负责备份主控服务器的元数据、变化日志文件文件类型为changelog_ml.*.mfs,以便在主控服务器出问题的时候可以恢复。
存储块服务器负责提供存储空间,并为客户提供数据传输。
客户端则通过fuse挂接主控服务器上所管理的存储块服务器,可以像操作本地文件一样操作MooseFS文件系统中的文件

二、NFS和MFS比较

1、NFS的缺陷

NFS虽然使用简单,但当NFS客户端访问量大时,通过NFS方式共享一个服务器的存储空间,使得NFS服务器不堪重负,并且执行读写都比较频繁的操作会出现意外的错误,对于高可靠的集群部署是有挑战的。
这种架构除了性能问题外还存在单点故障,一旦这个NFS服务器发生故障,所有靠共享提供数据的应用就不再可用,尽管用rsync方式同步数据到另外一个服务器上做nfs服务的备份,但这对提高整个系统的性能毫无帮助。

2、MFS

分布式文件系统服务器之间的数据访问不再是一对多的关系(1个NFS服务器,多个NFS客户端),而是多对多的关系,这样一来,性能大幅提升毫无问题。moosefs分布式文件系统,实施起来简单、不停止服务扩容、恢复服务容易,因为作为共享存储服务器是个不错的选择。
MooseFS读写流程图:



MFS的官方网站:http://www.moosefs.org/download.html

上面有详细的MFS简介和MooseFS分布式文件系统安装向导以及MFS。

三、详解

1、获得二进制包

先将mfs-1.6.25-1.tar.gz重命名mfs-1.6.25.tar.gz

#yum install fuse-devel pkgconfig zlib-devel //build源码包需要的依赖

#rpmbuild -ta mfs-1.6.25.tar.gz

生成6个rpm二进制安装包(其中debuginfo调试时使用):


也可以通过tar zxvf mfs-1.6.25-1.tar.gz解压,使用./configure、make、make install安装(具体参考安装向导)。

2、主控服务器master server

(1)安装

#rpm -ivh mfs-master-1.6.25-1.x86_64.rpm //安装

#rpm -ql mfs-master //查询安装的文件路径,可以查看所有的安装文件,便于修改

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. /etc/mfsexports.cfg.dist

  2. /etc/mfsmaster.cfg.dist

  3. /etc/mfstopology.cfg.dist

  4. /usr/sbin/mfsmaster

  5. /usr/sbin/mfsMetadump

  6. /usr/sbin/mfsMetarestore

  7. /usr/share/doc/mfs-master-1.6.25

  8. /usr/share/doc/mfs-master-1.6.25/NEWS

  9. /usr/share/doc/mfs-master-1.6.25/README

  10. /usr/share/doc/mfs-master-1.6.25/UPGRADE

  11. /usr/share/man/man5/mfsexports.cfg.5.gz

  12. /usr/share/man/man5/mfsmaster.cfg.5.gz

  13. /usr/share/man/man5/mfstopology.cfg.5.gz

  14. /usr/share/man/man7/mfs.7.gz

  15. /usr/share/man/man7/moosefs.7.gz

  16. /usr/share/man/man8/mfsmaster.8.gz

  17. /usr/share/man/man8/mfsMetarestore.8.gz

  18. /var/lib/mfs

  19. /var/lib/mfs/Metadata.mfs.empty

save_snippets.png

/etc/mfsexports.cfg.dist
/etc/mfsmaster.cfg.dist
/etc/mfstopology.cfg.dist
/usr/sbin/mfsmaster
/usr/sbin/mfsMetadump
/usr/sbin/mfsMetarestore
/usr/share/doc/mfs-master-1.6.25
/usr/share/doc/mfs-master-1.6.25/NEWS
/usr/share/doc/mfs-master-1.6.25/README
/usr/share/doc/mfs-master-1.6.25/UPGRADE
/usr/share/man/man5/mfsexports.cfg.5.gz
/usr/share/man/man5/mfsmaster.cfg.5.gz
/usr/share/man/man5/mfstopology.cfg.5.gz
/usr/share/man/man7/mfs.7.gz
/usr/share/man/man7/moosefs.7.gz
/usr/share/man/man8/mfsmaster.8.gz
/usr/share/man/man8/mfsMetarestore.8.gz
/var/lib/mfs
/var/lib/mfs/Metadata.mfs.empty@H_301_264@ 


(2)复制样例文件,以得到 master 所需的配置文件

#cp mfsmaster.cfg.dist mfsmaster.cfg
#cp mfstopology.cfg.dist mfstopology.cfg
#cp mfsexports.cfg.dist mfsexports.cfg

如果我们打算更改这些配置文件中的某些项目的值,则需要打开特定配置文件相关文本行前的注释然后修改跟随其后的值。因为被注释掉的行,即是 MooseFS 内置的缺省值。

Mfsmaster.cfg 配置文件包含主控服务器 master 相关的设置,想查看配置文件更多信息使用命令 man mfsmaster.cfg。

mfsexports.cfg 指定那些客户端主机可以远程挂接 MooseFS 文件系统,以及授予挂接客户端什么样的访问权限。例如指定只有 192.168.40.x 网段的主机可以以读写模式访问 MooseFS 的整个共享结构资源(/),在配置文件 mfsexports.cfg 文件的第二行改为或添加

(注:可以挂在根/目录下的子目录,配置文件加上192.168.40.0/24 /test rw,alldirs,maproot=0,password=test,注意test目录是在根目录已经创建好的子目录,并且挂载时使用mfsmount /mnt/client -H mfsmaster -o mfssubfolder=/test -p,否则会出现mfsmaster register error: Permission denied的错误。)

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. #Alloweverythingbut"Meta".

  2. #*/rw,maproot=0

  3. 192.168.40.0/24/rw,maproot=0

  4. 192.168.40.0/24.rw

save_snippets.png

#Alloweverythingbut"Meta".
#*/rw,maproot=0
192.168.40.0/24/rw,maproot=0
192.168.40.0/24.rw@H_301_264@ 



@H_301_264@

二进制文件 Metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs,安装 master 时,会自动生成一个名为 Metadata.mfs.empty 的元数据文件 Metadata,该文件是空的。MooseFS master 运必须有文件 Metadata.mfs,这个文件是从 Metadata.mfs.empty 改名而来,运行mfsmaster时该文件会被命名为Metadata.mfs.back。只要保证日志文件元数据文件的安全,即使元数据服务器遭到致命的破坏,也可以通过备份的元数据文件重新部署一套元数据服务器。

#cd /var/lib/mfs

#cp Metadata.mfs.empty Metadata.mfs //MooseFS master 运行以后,Metadata.mfs 文件大小将发生变,不会为空文件

(3)绑定主机名 mfsmaster 与 ip (每个节点都需绑定修改/etc/hosts 文件,以绑定主机名 mfsmaster 与 ip 地址:


[html] view plain copy print?

  1. 192.168.40.125mfsmaster

save_snippets.png

192.168.40.125mfsmaster@H_301_264@ 


(4)安装CGI

为了监控 MooseFS 当前运行状态,可以安装运行 CGI 监控服务用浏览器查看整个MooseFS 的运行情况。

#rpm -ivh mfs-cgi-1.6.25-1.x86_64.rpm

#rpm -ql mfs-cgi

(5)启动

#/usr/sbin/mfsmaster start

会出现问题:

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. workingdirectory:/var/lib/mfs

  2. can'tcreatelockfileinworkingdirectory:EACCES(Permissiondenied)

save_snippets.png

workingdirectory:/var/lib/mfs
can'tcreatelockfileinworkingdirectory:EACCES(Permissiondenied)@H_301_264@ 

主要是没有设置运行用户和运行组,添加用户(安装完成后配置文件没有改动),也可以使用nobody:nobody。


#groupadd mfs //添加 mfs 组

#useradd -g mfs mfs //新增系统用户mfs

#chown -R mfs.mfs /var/lib/mfs //设置文件所属用户和组(也可以直接指定用户和组,不需要重新创建)

#vim /etc/mfsmaster.cfg

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. WORKING_USER=mfs

  2. WORKING_GROUP=mfs

  3. #SYSLOG_IDENT=mfsmaster

  4. #LOCK_MEMORY=0

save_snippets.png

WORKING_USER=mfs
WORKING_GROUP=mfs
#SYSLOG_IDENT=mfsmaster
#LOCK_MEMORY=0@H_301_264@ 

然后正常启动!


#/usr/sbin/mfscgiserv start

会打不开网页,这是因为cgi文件没有可执行权限

#chmod +x /usr/share/mfscgi/*.cgi

然后启动,在浏览器地址栏输入 http://192.168.40.125:9425 即可查看 master 的运行情况(这时不能看见 chunk server 的数据)。


3、备份服务器Backup server(Metalogger)

(1)安装


安装备份服务器Metalogger的主机在性能上应该比 master 强大(至少有更多的内存),一旦主控服务器 master 失效,只要导入 changelogs 到元数据文件,备份服务器 Metalogger 将能接替发生故障的 master,行使管理服务器的职能。

备份服务器单独安装,需要安装fuse-devel和修改vim /etc/hosts添加192.168.40.125 mfsmaster。添加mfs用户和组,也可指定到其他用户,或使用nobody:nobody。

#rpm -ivh mfs-Metalogger-1.6.25-1.x86_64.rpm

#rpm -ql mfs-Metalogger

#cp mfsMetalogger.cfg.dist mfsMetalogger.cfg

#vimmfsMetalogger.cfg(不修改会出现Permission denied)

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. WORKING_USER=mfs

  2. WORKING_GROUP=mfs

save_snippets.png

WORKING_USER=mfs
WORKING_GROUP=mfs@H_301_264@ 


接着运行备份服务 mfsMetaloger:

#usr/sbin/mfsMetalogger start

在生产环境里应当设置自动启动脚本,以便操作系统重新启动时MooseFSmfsMetalogger 服务也能自动运行。

4、存储块服务器chunk server


(1)安装

若在其他主机上单独安装chunkserver需要安装fuse-devel,并添加mfs用户和组(可指定到其他用户

#rpm -ivh mfs-chunkserver-1.6.25-1.x86_64.rpm //安装

#rpm -ql mfs-chunkserver //查询安装的文件路径,可以查看所有的安装文件,便于修改

(2)准备 chunk server 服务所需的配置文件

#cp mfschunkserver.cfg.dist mfschunkserver.cfg

#cp mfshdd.cfg.dist mfshdd.cfg

#vim /etc/mfschunkserver.cfg (想了解配置文件mfschunkserver.cfg更详细的信息,请查看手册页manmfschunkserver.cfg

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. WORKING_USER=mfs

  2. WORKING_GROUP=mfs

save_snippets.png

WORKING_USER=mfs
WORKING_GROUP=mfs@H_301_264@ 

(3)建立共享点


配置文件 mfshdd.cfg 中给出了用于客户端挂接 MooseFS 分布式文件系统根分区所使用的共享空间位置。建议在 chunk server 上划分单独的空间新建一个设备挂载点作为储存点专门给 MooseFS 使用这样做的好处是便于管理剩余空间

此处假定要使用两个共享点/mnt/mfschunks1 和/mnt/mfschunks2,在 mfshdd.cfg 加入下面的文本行


[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. #mountpointsofHDDdrives

  2. #

  3. #/mnt/hd1

  4. #/mnt/hd2

  5. #etc.

  6. /mnt/mfschunks1

  7. /mnt/mfschunks2

save_snippets.png

#mountpointsofHDDdrives
#
#/mnt/hd1
#/mnt/hd2
#etc.
/mnt/mfschunks1
/mnt/mfschunks2@H_301_264@ 

在启动 chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运行时要在此创建一个.lock 的文件)。否则出现以下错误

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. hddspacemanager:can'tcreatelockfile'/mnt/mfschunks1/.lock':EACCES(Permissiondenied)

  2. init:hddspacemanagerFailed!!!

save_snippets.png

hddspacemanager:can'tcreatelockfile'/mnt/mfschunks1/.lock':EACCES(Permissiondenied)
init:hddspacemanagerFailed!!!@H_301_264@ 

#chown -R mfs:mfs /mnt/mfschunks1
#chown -R mfs:mfs /mnt/mfschunks2


(注:若是单独与master的机器,还需执行chown -R mfs:mfs /var/lib/mfs和修改/etc/hosts添加192.168.40.125mfsmaster。

(4)开始启动 chunk server
#/usr/sbin/mfschunkserver start

再通过浏览器访问 http://192.168.40.125:9425就可以看到 MooseFS 系统的全部信息,包括主控 master 和存储服务 chunkserver 。

(5)MooseFS chunk 以独占方式使用专门磁盘分区

在上述操作过程中不需要这部分的内容,此部分是在实际应用环境下,将chunk server用专门磁盘分区作为设备挂载点,这样做是不要的,便于管理剩余空间,因为MooseFS 并不考虑其剩余空间能被另作他用。

如果没有单独创建文件系统的条件,可以在文件中创建一个文件系统,在此准备两个 2GB 的文件文件位于目录/var/lib/mfs/下,也可以放在其他目录下),并在其上创建文件系统,把他们格式化为 ext3,分别挂接在/mnt/mfschunks1 和/mnt/mfschunks2。

操作步骤:挂接第一个文件系统

1、创建镜像文件mfschunks1

#dd if=/dev/zero of=/var/lib/mfs/mfschunks1 bs=1024 count=1 seek=$((2*1024*1024-1))

2、创建文件系统

##mkfs -t ext3 /var/lib/mfs/mfschunks1

3、创建挂接点

#mkdir -p /mnt/mfschunks1

4、挂接文件系统

#mount -t ext3 -o loop /var/lib/mfs/mfschunks1 /mnt/mfschunks1

挂接第二个文件系统的步骤与上面相同,#mount -t ext3 -o loop /var/lib/mfs/mfschunks2 /mnt/mfschunks2

在启动 chunk server 前,需确保用户 mfs 有权限读写将要被挂接的分区(因为 chunk server 运行时要在此创建一个.lock 的文件):

#chown -R mfs:mfs /mnt/mfschunks1

#chown -R mfs:mfs /mnt/mfschunks2

5、客户端主机client

为了挂接基于 MooseFS 分布式文件,客户端主机必须安装 FUSE 软件包( fuse 版本号至少
2.6,推荐使用版本号大于 2.7.2 的 fuse),#yum install fuse。


安装客户端软件 mfsmount:

#rpm -ivh mfs-client-1.6.25-1.x86_64.rpm

(客户端若单独安装,需要安装fuse-devel和修改vim /etc/hosts添加192.168.40.125 mfsmaster。)

#cp /etc/mfsmount.cfg.dist /etc/mfsmount.cfg

假定客户端的挂接点是/mnt/mfs,将以下面的指令来使用 MooseFS 分布式共享文件系统:
1、 创建挂接点
#mkdir -p /mnt/mfs
2、开始挂接操作
#/usr/bin/mfsmount /mnt/mfs -H mfsmaster

有时会出现mfsmaster register error: Permission denied:

是因为mfsmaster的配置文件和挂载目录 不一致的原因,vim /etc/mfsexports.cfg

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. #Alloweverythingbut"Meta".

  2. #*/rw,maproot=0

  3. 192.168.40.0/24/testrw,maproot=0

save_snippets.png

#Alloweverythingbut"Meta".
#*/rw,maproot=0
192.168.40.0/24/testrw,maproot=0@H_301_264@ 

master的挂载配置文件允许挂载的目录是/test,若用户#mfsmount/mnt -H mfsmaster(不加-o mfssubfolder-子文件夹,默认是挂载/)挂载根/目录会挂载不上,可以修改mfsexports.cfg配置文件为/,再进行挂在就没问题了。

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. 192.168.40.0/24/rw,maproot=0

save_snippets.png

192.168.40.0/24/rw,maproot=0@H_301_264@ 


#/usr/sbin/mfsmaster restart

有时挂载目录有内容提示error in fuse_mount,可以使用 -o nonempty选项挂载。

#mfsmount /mnt/mfs -H mfsmaster -o nonempty

3、挂载Meta文件系统

首先保证mfsexports.cfg文件中加入:

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. #Allow"Meta".

  2. *.rw

save_snippets.png

#Allow"Meta".
*.rw@H_301_264@ 

后执行


#mfsmount -m /mnt/mfs -H mfsmaster

可以不挂载MFS Meta文件系统,挂载该系统主要是为了恢复被误删除文件

4、查看分区

执行命令 df -h | grep mfs 检查分区情况(或使用mount):

[html] view plain copy print?

在CODE上查看代码片

派生到我的代码片

  1. mfsmaster:9421102G256K102G1%/mnt/mfs

save_snippets.png

mfsmaster:9421102G256K102G1%/mnt/mfs@H_301_264@ 



6、使用


(1)备份

#cd /mnt/mfs

#mkdir dir1

#mkdir dir2

5022081">


默认mfs将储存的文件只储存在一个节点上(master选取的)。


设置储存在储存块dir2上的文件储存在两个节点上,做一个备份,系统会自动将数据同步到选定的节点上,这样达到里备份的效果

因master和trunk服务器在同一台机器上,即便设定了 goal=2 来到达保存两个副本但看到的只是一个副本而已,尽管有两个trunk挂在点,但它只是一个 chunk server。

设置文件副本数量,一般以3份为佳。

#mfssetgoal -r 3 /mnt/mfs

#mfsgetgoal /mnt/mfs/

#/mnt/mfs: 3


(2)设置删除文件的空间回收时间

#mfsgettrashtime dir2/passwd

dir2/passwd: 86400

#mfssettrashtime 300 /mnt/mfs

获取删除dir2/passwd后在回收站中保存的时间,防止用户误删,这个数字不能设置的太高也不能太低,一般设置为300(5分钟)。

(3)查看目录信息

#mfsdirinfo -H /mnt/mfs

(4)数据恢复

二进制文件 Metadata 和文本文件 changelog 将被保存在目录/var/lib/mfs

执行数据恢复操作,其命令为:mfsMetarestore -m Metadata.mfs.back -o Metadata.mfs changelog_ml.*.mfs 恢复成功后再执行启动新的master服务操作。可参看数据恢复的例子:http://blog.ztrix.me/blog/2012/05/13/restore-mfs-metadata/

(5)停止 MooseFS

为了安全停止 MooseFS 集群,建议执行如下的步骤:
在所有客户端用 unmount 命令先卸载文件系统(本例将是: umount /mnt/mfs)
停止 chunk server 进程: /usr/sbin/mfschunkserver stop
停止 Metalogger 进程: /usr/sbin/mfsMetalogger stop
停止主控 master server 进程: /usr/sbin/mfsmaster stop

(6)简单使用脚本(配置启动)

使用者可根据具体使用环境进行修改调试:


[html] view plain copy print?

  1. #!/bin/bash

  2. if[$#-ne1];then

  3. echo"pleaseinput:./moosefs.shmfsmaster"

  4. exit1

  5. fi

  6. if["$UID"-ne0];then

  7. echo"youarenotroot"

  8. exit2

  9. fi

  10. ALLOW_IP_RANGE="192.168.40.0/24"

  11. MASTERIP="192.168.40.125"

  12. start_mfsmaster()

  13. {

  14. echo"------start_mfsmaster------"

  15. cd/etc

  16. cpmfsmaster.cfg.distmfsmaster.cfg

  17. cpmfstopology.cfg.distmfstopology.cfg

  18. cpmfsexports.cfg.distmfsexports.cfg

  19. chown-Rnobody:nobody/var/lib/mfs

  20. cd/var/lib/mfs

  21. cpMetadata.mfs.emptyMetadata.mfs

  22. cat>>/etc/mfsexports.cfg<<EOF

  23. $ALLOW_IP_RANGE/rw,maproot=0

  24. $ALLOW_IP_RANGE.rw

  25. EOF

  26. echo"$MASTERIPmfsmaster">>/etc/hosts

  27. #sed-i'$a\192.168.40.125mfsmaster'/etc/hosts

  28. /usr/sbin/mfsmasterstart

  29. /usr/sbin/mfsmastertest&>>start.log

  30. }

  31. start_mfsMetalogger()

  32. {

  33. echo"------mfsMetalogger------"

  34. cd/etc

  35. cpmfsMetalogger.cfg.distmfsMetalogger.cfg

  36. chown-Rnobody:nobody/var/lib/mfs

  37. grep"mfsmaster"/etc/hosts&>/dev/null

  38. if[$?-eq0];then

  39. echo"$MASTERIPmfsmaster">>/etc/hosts

  40. fi

  41. usr/sbin/mfsMetaloggerstart

  42. /usr/sbin/mfsMetaloggertest&>>start.log

  43. }

  44. start_mfschunkserver()

  45. {

  46. echo"------mfschunkserver------"

  47. cd/etc

  48. cpmfschunkserver.cfg.distmfschunkserver.cfg

  49. cpmfshdd.cfg.distmfshdd.cfg

  50. chown-Rnobody:nobody/var/lib/mfs

  51. cat>>/etc/mfsexports.cfg<<EOF

  52. /mnt/mfschunks1

  53. /mnt/mfschunks2

  54. EOF

  55. chown-Rnobody:nobody/mnt/mfschunks1

  56. chown-Rnobody:nobody/mnt/mfschunks2

  57. grep"mfsmaster"/etc/hosts&>/dev/null

  58. if[$?-eq0];then

  59. echo"$MASTERIPmfsmaster">>/etc/hosts

  60. fi

  61. /usr/sbin/mfschunkservertest&>>start.log

  62. }

  63. start_mfsclient()

  64. {

  65. echo"------mfsclient------"

  66. cd/etc

  67. cp/etc/mfsmount.cfg.dist/etc/mfsmount.cfg

  68. grep"mfsmaster"/etc/hosts&>/dev/null

  69. if[$?-eq0];then

  70. echo"$MASTERIPmfsmaster">>/etc/hosts

  71. fi

  72. mkdir-p/mnt/mfs

  73. /usr/bin/mfsmount/mnt/mfs-Hmfsmaster

  74. /usr/bin/mfsmount-m/mnt/mfs-Hmfsmaster

  75. mkdir/mnt/mfs/sharedata

  76. mkdir/mnt/mfs/sharefile

  77. /usr/bin/mfssetgoal-r3/mnt/mfs

  78. /usr/bin/mfssettrashtime300/mnt/mfs

  79. }

  80. stop_mfs()

  81. {

  82. result=`df-h|grepmfsmaster|awk-F""'{print$6}'`

  83. OLD_IFS="$IFS"

  84. IFS="\n"

  85. array=($result)

  86. IFS="$OLD_IFS"

  87. forelementin${arr[@]}

  88. do

  89. umount$element

  90. done

  91. /usr/sbin/mfschunkserverstop

  92. /usr/sbin/mfsMetaloggerstop

  93. /usr/sbin/mfsmasterstop

  94. }

  95. main()

  96. {

  97. case"$1"in

  98. mfsmaster)

  99. start_mfsmaster;;

  100. mfsMetalogger)

  101. start_mfsMetalogger;;

  102. mfschunkserver)

  103. start_mfschunkserver;;

  104. start_mfsclient)

  105. start_mfsclient;;

  106. *)

  107. echo"pleaseinput:./moosefs.shmfsmasterormfsMetaloggerormfschunkserverormfsclient"

  108. esac

  109. }

  110. main$1

猜你在找的CentOS相关文章