Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ceph块设备使用iscsi

ceph块设备使用iscsi

作者头像
summerking
发布于 2023-04-27 12:36:51
发布于 2023-04-27 12:36:51
1.3K00
代码可运行
举报
文章被收录于专栏:summerking的专栏summerking的专栏
运行总次数:0
代码可运行

Ceph 块设备(也叫RBD)服务提供了大小可调、精炼、支持快照和克隆的块设备。为提供高性能, Ceph 把块设备条带化到整个集群。 Ceph 同时支持内核对象( KO ) 和 QEMU 管理程序直接使用 librbd ——避免了内核对象在虚拟系统上的开销。

在linux上使用iscsi挂载块设备

1. 确认iscsi-initiator-utils已安装

yum -y install scsi-target-utils

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# rpm -qa |grep -i iscsi-initiator-utils
iscsi-initiator-utils-iscsiuio-6.2.0.874-19.0.1.el7.x86_64
iscsi-initiator-utils-6.2.0.874-19.0.1.el7.x86_64

2. 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root in summer163-200 in ~ via 🐍 v2.7.5 
➜ sed -n '50,90p'  /etc/iscsi/iscsid.conf | grep -Ev '^$|^\s*#'
node.session.auth.authmethod = CHAP
node.session.auth.username = xsw1
node.session.auth.password = q123456123456
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = xsw1
discovery.sendtargets.auth.password = q123456123456
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# sed -n '50,90p'  /etc/iscsi/iscsid.conf

# *************
# CHAP Settings
# *************

# To enable CHAP authentication set node.session.auth.authmethod
# to CHAP. The default is None.
node.session.auth.authmethod = CHAP

# To configure which CHAP algorithms to enable set
# node.session.auth.chap_algs to a comma seperated list.
# The algorithms should be listen with most prefered first.
# Valid values are MD5, SHA1, SHA256
# The default is MD5.
#node.session.auth.chap_algs = SHA256,SHA1,MD5

# To set a CHAP username and password for initiator
# authentication by the target(s), uncomment the following lines:
node.session.auth.username = xsw1
node.session.auth.password = q123456123456

# To set a CHAP username and password for target(s)
# authentication by the initiator, uncomment the following lines:
#node.session.auth.username_in = xsw1
#node.session.auth.password_in = q123456123456

# To enable CHAP authentication for a discovery session to the target
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
discovery.sendtargets.auth.authmethod = CHAP

# To set a discovery session CHAP username and password for the initiator
# authentication by the target(s), uncomment the following lines:
discovery.sendtargets.auth.username = xsw1
discovery.sendtargets.auth.password = q123456123456

# To set a discovery session CHAP username and password for target(s)
# authentication by the initiator, uncomment the following lines:
#discovery.sendtargets.auth.username_in = xsw1
#discovery.sendtargets.auth.password_in = q123456123456

# ********

3. 重启服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# service iscsid restart
Redirecting to /bin/systemctl restart iscsid.service
[root@summer163-200 ~]# ps -ef |grep iscsi
root      353907       2  0 Mar24 ?        00:00:00 [iscsi_eh]
root      811588       1  0 09:46 ?        00:00:00 /sbin/iscsid -f -d2
root      811603  808540  0 09:46 pts/2    00:00:00 grep --color=auto iscsi

4. 发现目标

  • 这里注意添加ACL,不配置默认是ALL
  • 什么是ACL? ACL(Access Control List)即访问控制列表。主要是针对单一用户,单一文件或目录进行rwx权限的细部设定。可以针对用户(User)、群组(Group)、默认属性掩码(umask)进行设置。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root in summer163-200 in /var/lib/iscsi 
➜ iscsiadm -m discovery -t st -p 192.168.163.201
192.168.163.201:3260,1 iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c
  • 在发现了target后,在/var/lib/iscsi中的nodes和send_targets目录中就有了文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root in summer163-200 in /var/lib 
➜ iscsiadm -m discovery -t st -p 192.168.163.299
iscsiadm: Cannot resolve host 192.168.163.299. getaddrinfo error: [Name or service not known]
iscsiadm: cannot resolve host name 192.168.163.299
iscsiadm: cannot resolve host name 192.168.163.299
iscsiadm: Could not perform SendTargets discovery: encountered connection failure
root in summer163-200 in /var/lib 
❯ tree iscsi/
iscsi/
├── ifaces
├── isns
├── nodes
│   └── iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c
│       └── 192.168.163.201,3260,1
│           └── default
├── send_targets
│   ├── 192.168.163.201,3260
│   │   ├── iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c,192.168.163.201,3260,1,default -> /var/lib/iscsi/nodes/iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c/192.168.163.201,3260,1
│   │   └── st_config
│   └── 192.168.163.299,3260
│       └── st_config
├── slp
└── static

