juicefs和juicefs.ceph的編譯安裝和使用


JuiceFS 是一款高性能 POSIX 文件系統,針對雲原生環境特別優化設計,在 GNU Affero General Public License v3.0 開源協議下發布。使用 JuiceFS 存儲數據,數據本身會被持久化在對象存儲(例如,Amazon S3),而數據所對應的元數據可以根據場景需求被持久化在 Redis、MySQL、SQLite 等多種數據庫引擎中。JuiceFS 可以簡單便捷的將海量雲存儲直接接入已投入生產環境的大數據、機器學習、人工智能以及各種應用平台,無需修改代碼即可像使用本地存儲一樣高效使用海量雲端存儲。

核心特性

  1. POSIX 兼容:像本地文件系統一樣使用,無縫對接已有應用,無業務侵入性;
  2. HDFS 兼容:完整兼容 HDFS API,提供更強的元數據性能;
  3. S3 兼容:提供 S3 網關 實現 S3 協議兼容的訪問接口;
  4. 雲原生:通過 Kubernetes CSI Driver 可以很便捷地在 Kubernetes 中使用 JuiceFS;
  5. 多端共享:同一文件系統可在上千台服務器同時掛載,高性能並發讀寫,共享數據;
  6. 強一致性:確認的修改會在所有掛載了同一文件系統的服務器上立即可見,保證強一致性;
  7. 強悍性能:毫秒級的延遲,近乎無限的吞吐量(取決於對象存儲規模),查看性能測試結果
  8. 數據安全:支持傳輸中加密(encryption in transit)以及靜態加密(encryption at rest),查看詳情
  9. 文件鎖:支持 BSD 鎖(flock)及 POSIX 鎖(fcntl);
  10. 數據壓縮:支持使用 LZ4Zstandard 壓縮數據,節省存儲空間;

一、安裝go運行環境

juice是使用go語言編寫的,首先我們要安裝一下go運行環境。

安裝方式一(直接使用官方編譯好的二進制文件)。

全新安裝:

將go的最新版安裝包go1.17.4.linux-amd64.tar.gz下載到節點上,解壓壓縮包,導入go的環境變量。

[root@node112 ~]# wget https://go.dev/dl/go1.17.4.linux-amd64.tar.gz
# 備份go舊版本二進制文件
[root@node112 ~]# mv /usr/local/bin/go /usr/local/bin/go1.12.2
[root@node112 ~]# tar -C /usr/local -zxvf go1.17.4.linux-amd64.tar.gz
[root@node112 ~]# ln -s /usr/local/go/bin/go /usr/local/bin/go
[root@node112 ~]# export GOROOT=/usr/local/go
[root@node112 ~]# export PATH=$PATH:/usr/local/go/bin
[root@node112 ~]# go version
go version go1.17.4 linux/amd64

升級安裝:

[root@node112 ~]# rm -rf /usr/local/go/
[root@node112 ~]# rm -f /usr/local/bin/go
[root@node112 ~]# tar -C /usr/local -zxvf go1.16.11.linux-amd64.tar.gz
[root@node112 ~]# ln -s /usr/local/go/bin/go /usr/local/bin/go
[root@node112 ~]# go version
go version go1.16.11 linux/amd64

安裝方式二(使用源碼進行編譯安裝)。

首先將最新版go源碼壓縮包go1.17.4.src.tar.gz下載到節點上,解壓壓縮包,然后按照下面的步驟進行安裝。

[root@node112 ~]# cd go/src/
[root@node112 src]# ./all.bash        ##這里會比較耗時

如果出現下面錯誤。

[root@node112 ~]# go version
go: error while loading shared libraries: libgo.so.14: cannot open shared object file: No such file or directory

查找libgo.so.14文件的路徑然后將路徑導入環境變量LD_LIBRARY_PATH中,就不會報錯了。

