IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [转]在Linux 6上使用UDEV解决RAC ASM存储设备名问题

    changyanmanman发表于 2015-08-22 15:00:04
    love 0

    连接:http://www.askmaclean.com/archives/%E5%9C%A8linux-6%E4%B8%8A%E4%BD%BF%E7%94%A8udev%E8%A7%A3%E5%86%B3rac-asm%E5%AD%98%E5%82%A8%E8%AE%BE%E5%A4%87%E5%90%8D%E9%97%AE%E9%A2%98.html


    Maclean一直是使用UDEV替代ASMLIB做RAC存储设备名绑定的拥护者,相关的专题文章可以作为读者的预读知识是:
    Why ASMLIB and why not?
    利用UDEV服务解决RAC ASM存储设备名 

     

    在《利用UDEV服务解决RAC ASM存储设备名 》一文中我推荐了自己写的一个脚本,该脚本会自动生成udev rule规则文件:

     

    for i in b c d e f g h i j k ;
    do
    echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id -g -u -s %p\", RESULT==\"`scsi_id -g -u -s /block/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""
    done

     

    以上脚本在Linux 5上是通用的, 但是有同学反映在redhat/Oracle Linux 6以上版本中该脚本失效了。

    这是因为:

    在OEL6或者RHEL6中,这一切都有所变化。

    主要的变化是:
    1. scsi_id的命令语法发生了变化,scsi_id -g -u -s这样的命令不再有效。
    2. udevtest命令已经没有了,整合到了udevadm中。
    How to use udev for Oracle ASM in Oracle Linux 6  

     

     

    下面我提供改良后的脚本,可以在redhat/Oracle Linux 6上生成正确的udev rule 规则文件:

     

     

    1.
    
    #首先确认是 Linux 6.0以上版本
    
    [root@vrh6 dev]# cat /etc/issue          
    Oracle Linux Server release 6.2
    Kernel \r on an \m
    
    2.
    
    #添加记录到/etc/scsi_id.config
    
    echo "options=--whitelisted --replace-whitespace"  >> /etc/scsi_id.config
    
    3. 
    
    #确认哪些块设备需要udev绑定
    
    [root@vrh6 dev]# ls -l sd*
    brw-rw----. 1 root disk 8,  0 Jun 30 09:29 sda
    brw-rw----. 1 root disk 8,  1 Jun 30 09:29 sda1
    brw-rw----. 1 root disk 8,  2 Jun 30 09:29 sda2
    brw-rw----. 1 root disk 8, 16 Jun 30 09:29 sdb
    brw-rw----. 1 root disk 8, 32 Jun 30 09:29 sdc
    brw-rw----. 1 root disk 8, 48 Jun 30 09:29 sdd
    brw-rw----. 1 root disk 8, 64 Jun 30 09:29 sde
    brw-rw----. 1 root disk 8, 80 Jun 30 09:29 sdf
    
    例如在本实例中 sdb-> sdf的块设备需要绑定
    
    4. 将 b->f的编号放入for 循环中,例如:
    # AUTO UDEV RULE BY Maclean Liu 2012/06/30
    for i in b c d e f ;
    do
    echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""      
    done
    
    就会生成sdb->sdf 设备绑定的RULE,在将这些RULE写入到/etc/udev/rules.d/99-oracle-asmdevices.rules中
    
    也可以直接利用以下脚本 ,写出RULE到99-oracle-asmdevices.rules
    
    # AUTO UDEV RULE BY Maclean Liu 2012/06/30
    for i in b c d e f ;
    do
    echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""      >> /etc/udev/rules.d/99-oracle-asmdevices.rules
    done
    
    5. 之后运行用root运行/sbin/start_udev  即可

     

     

     

    实际运行示例:

     

    [root@vrh6 dev]# echo "options=--whitelisted --replace-whitespace"  >> /etc/scsi_id.config
    [root@vrh6 dev]# for i in b c d e f ;
    > do
    > echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""      >> /etc/udev/rules.d/99-oracle-asmdevices.rules
    > done
    [root@vrh6 dev]# 
    
    [root@vrh6 dev]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB09cadb31-cfbea255", NAME="asm-diskb", OWNER="grid", GROUP="asmadmin", MODE="0660"
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB5f097069-59efb82f", NAME="asm-diskc", OWNER="grid", GROUP="asmadmin", MODE="0660"
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB4e1a81c0-20478bc4", NAME="asm-diskd", OWNER="grid", GROUP="asmadmin", MODE="0660"
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VBdcce9285-b13c5a27", NAME="asm-diske", OWNER="grid", GROUP="asmadmin", MODE="0660"
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB82effe1a-dbca7dff", NAME="asm-diskf", OWNER="grid", GROUP="asmadmin", MODE="0660"
    
    [root@vrh6 dev]# 
    
    [root@vrh6 dev]# /sbin/start_udev
    Starting udev:                                             [  OK  ]
    
    [root@vrh6 dev]# ls -l asm*
    brw-rw----. 1 grid asmadmin 8, 16 Jun 30 09:34 asm-diskb
    brw-rw----. 1 grid asmadmin 8, 32 Jun 30 09:34 asm-diskc
    brw-rw----. 1 grid asmadmin 8, 48 Jun 30 09:34 asm-diskd
    brw-rw----. 1 grid asmadmin 8, 64 Jun 30 09:34 asm-diske
    brw-rw----. 1 grid asmadmin 8, 80 Jun 30 09:34 asm-diskf


    相关文章 | Related posts:

    1. 利用UDEV服务解决RAC ASM存储设备名 加入dbDao.com Oracle技术学习QQ群:171092051 在<Why ASMLIB and […]...
    2. 几个关于oracle 11g ASM的问题 加入dbDao.com Oracle技术学习QQ群:171092051 Question: 1.11g Ora […]...
    3. Oracle安装与操作系统用户组 加入dbDao.com Oracle技术学习QQ群:171092051 Oracle软件在安装维护过程中长要和 […]...
    4. CRS-4258: Addition and deletion of voting files are not allowed because the voting files are on ASM 加入dbDao.com Oracle技术学习QQ群:171092051 客户的一套11.2.0.1 RAC系统 […]...
    FILED UNDER: LINUX, ORACLE TAGGED WITH: LINUX 6.0, UDEV
    最新最早最热
    • 25条评论
    • luzp
      luzp

      为啥不用multipath呢?

      2012年6月30日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        在实际非多路径的情况下,不推荐使用multipath做设备绑定。

        2012年6月30日回复顶转发
        • coolzsb
          coolzsb

          为什么呢?是出于什么考虑?能给个具体案例吗?

          签名
          ---
          难道是为了减少不必要的服务?

          2012年12月27日回复顶转发
    • richardzgt
      richardzgt

      使用vmware,需要在vmx文件中加入: disk.EnableUUID = "TRUE",否则UUID出不来

      2012年7月2日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        maclean推荐使用vbox 替代vmware, vmware 确实是有该问题,我在另一个帖子里也回复过这个问题,谢谢指出。

        2012年7月2日回复顶转发
    • cuizj923
      cuizj923

      我的环境是两台机器通过多路径的方式 共享一个存储。按照您提供的方法udev 帮定wwid.oracle 安装程度提示不是共享磁盘。我的操作步骤如下:

      From Configuring persistent storage in Red Hat Enterprise Linux 6



      1.Create /etc/scsi_id.config add

      options=--whitelisted --replace-whitespace


      2.Get UUID for disks you want to created ASM on

      scsi_id --whitelisted --replace-whitespace --device=/dev/sda

      [root@racnode2 rules.d]# multipath -ll
      mpathe (36000d3100055f5000000000000000043) dm-8 COMPELNT,Compellent Vol
      size=1.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:3:2 sdg 8:96 active ready running
      |- 2:0:2:2 sdk 8:160 active ready running
      |- 1:0:2:2 sde 8:64 active ready running
      `- 2:0:3:2 sdm 8:192 active ready running
      mpathd (36000d3100055f5000000000000000044) dm-2 COMPELNT,Compellent Vol
      size=1.5T features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:3:1 sdf 8:80 active ready running
      |- 1:0:2:1 sdd 8:48 active ready running
      |- 2:0:2:1 sdj 8:144 active ready running
      `- 2:0:3:1 sdl 8:176 active ready running
      mpatha (36000d3100055f5000000000000000042) dm-7 COMPELNT,Compellent Vol
      size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:0:3 sdb 8:16 active ready running
      |- 1:0:1:3 sdc 8:32 active ready running
      |- 2:0:0:3 sdh 8:112 active ready running
      `- 2:0:1:3 sdi 8:128 active ready running

      [root@racnode1 rules.d]# multipath -ll
      mpathe (36000d3100055f5000000000000000042) dm-2 COMPELNT,Compellent Vol
      size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:1:3 sdc 8:32 active ready running
      |- 1:0:0:3 sdb 8:16 active ready running
      |- 2:0:0:3 sdh 8:112 active ready running
      `- 2:0:1:3 sdi 8:128 active ready running
      mpathc (36000d3100055f5000000000000000043) dm-7 COMPELNT,Compellent Vol
      size=1.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:2:2 sde 8:64 active ready running
      |- 1:0:3:2 sdg 8:96 active ready running
      |- 2:0:2:2 sdk 8:160 active ready running
      `- 2:0:3:2 sdm 8:192 active ready running
      mpathb (36000d3100055f5000000000000000044) dm-8 COMPELNT,Compellent Vol
      size=1.5T features='1 queue_if_no_path' hwhandler='0' wp=rw
      `-+- policy='round-robin 0' prio=1 status=active
      |- 1:0:3:1 sdf 8:80 active ready running
      |- 2:0:2:1 sdj 8:144 active ready running
      |- 1:0:2:1 sdd 8:48 active ready running
      `- 2:0:3:1 sdl 8:176 active ready running


      3. Create UDEV rules file

      vi /etc/udev/rules.d/99-oracle-asmdevices.rules

      PROGRAM add scsi_id command, RESULT is UUID

      KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000d3100055f5000000000000000042", 

      NAME="asmdisk1", OWNER="grid", GROUP="asmadmin", MODE="0660"
      KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000d3100055f5000000000000000044", 

      NAME="asmdisk2", OWNER="grid", GROUP="asmadmin", MODE="0660"



      KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-

      whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""


      4.udevadm command can test UDEV configuration

      5.Start udev

      /sbin/start_udev

      6. Restart and check 

      ls -l /dev/asm*






      [root@racnode1 dev]# ls -al
      total 4
      drwxr-xr-x. 18 root root 4380 Jan 28 17:41 .
      dr-xr-xr-x. 30 root root 4096 Jan 29 2013 ..
      brw-rw----. 1 grid asmadmin 8, 32 Jan 29 2013 asmdisk1
      brw-rw----. 1 grid asmadmin 8, 144 Jan 29 2013 asmdisk2

      [root@racnode2 dev]# ls -al
      total 4
      drwxr-xr-x. 18 root root 4380 Jan 29 09:42 .
      dr-xr-xr-x. 30 root root 4096 Jan 29 2013 ..
      brw-rw----. 1 grid asmadmin 8, 128 Jan 29 2013 asmdisk1
      brw-rw----. 1 grid asmadmin 8, 144 Jan 29 2013 asmdisk2


      Device Checks for ASM - This is a pre-check to verify if the specified devices meet the requirements for configuration through the Oracle Universal Storage Manager 

      Configuration Assistant.? Error: 
      ?-?
      "/dev/asmdisk1" is not shared ?- Cause:?Cause Of Problem Not Available ?- Action:?User Action Not Available 
      ?-?
      racnode2:Unable to determine the sharedness of /dev/sdd on nodes: The problem occurred on nodes: racnode2 ?- Cause:?Cause Of Problem Not Available ?- Action:?User 

      Action Not Available 
      ?-?
      racnode1:Unable to determine the sharedness of /dev/sdf on nodes: The problem occurred on nodes: racnode1 ?- Cause:?Cause Of Problem Not Available ?- Action:?User 

      Action Not Available 

      Check Failed on Nodes: [racnode2, ?racnode1] 
      Verification result of failed node: racnode2 

      ?Details: 
      ?-?
      Unable to determine the sharedness of /dev/asmdisk2 on nodes: [racnode2, racnode1] ?- Cause:?Cause Of Problem Not Available ?- Action:?User Action Not Available 
      ?-?
      Unable to determine the sharedness of /dev/asmdisk1 on nodes: [racnode2, racnode1] ?- Cause:?Cause Of Problem Not Available ?- Action:?User Action Not Available 
      ?-?
      PRVF-9802 : Attempt to get udev info from node "racnode2" failed ?- Cause:? Attempt to read the udev permissions file failed, probably due to missing permissions 

      directory, missing or invalid permissions file, or permissions file not accessible to use account running the check. ?- Action:? Make sure that the udev permissions 

      directory is created, the udev permissions file is available, and it has correct read permissions for access by the user running the check. 
      Back to Top 
      Verification result of failed node: racnode1 

      ?Details: 
      ?-?
      Unable to determine the sharedness of /dev/asmdisk2 on nodes: [racnode2, racnode1] ?- Cause:?Cause Of Problem Not Available ?- Action:?User Action Not Available 
      ?-?
      Unable to determine the sharedness of /dev/asmdisk1 on nodes: [racnode2, racnode1] ?- Cause:?Cause Of Problem Not Available ?- Action:?User Action Not Available 
      ?-?
      PRVF-9802 : Attempt to get udev info from node "racnode1" failed ?- Cause:? Attempt to read the udev permissions file failed, probably due to missing permissions 

      directory, missing or invalid permissions file, or permissions file not accessible to use account running the check. ?- Action:? Make sure that the udev permissions 

      directory is created, the udev permissions file is available, and it has correct read permissions for access by the user running the check. 
      Back to Top

      2013年1月30日回复顶转发
      • dzq0371
        dzq0371

        有人遇到过这样的问题吗?像这样的情况怎么处理?redhat6 多路径配置裸设备

        2013年11月21日回复顶转发
    • admxy
      admxy

      你好,我的环境是virtualbox+rhel6.0+11gr2+rac 也按照你上面的方法来配置adm存储设备,但是在安装grid的时候就是发现不了asm磁盘,

      2013年5月13日回复顶转发
    • admxy
      admxy

      [root@rac1 ~]# ll /dev/asm*
      brw-rw---- 1 grid asmadmin 8, 17 May 13 11:05 /dev/asm-diskb
      brw-rw---- 1 grid asmadmin 8, 33 May 13 11:05 /dev/asm-diskc
      请问,用udev后,是不是还需要安装oracle官网上的两个包啊
      oracleasmlib-2.0.4-1.el6.x86_64
      oracleasm-support-2.1.8-1.el6.x86_64
      操作系统发现的硬盘,是否要在进行start_udev之前就进行分区呢?

      2013年5月13日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        RAC使用了UDEV之后 完全不需要 ASMLIB了!!

        2013年5月13日回复顶转发
    • frankying
      frankying

      很多情况下,生产不会用SCSI的,我发现/dev/disk/by-id 下面有对应的盘号,但是测试怎么也用不到UDEV中,绑定不上去,类似这样:
      vi /etc/udev/rules.d/99-oracle-asmdevices.rules
      KERNEL=="/dev/disk/by-id/scsi-26131333933306632", NAME="asmdisk", OWNER="grid", GROUP="asmdba", MODE="0660"

      2013年5月13日回复顶转发
    • admxy
      admxy

      找到问题了,就是需要手动选一下路径,就会发现/dev 下面的asm盘,但是请问博主,这个手动指定asm盘的路径会影响rac的运行或者其他的一些情况吗?

      2013年5月13日回复顶转发
      • sync
        sync

        不会,ASMLIB不等于ASM

        2013年9月11日回复顶转发
    • river
      river

      只能针对lun,而不能针对patition
      一个lun分3个分区,/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb与/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb[1-3]获取的值都是一样的。。。

      2014年2月23日回复顶转发
    • zl秋天的雪
      zl秋天的雪

      问一下,使用这种方式,以后要添加磁盘的时候,需要停库重启么?

      2014年3月4日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        不需要的

        2014年3月4日回复顶转发
    • d.b.c.a
      d.b.c.a

      配置了DHS HDLM存储多路径之后,我在asmca 直接使用映射的磁盘来创建asm磁盘组,还需要使用udev来绑定之后,再创建asm磁盘组。
      谢谢

      2014年3月6日回复顶转发
    • d.b.c.a
      d.b.c.a

      udev所映射的盘,有多路径的功能吗

      2014年3月25日回复顶转发
    • oradbguy
      oradbguy

      查了下linux 6的文档 里面把关键字 "BUS" 替换为 "SUBSYSTEM" 了

      2014年3月27日回复顶转发
    • blue
      blue

      [root@rac1 rules.d]# more 99-oracle-asmdevices.rules 
      KERNEL=="sd*5", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="SATA_VBOX_HARDDISK_VB1f438a3a-b80b7cbe_", NAME="asm-disk
      5", OWNER="grid", GROUP="asmadmin", MODE="0660"
      KERNEL=="sd*6", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="SATA_VBOX_HARDDISK_VB1f438a3a-b80b7cbe_", NAME="asm-disk
      6", OWNER="grid", GROUP="asmadmin", MODE="0660"
      KERNEL=="sd*7", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="SATA_VBOX_HARDDISK_VB1f438a3a-b80b7cbe_", NAME="asm-disk
      7", OWNER="grid", GROUP="asmadmin", MODE="0660"
      KERNEL=="sd*8", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="SATA_VBOX_HARDDISK_VB1f438a3a-b80b7cbe_", NAME="asm-disk
      8", OWNER="grid", GROUP="asmadmin", MODE="0660"
      [root@rac1 rules.d]# 
      [root@rac1 rules.d]# ls -l /dev/asm*
      brw-rw---- 1 grid asmadmin 8, 37 Apr 8 13:11 /dev/asm-disk5
      brw-rw---- 1 grid asmadmin 8, 38 Apr 8 13:11 /dev/asm-disk6
      brw-rw---- 1 grid asmadmin 8, 39 Apr 8 13:11 /dev/asm-disk7
      brw-rw---- 1 grid asmadmin 8, 40 Apr 8 13:11 /dev/asm-disk8
      你好,麻烦问下,我用此方式绑定asm后,为什么权限明明正确,安装检查时却任然报:device checks for asm 属主属组不正确,而且说检查到的属主是root,不知道Oracle是通过那个脚本去检测的那个文件,还是直接用ll命令取的属主属组,不应该呀!

      2014年4月8日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        你看到这个检测问题是一个bug

        2014年4月8日回复顶转发
        • blue
          blue

          谢谢回复,确实是个bug忽略该问题,安装正常。

          2014年4月8日回复顶转发举报
    • boyboyman
      boyboyman

      我使用udev进行绑定后,添加新的磁盘把新的磁盘的信息添加进99-oracle-asmdevices.rules ,后启动start_udev,成功完成但发现vip资源down了,请问使用udev进行绑定如何正确添加磁盘不影响crs其他的资源呢

      2014年8月28日回复顶转发
      • Ask_Maclean_liu_Oracle
        Ask_Maclean_liu_Oracle

        请参加我的RAC安装视频,正常使用udev绝对不会造成资源问题,而且配置udev一般也都在安装RAC之前就搞定了。

        2014年8月28日回复顶转发
    • busy
      busy

      看完你上面的文章有点不理解想请教,就是实际的环境中如果存在多路径访问存储。
      哪么同一个设备就会有两个设备名如/dev/sdc和/dev/sdd这两个的scsi_id是一样的,按上面配置方式用udev作配置后最后映射成/dev/asm-1这个设备有用到多路软件吗?有用到多路径访问存储吗?UDEV是把两个/dev/sd*映射成/dev/asm-1还是只要第一个?
      还是说直接用多路软件的mpath*作为asm的访问路径?

      2014年11月3日回复顶转发



沪ICP备19023445号-2号
友情链接