11 directories, 3 files
  • discovery失败的在send_targets目录中也会记录,只不过是空目录。在nodes目录和正确discovery到的send_targets子目录中都有几个配置文件,都是些参数信息。而且可以看到,send_targets中的目录是nodes目录的软链接
  • 如果想重新发现已存在的target时,可以清空nodes目录中对应的项,然后再discovery

5. 登入目标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root in summer163-200 in iscsi/send_targets/192.168.163.299,3260 
➜ iscsiadm -m node iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c -l
Logging in to [iface: default, target: iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c, portal: 192.168.163.201,3260] (multiple)
Login to [iface: default, target: iqn.2021-04.com.419:192.168.163.sn.2f0ab0113d94581903dd010c, portal: 192.168.163.201,3260] successful.

6. 查看iscsi映射的磁盘和其分区情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  100G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
├─sda2        8:2    0    5G  0 part /usr/summer_vfs
└─sda3        8:3    0   94G  0 part 
  └─os-root 252:0    0   94G  0 lvm  /
sdb           8:16   0   30G  0 disk 
└─sdb1        8:17   0   30G  0 part /var/lib/ceph/osd/ceph-0
sdc           8:32   0   30G  0 disk 
└─sdc1        8:33   0   30G  0 part /var/lib/ceph/osd/ceph-1
sdd           8:48   0   10G  0 disk 
├─sdd1        8:49   0   16M  0 part 
└─sdd2        8:50   0   10G  0 part 
sr0          11:0    1 1024M  0 rom  

7. 重新分区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# parted -s /dev/sdd mklabel gpt
[root@summer163-200 ~]# parted -s /dev/sdd mkpart primary 0G 100%
[root@summer163-200 ~]# parted -s /dev/sdd print
Model: IET VIRTUAL-DISK (scsi)
Disk /dev/sdd: 10.7GB
Sector size (logical/physical): 512B/4194304B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      4194kB  10.7GB  10.7GB               primary

[root@summer163-200 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  100G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
├─sda2        8:2    0    5G  0 part /usr/summer_vfs
└─sda3        8:3    0   94G  0 part 
  └─os-root 252:0    0   94G  0 lvm  /
sdb           8:16   0   30G  0 disk 
└─sdb1        8:17   0   30G  0 part /var/lib/ceph/osd/ceph-0
sdc           8:32   0   30G  0 disk 
└─sdc1        8:33   0   30G  0 part /var/lib/ceph/osd/ceph-1
sdd           8:48   0   10G  0 disk 
└─sdd1        8:49   0   10G  0 part 
sr0          11:0    1 1024M  0 rom  

8. 创建文件系统并挂载块设备

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# mkfs.xfs /dev/sdd1
specified blocksize 4096 is less than device physical sector size 4194304
switching to logical sector size 512
meta-data=/dev/sdd1              isize=256    agcount=4, agsize=654848 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=2619392, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@summer163-200 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  100G  0 disk 
├─sda1        8:1    0    1G  0 part /boot
├─sda2        8:2    0    5G  0 part /usr/summer_vfs
└─sda3        8:3    0   94G  0 part 
  └─os-root 252:0    0   94G  0 lvm  /
sdb           8:16   0   30G  0 disk 
└─sdb1        8:17   0   30G  0 part /var/lib/ceph/osd/ceph-0
sdc           8:32   0   30G  0 disk 
└─sdc1        8:33   0   30G  0 part /var/lib/ceph/osd/ceph-1
sdd           8:48   0   10G  0 disk 
└─sdd1        8:49   0   10G  0 part 
sr0          11:0    1 1024M  0 rom  
[root@summer163-200 ~]# mkdir /iscsd-dir
[root@summer163-200 ~]# mount -t xfs /dev/sdd1 /iscsd-dir/
[root@summer163-200 ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.7G     0  1.7G   0% /dev
tmpfs                1.7G   20K  1.7G   1% /dev/shm
tmpfs                1.7G   17M  1.7G   1% /run
tmpfs                1.7G     0  1.7G   0% /sys/fs/cgroup
/dev/mapper/os-root   93G   38G   51G  43% /
/dev/sda2            4.8G  695M  3.9G  15% /usr/summer_vfs
/dev/sda1            976M  385M  525M  43% /boot
tmpfs                342M     0  342M   0% /run/user/1000
/dev/sdb1             30G   21G  9.9G  68% /var/lib/ceph/osd/ceph-0
tmpfs                342M     0  342M   0% /run/user/0
/dev/sdc1             30G   21G  9.9G  68% /var/lib/ceph/osd/ceph-1
/dev/sdd1             10G   33M   10G   1% /iscsd-dir
[root@summer163-200 ~]#

9. 测试写文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# cd /iscsd-dir/
[root@summer163-200 iscsd-dir]# ll
total 0
[root@summer163-200 iscsd-dir]# mkdir xsw
[root@summer163-200 iscsd-dir]# ll
total 0
drwxr-xr-x 2 root root 6 Mar 25 10:41 xsw
[root@summer163-200 iscsd-dir]# dd if=/dev/zero of=/iscsd-dir/xsw/lalala bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.1494 s, 91.2 MB/s
[root@summer163-200 iscsd-dir]# cd xsw/
[root@summer163-200 xsw]# ll
total 102400
-rw-r--r-- 1 root root 104857600 Mar 25 10:42 lalala
[root@summer163-200 xsw]# du -sh *
100M	lalala
[root@summer163-200 xsw]#

10. 断开连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@summer163-200 ~]# umount /dev/sdd1
[root@summer163-200 ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             1.7G     0  1.7G   0% /dev
tmpfs                1.7G   20K  1.7G   1% /dev/shm
tmpfs                1.7G   17M  1.7G   1% /run
tmpfs                1.7G     0  1.7G   0% /sys/fs/cgroup
/dev/mapper/os-root   93G   38G   51G  43% /
/dev/sda2            4.8G  695M  3.9G  15% /usr/summer_vfs
/dev/sda1            976M  385M  525M  43% /boot
tmpfs                342M     0  342M   0% /run/user/1000
/dev/sdb1             30G   21G  9.9G  68% /var/lib/ceph/osd/ceph-0
tmpfs                342M     0  342M   0% /run/user/0
/dev/sdc1             30G   21G  9.9G  68% /var/lib/ceph/osd/ceph-1
[root@summer163-200 ~]# iscsiadm -m node --logoutall=all
Logging out of session [sid: 1, target: iqn.2021-03.com.60:192.168.163.sn.c0a9bbaa7884c15d55e347a7, portal: 192.168.163.201,3260]
Logout of [sid: 1, target: iqn.2021-03.com.60:192.168.163.sn.c0a9bbaa7884c15d55e347a7, portal: 192.168.163.201,3260] successful.
[root@summer163-200 ~]#

11. 删除分区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sdm      8:192  0 447.1G  0 disk 
└─sdm1   8:193  0 447.1G  0 part 
root@Kylin102:~# fdisk /dev/sdm

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


命令(输入 m 获取帮助): d
Selected partition 1
Partition 1 has been deleted.

命令(输入 m 获取帮助): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

补充

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> 1.发现iscsi存储: iscsiadm -m discovery -t st -p ISCSI_IP:PORT
> 2.查看iscsi发现记录 iscsiadm -m node
> 3.删除iscsi发现记录 iscsiadm -m node -o delete -T LUN_NAME -p ISCSI_IP:PORT
> 4.登录iscsi存储 iscsiadm -m node -T LUN_NAME -p ISCSI_IP:PORT -l
> 5.登出iscsi存储 iscsiadm -m node -T iqn.2017-12.com.example:storage1 -p 172.25.254.212 -l
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
服务器iscsi存储挂载_redis查询命令
Disk /dev/sda: 21.4 GB, 21474836480 bytes
全栈程序员站长
2022/09/23
3.7K0
iSCSI块存储网络共享基础介绍与实例操作
描述:前面我们正针对于iSCSI与SCSI做了一个简单的介绍, 并且在网络共享中使用过 nfs 以及 smb而iSCSI同样有该功能, 本文记录在学习与工作中搭建与使用iSCSI网络存储案例;
全栈工程师修炼指南
2022/09/29
8.2K0
iSCSI块存储网络共享基础介绍与实例操作
Linux下IP SAN共享存储操作记录
一、简单介绍 SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输。常见的分类是FC-SAN和IP-SAN两种。FC-SAN通过光纤通道协议转发scsi协议;IP-SAN通过TCP协议转发scsi协议,也就是IP 地址。存储设备是指一台或多台用以存储计算机数据的磁盘设备,通常指磁盘阵列,主要厂商EMC、日立等。 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在
洗尽了浮华
2018/03/28
6.7K0
Linux下IP SAN共享存储操作记录
CentOS6下配置基于CHAP认证的iSCSI网络存储服务
之前有简单介绍过iscsi网络存储的基本配置CentOS配置iSCSI网络存储服务,下面再详细介绍iSCSI服务端与客户端的常用命令tgtadm和iscsiadm,以及如何配置基于CHAP认证的iSCSI网络存储服务
yuanfan2012
2019/10/12
1.9K0
007.iSCSI服务器CHAP双向认证配置
本手册建议以裸磁盘vdb作为示例,其他类型配置参考《002.iSCSI服务端多类型配置》。
木二
2022/05/10
2.7K0
iSCSI 手动
Longhorn的部署和简单使用可以参考之前的文章:k3s 部署 和 简单使用 以及 Longhorn的部署和使用 最后一个章节。
后端云
2022/11/25
2K0
iSCSI 手动
linux发起iscsi_iscsi自动连接
1)磁盘阵列:磁盘阵列是一种采用RAID技术、冗余技术和在线维护技术制造的一种高性能、高可用的磁盘存储设备。
全栈程序员站长
2022/09/23
5.5K0
搭建iscsi存储系统
SATA:容量大,500G, 750G, 1T, 2T, 3T, 4T 不支持热插拔,价格低。
胡齐
2019/10/03
4K0
iSCSI:提供基于 iSCSI 的网络存储(服务端以及启动器配置)
「 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》」
山河已无恙
2023/09/11
1.6K0
iSCSI:提供基于 iSCSI 的网络存储(服务端以及启动器配置)
linux基本命令iscsiadm,iscsiadm命令使用方法[通俗易懂]
iscsi-initiator-utils-6.2.0.873-2.el6.x86_64
全栈程序员站长
2022/09/25
2.8K0
CentOS 7.x 下配置iSCSI网络存储
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/52981305
shaonbean
2019/05/26
2.4K0
004.iSCSI客户端配置示例-Linux
一 安装软件 1 [root@system2 ~]# yum -y install iscsi-initiator-utils 二 修改相关参数 1 [root@system2 ~]# vi /etc/iscsi/initiatorname.iscsi 2 InitiatorName=iqn.2016-09.com.example:desktop0 #设置为服务端赋予权限的IQN 三 启动iSCSI服务 1 [root@system2 ~]# systemctl enable isc
木二
2019/07/26
5.3K0
使用iSCSI服务部署网络存储
使用mdadm命令创建RAID磁盘阵列。其中,-Cv参数为创建阵列并显示过程,/dev/md0为生成的阵列组名称,-n 3参数为创建RAID 5磁盘阵列所需的硬盘个数,-l 5参数为RAID磁盘阵列的级别,-x 1参数为磁盘阵列的备份盘个数。在命令后面要逐一写上使用的硬盘名称。
用户8006012
2022/10/25
3.1K0
CentOS7.4安装ceph lio iSCSI gateway操作指导
本文作者 / Wenda 关注存储以及周边生态,独立的存储系统生存太艰难,融入生态才体现价值。 1、背 景 我们Ceph作为后端存储时,这里只针对块存储空间的使用进行讨论。 对于块存储空间,Linux用户的使用方法有多种,如:rbd map方式、rbd-nbd map方式、 rbd-fuse方式, 但是对于Windows用户,如何使用呢?--- 答案:通过ISCSI访问。 2、说 明 针对块存储场景,iSCSI gateway的作用: 1) 采用ceph作为后端存储时,通过iSCSI协议为Wi
腾讯云TStack
2019/08/02
3.9K0
CentOS7.4安装ceph lio iSCSI gateway操作指导
Centos7挂载ISCSI网络存储
🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护等领域。 🎈 博客首页:互联网-小啊宇 Centos7挂载ISCSI网络存储 ⭐ISCSI简介 ⭐服务器安装依赖 ⭐ISCSI启动并设置开机自启动 ⭐查看Target ⭐登陆节点前需验证 🍒开启验证 🍒添加用户 🍒添加密码 ⭐登陆节点 ⭐开启自动登陆节点 ⭐查看当前链接 ⭐
互联网-小阿宇
2022/11/21
1.8K0
Centos7挂载ISCSI网络存储
iscsi多路径存储方式
如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障。
胡齐
2019/10/11
5.9K0
iscsi多路径存储方式
multipath多路径实验01-构建iSCSI模拟环境
前几天跟同事网上闲聊技术,吐槽之前自己没有配置过多路径的经历,虽然多路径的配置过程很简单,职责划分也应是主机或存储工程师来搞定,DBA只需要直接拿来用,但这样总感觉少了些踏实感。 本着学习的心态,在虚拟环境下模拟,来做一个多路径的实验。 本文主要描述使用iscsi模拟存储划出的1个LUN,最终由两条链路连接到主机,显示为两个磁盘的场景。为后续配置multipath提供前置环境。
Alfred Zhao
2019/05/24
1.5K0
MongoDB使用iscsi
Linux平台:尝试部署MogoDB,并使用iscsi作为其data目录 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 # 连接iscsi root in awCqlxb in
summerking
2022/09/16
2.6K0
MongoDB使用iscsi
iSCSI: 自动化配置基于 iSCSI 的块设备网络存储启动器
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/09/12
4170
iSCSI: 自动化配置基于 iSCSI 的块设备网络存储启动器
ISCSI:后端卷以LVM 的方式配置 ISCSI 目标/启动器
「 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》」
山河已无恙
2023/09/11
5960
ISCSI:后端卷以LVM 的方式配置 ISCSI 目标/启动器
推荐阅读
相关推荐
服务器iscsi存储挂载_redis查询命令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验