[root@node112 ~]# find / -depth -name "libgo.so.14" -print
/root/gcc-9.1.0/gcc-build-9.1.0/x86_64-pc-linux-gnu/libgo/.libs/libgo.so.14
/usr/local/lib64/libgo.so.14
[root@node112 ~]# export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
[root@node112 ~]# echo $LD_LIBRARY_PATH
/usr/local/lib64:
[root@node112 ~]# go version
go version go1.12.2 gccgo (GCC) 9.1.0 linux/amd64

二、編譯JuiceFS二進制文件

下載JuiceFS源碼包。

[root@node101 ~]# git clone https://gitee.com/juicedata/JuiceFS.git
[root@node101 ~]# cd JuiceFS/

開始編譯安裝juicefs。

[root@node101 JuiceFS]# export GOPROXY=https://github.com/goproxy/goproxy.cn 或 export GOPROXY=https://goproxy.io
[root@node101 JuiceFS]# make -j4
[root@node101 ~]# juicefs --version
juicefs version 0.17.2 (2021-11-19T06:58:44Z d820726)

三、將ceph的s3對象存儲掛載為本地目錄

使用juicefs可以將ceph的s3對象存儲接口掛載為本地目錄。

[root@node101 ~]# juicefs format redis://localhost:6379/3 --storage s3 --bucket http://bucket2.192.168.30.114:7480  --access-key C1DK1Y9WGP65MGXJ49FU --secret-key mDRf2unXMZqUrVGIpg2UGsvt4JmZSl76apYKGZ5f test
# 注意 這里bucket參數實際上是 http://[bucket].[endpoint] 格式,最后一個參數test是bucket下的目錄名; redis的連接地址如果需要密碼的話,注意把密碼補上
[root@node101 ~]# juicefs mount -d redis://localhost:6379/3 ~/test/

對掛載目錄執行基准性能測試。

[root@node101 test]# juicefs bench -p 4 /root/test/

四、編譯juicefs.ceph二進制文件

為 Ceph 編譯 JuiceFS支持rados接口(要求 Go 1.16+ 和 GCC 5.4+)

因為我們的環境中GCC版本是4.8.5,所以首先要升級gcc,注意編譯gcc時在參數-enable-languages后面添加go讓gcc支持go語言。

[root@node101 ~]# wget http://ftp.gnu.org/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz
[root@node101 ~]# tar -xzvf gcc-9.1.0.tar.gz
[root@node101 ~]# cd gcc-9.1.0
[root@node101 gcc-9.1.0]# ./contrib/download_prerequisites
[root@node101 gcc-9.1.0]# mkdir gcc-build-9.1.0
[root@node101 gcc-9.1.0]# cd gcc-build-9.1.0
[root@node101 gcc-build-9.1.0]# ../configure -enable-checking=release -enable-languages=c,c++,go -disable-multilib
[root@node101 gcc-build-9.1.0]# make -j4           ##這個時間有點長,我的環境花了將近5個小時
[root@node101 gcc-build-9.1.0]# sudo make install
# 重啟節點,待重啟完成后查看gcc版本,顯示升級成功
[root@node101 ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/9.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure -enable-checking=release -enable-languages=c,c++,go -disable-multilib
Thread model: posix
gcc version 9.1.0 (GCC) 

開始編譯juicefs.ceph二進制文件。

[root@node101 JuiceFS]# make -j4 juicefs.ceph       ##這一步有點慢,要下載一些依賴包,耐心等待
# 如果下載失敗了執行下面的命令,然后重新執行命令下載
[root@node101 JuiceFS]# go env
[root@node101 JuiceFS]# export GOPROXY=https://github.com/goproxy/goproxy.cn 

繼續執行,報錯如下:

[root@node101 JuiceFS]# make -j4 juicefs.ceph
go build -tags ceph -ldflags="-s -w -X github.com/juicedata/juicefs/pkg/version.revision=d51194d -X github.com/juicedata/juicefs/pkg/version.revisionDate=2021-12-06"  -o juicefs.ceph ./cmd

# github.com/ceph/go-ceph/rados

/root/go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados/command.go:5:11: fatal error: rados/librados.h: No such file or directory
    5 | // #include <rados/librados.h>
      |           ^~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [juicefs.ceph] Error 2

安裝dnf包管理工具

[root@node101 rados]# yum install epel-release -y
[root@node101 rados]# yum install dnf -y

使用dnf查找rados/librados.h對應的包

[root@node101 rados]# dnf whatprovides *rados/librados.h
Extra Packages for Enterprise Linux 7 - x86_64                                                                                                               4.1 MB/s |  17 MB     00:04    
CentOS-7 - Base                                                                                                                                              2.2 MB/s |  10 MB     00:04    
CentOS-7 - Updates                                                                                                                                            20 MB/s |  15 MB     00:00    
CentOS-7 - Extras                                                                                                                                            209 kB/s | 310 kB     00:01    
Last metadata expiration check: 0:00:01 ago on Tue 07 Dec 2021 05:43:47 PM CST.
librados2-devel-1:10.2.5-4.el7.i686 : RADOS headers
Repo        : base
Matched from:
Other       : *rados/librados.h

librados2-devel-1:10.2.5-4.el7.x86_64 : RADOS headers
Repo        : base
Matched from:
Other       : *rados/librados.h

從上面可以看出這個文件是在librados2-devel這個包里面,我們把這個包裝一下。

[root@node101 rados]# dnf install librados2-devel -y

手動執行安裝程序,又報錯。

[root@node101 rados]# go get github.com/ceph/go-ceph/rados
# github.com/ceph/go-ceph/rados
./command.go:106:9: could not determine kind of name for C.rados_mgr_command

查看編譯目錄下的Makefile文件,發現有個地方跟官方描述有出入,下面這個官方描述的大致意思就是說go-ceph為了支持不同版本的ceph,對應了不同版本的go-ceph,在編譯的時候要加上-tags這個參數來指定你要編譯的juicefs.ceph的版本,但如果不確定直接用的是哪個版本的ceph,那么可以在編譯的時候使用-tags Ceph標簽來禁用這個選項。

go-ceph tries to support different Ceph versions. However some functions might only be available in recent versions, and others may be deprecated. In order to work with non-current versions of Ceph, it is required to pass build-tags to the go command line. A tag with the named Ceph release will enable/disable certain features of the go-ceph packages, and prevent warnings or compile problems. For example, to ensure you select the library features that match the "pacific" release,use:

go build -tags pacific ....
go test -tags pacific ....

Supported Ceph Versions

go-ceph version Supported Ceph Versions Deprecated Ceph Versions
v0.12.0 octopus, pacific nautilus
v0.11.0 nautilus, octopus, pacific
v0.10.0 nautilus, octopus, pacific
v0.9.0 nautilus, octopus
v0.8.0 nautilus, octopus
v0.7.0 nautilus, octopus
v0.6.0 nautilus, octopus mimic
v0.5.0 nautilus, octopus luminous, mimic
v0.4.0 luminous, mimic, nautilus, octopus
v0.3.0 luminous, mimic, nautilus, octopus
v0.2.0 luminous, mimic, nautilus
(pre release) luminous, mimic (see note)
[root@node101 JuiceFS]# cp Makefile Makefile_bak
[root@node101 JuiceFS]# vi Makefile
# 找到juicefs.ceph: Makefile這一行,把go build -tags ceph行中的ceph改成Ceph,也就是小寫c改成大寫的C。
juicefs.ceph: Makefile cmd/*.go pkg/*/*.go
go build -tags Ceph -ldflags="$(LDFLAGS)"  -o juicefs.ceph ./cmd
# 這里要手動下載指定版本的go-ceph
[root@node112 ceph]# go get github.com/ceph/go-ceph@v0.4.0
# 手動執行編譯juicefs.ceph命令,添加-n參數打印編譯時用到的所有命令,但不真正執行
[root@node112 juicefs]# export GO111MODULE=on
[root@node112 JuiceFS]# go build -n -tags Ceph -ldflags="-s -w -X github.com/juicedata/juicefs/pkg/version.revision=d51194d -X github.com/juicedata/juicefs/pkg/version.revisionDate=2021-12-06"  -o juicefs.ceph3 ./cmd

修改完成之后再次編譯成功。

[root@node101 JuiceFS]# make -j4 juicefs.ceph
go build -tags Ceph -ldflags="-s -w -X github.com/juicedata/juicefs/pkg/version.revision=5e57a10 -X github.com/juicedata/juicefs/pkg/version.revisionDate=2021-12-07"  -o juicefs.ceph ./cmd
[root@node101 JuiceFS]# ls
ADOPTERS_CN.md  check-changed.sh  CODE_OF_CONDUCT.md  docs     go.mod  hack         juicefs.ceph  Makefile      pkg           README.md
ADOPTERS.md     cmd               CONTRIBUTING.md     fstests  go.sum  integration  LICENSE       Makefile_bak  README_CN.md  sdk
[root@node101 JuiceFS]# ./juicefs.ceph 
NAME:
   juicefs - A POSIX file system built on Redis and object storage.

USAGE:
   juicefs.ceph [global options] command [command options] [arguments...]

VERSION:
   1.0-dev (2021-12-07 5e57a10)

COMMANDS:
   format   format a volume
   mount    mount a volume
   umount   unmount a volume
   gateway  S3-compatible gateway
   sync     sync between two storage
   rmr      remove directories recursively
   info     show internal information for paths or inodes
   bench    run benchmark to read/write/stat big/small files
   gc       collect any leaked objects
   fsck     Check consistency of file system
   profile  analyze access log
   stats    show runtime statistics
   status   show status of JuiceFS
   warmup   build cache for target directories/files
   dump     dump metadata into a JSON file
   load     load metadata from a previously dumped JSON file
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --verbose, --debug, -v  enable debug log (default: false)
   --quiet, -q             only warning and errors (default: false)
   --trace                 enable trace log (default: false)
   --no-agent              Disable pprof (:6060) and gops (:6070) agent (default: false)
   --help, -h              show help (default: false)
   --version, -V           print only the version (default: false)

COPYRIGHT:
   AGPLv3

但是通過編譯成功的juicefs.ceph掛載集群存儲池為本地目錄時報錯了,目前暫時查不到關於這個錯誤的信息(這里官方挖了個坑,可直接略過下面的內容查看第六部分的解決方案)。

[root@node101 ~]# ./juicefs.ceph format --storage ceph --bucket ceph://data --access-key ceph --secret-key client.admin redis://localhost:6379/1 ceph-volume
2021/12/08 16:26:02.634338 juicefs[282500] <INFO>: Meta address: redis://localhost:6379/1
2021/12/08 16:26:02.637043 juicefs[282500] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly.
2021/12/08 16:26:02.637398 juicefs[282500] <INFO>: Ping redis: 246.692µs
2021/12/08 16:26:02.637841 juicefs[282500] <FATAL>: object storage: invalid storage: ceph

臨時解決辦法,將go-ceph目錄下的command.go和omap.go這兩個文件重命名后再編譯(目前暫時不清楚修改后有沒有其他問題)。

[root@node101 JuiceFS]# go build -tags Ceph /root/go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados
# github.com/ceph/go-ceph/rados
../go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados/command.go:106:9: could not determine kind of name for C.rados_mgr_command
[root@node101 JuiceFS]# go build -tags luminous /root/go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados
# github.com/ceph/go-ceph/rados
../go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados/omap.go:94:2: could not determine kind of name for C.rados_read_op_omap_get_vals2
[root@node101 JuiceFS]# go build -tags luminous /root/go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados
[root@node101 ~]# cd /root/go/pkg/mod/github.com/ceph/go-ceph@v0.4.0/rados
[root@node101 rados]# mv command.go command.go_bak
[root@node101 rados]# mv omap.go omap.go_bak

修改編譯命令中的-tags ceph參數(把ceph修改為小寫),然后重新編譯,這次沒有再出現“could not determine kind of name for C.rados_mgr_command”的報錯。

[root@node101 JuiceFS]# go build -tags ceph -ldflags="-s -w -X github.com/juicedata/juicefs/pkg/version.revision=5e57a10 -X github.com/juicedata/juicefs/pkg/version.revisionDate=2021-12-07"  -o juicefs.ceph ./cmd
[root@node101 JuiceFS]# ls
ADOPTERS_CN.md  check-changed.sh  CODE_OF_CONDUCT.md  docs     go.mod  hack         juicefs       LICENSE   pkg           README.md
ADOPTERS.md     cmd               CONTRIBUTING.md     fstests  go.sum  integration  juicefs.ceph  Makefile  README_CN.md  sdk

五、將ceph的存儲池掛載為本地目錄使用

使用juicefs.ceph將集群存儲池data掛載為本地目錄。

[root@node101 JuiceFS]# ./juicefs.ceph format --storage ceph --bucket ceph://data --access-key ceph --secret-key client.admin redis://localhost:6379/1 ceph-volume
2021/12/09 09:22:38.234224 juicefs[3165225] <INFO>: Meta address: redis://localhost:6379/1
2021/12/09 09:22:38.237536 juicefs[3165225] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly.
2021/12/09 09:22:38.237847 juicefs[3165225] <INFO>: Ping redis: 205.011µs
2021/12/09 09:22:41.319756 juicefs[3165225] <INFO>: Data use ceph://data/ceph-volume/
2021/12/09 09:22:41.444859 juicefs[3165225] <INFO>: Volume is formatted as {Name:ceph-volume UUID:46fdfd9a-53e3-4482-bb0d-d8b9b7ff7f82 Storage:ceph Bucket:ceph://data AccessKey:ceph SecretKey:removed BlockSize:4096 Compression:none Shards:0 Partitions:0 Capacity:0 Inodes:0 EncryptKey: TrashDays:1}

掛載使用,往掛載目錄中寫入數據。

[root@node101 ~]# cd JuiceFS/
[root@node101 JuiceFS]# ./juicefs.ceph mount -d redis://localhost:6379/1 ~/ceph-volume/
2021/12/09 09:25:42.291904 juicefs[3172685] <INFO>: Meta address: redis://localhost:6379/1
2021/12/09 09:25:42.295030 juicefs[3172685] <WARNING>: AOF is not enabled, you may lose data if Redis is not shutdown properly.
2021/12/09 09:25:42.295429 juicefs[3172685] <INFO>: Ping redis: 271.549µs
2021/12/09 09:25:42.374197 juicefs[3172685] <INFO>: Data use ceph://data/ceph-volume/
2021/12/09 09:25:42.374797 juicefs[3172685] <INFO>: Disk cache (/var/jfsCache/46fdfd9a-53e3-4482-bb0d-d8b9b7ff7f82/): capacity (1024 MB), free ratio (10%), max pending pages (15)
2021/12/09 09:25:42.879324 juicefs[3172685] <INFO>: OK, ceph-volume is ready at /root/ceph-volume/
[root@node101 JuiceFS]# df -h
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        3.7G     0  3.7G   0% /dev
tmpfs                                           3.7G     0  3.7G   0% /dev/shm
tmpfs                                           3.7G  8.9M  3.7G   1% /run
tmpfs                                           3.7G     0  3.7G   0% /sys/fs/cgroup
/dev/mapper/centos-root                          28G   18G   10G  65% /
/dev/sda1                                      1014M  187M  828M  19% /boot
tmpfs                                           747M     0  747M   0% /run/user/0
tmpfs                                           3.7G   48K  3.7G   1% /var/lib/ceph/osd/ceph-1
tmpfs                                           3.7G   48K  3.7G   1% /var/lib/ceph/osd/ceph-4
tmpfs                                           3.7G   48K  3.7G   1% /var/lib/ceph/osd/ceph-7
192.168.30.101,192.168.30.102,192.168.30.103:/   69G     0   69G   0% /vcluster/cephfs
JuiceFS:test                                    1.0P     0  1.0P   0% /root/test
JuiceFS:ceph-volume                             1.0P     0  1.0P   0% /root/ceph-volume
[root@node101 JuiceFS]# cd /root/ceph-volume/
[root@node101 ceph-volume]# ls
[root@node101 ceph-volume]# dd if=/dev/zero of=1024m bs=1024k count=1024 conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 38.8907 s, 27.6 MB/s

查看dada存儲池的容量使用信息,可以看到數據已經寫入data存儲池里面了。

[root@node102 ~]# ceph df
GLOBAL:
    SIZE       AVAIL       RAW USED     %RAW USED 
    102GiB     93.9GiB      8.06GiB          7.91 
POOLS:
    NAME                      ID     USED        %USED     MAX AVAIL     OBJECTS 
    data                      1      1.00GiB      1.48       66.4GiB         257 
    metadata                  2      3.05KiB         0       44.2GiB          21 

六、解決編譯時出現出現“could not determine kind of name for C.rados_mgr_command”的報錯”的問題

在編譯節點上安裝對應版本的ceph客戶端包。

[root@node112 ~]# yum -y install centos-release-ceph-luminous.noarch

[root@node112 ~]# yum -y install ceph-common

[root@node113 ~]# ceph -v
ceph version 12.2.11 (26dc3775efc7bb286a1d6d66faee0ba30ea23eee) luminous (stable)

再編譯就成功了。

[root@node112 juicefs]# go build -tags ceph -ldflags="-s -w -X github.com/juicedata/juicefs/pkg/version.revision=5e57a10 -X github.com/juicedata/juicefs/pkg/version.revisionDate=2021-12-07"  -o juicefs.ceph ./cmd
[root@node112 juicefs]# ll -h
total 70M
-rw-r--r--.  1 root root 2.9K Dec  8 16:59 ADOPTERS_CN.md
-rw-r--r--.  1 root root 3.5K Dec  8 16:59 ADOPTERS.md
-rw-r--r--.  1 root root  358 Dec  8 16:59 check-changed.sh
drwxr-xr-x.  2 root root 4.0K Dec  8 16:59 cmd
-rw-r--r--.  1 root root    0 Dec  8 16:59 CODE_OF_CONDUCT.md
-rw-r--r--.  1 root root 2.5K Dec  8 16:59 CONTRIBUTING.md
drwxr-xr-x.  4 root root   46 Dec  8 16:59 docs
drwxr-xr-x.  2 root root   22 Dec  8 16:59 fstests
-rw-r--r--.  1 root root 3.9K Dec  8 16:59 go.mod
-rw-r--r--.  1 root root 132K Dec  8 16:59 go.sum
drwxr-xr-x.  5 root root   63 Dec  8 16:59 hack
drwxr-xr-x.  2 root root   49 Dec  8 16:59 integration
-rwxr-xr-x.  1 root root  70M Dec  9 11:09 juicefs.ceph
-rw-r--r--.  1 root root  34K Dec  8 16:59 LICENSE
-rw-r--r--.  1 root root 2.2K Dec  8 17:29 Makefile
drwxr-xr-x. 16 root root  190 Dec  8 16:59 pkg
-rw-r--r--.  1 root root  12K Dec  8 16:59 README_CN.md
-rw-r--r--.  1 root root  13K Dec  8 16:59 README.md
drwxr-xr-x.  3 root root   18 Dec  8 16:59 sdk
[root@node112 juicefs]# 

七、性能調優

juicefs掛載選項中有一些參數可以作為性能調優選項。

--cache-dir: 緩存目錄路徑,將緩存路徑換成內存可明顯提高數據帶寬和IOPS(建議該選項在內存比較充裕的時候使用。)

writeback_cache: 緩存模式,在參數-o選項后面加上這個參數,可以提升小文件數據的IOPS和帶寬速率,當頻繁寫入非常小的數據(如 100 字節左右)時,建議啟用此掛載選項。(注意:該掛載選項僅在 Linux 3.15 及以上版本內核上支持。)

[root@node113 ~]# ./juicefs.ceph mount --cache-dir /dev/shm/cache -d -o allow_other redis://localhost:6379/1 /ceph-volume/

測試性能命令。

[root@node113 ~]# ./juicefs bench /ceph-volume/ -p 4

查看性能數據。

[root@node113 ~]# ./juicefs stats /ceph-volume/ --verbosity 1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM