精华内容
下载资源
问答
  • 一文搞懂iscsi(共享存储

    万次阅读 2020-01-15 01:49:05
    文章目录iscsi(共享存储)了解什么是共享存储以及工程存储的必要性利用交换机使用集群利用网络使用集群配置iscsi服务器端配置完毕后exit退出报错:配置iscsi客户端客户端配置扩展实验 iscsi(共享存储) 了解什么是...

    iscsi(共享存储)

    了解什么是共享存储以及工程存储的必要性

    共享存储如同其名字所隐喻的,是物理存储器中一段可由两个以上的进程共享的存储空间。共享存储段具有大小和物理存储地址。想要访问共享存储段的进程可以连接这段存储区域到自己的地址空间中任何适合的地方,其他进程也一样。这样,多个进程便可以访问相同的物理存储。
    在这里插入图片描述
    如上图:准备迁移

    1. 首先把vm01这个虚拟机的内存克隆一份出来(123),通过迁移网络发送到指定的rhevh上来,此时虚拟机还是在再rhevh1上运行的。
    2. 因为vm001还是在rhevh1上运行的,既然是正在运行的,所以内存里的数据肯定也是在不停的发生变化的比如多了456这些数据
      从123开始备份,456这些新的数据都没有出现在rhevh2上
      这之间要做个标记,这个标记叫做bitmap(位图)
      bitmap之后产生的数据一般是极少的
    3. 暂停vm001这个虚拟机,把bitmap之后所产生的数据发送到rhevh2上来,这样rhevh2上就有了所有的数据,且因为bitmap之后所产生的数据很少,所以很快就传输完了
    4. vm001在rhevh2上开始运行
    • 存储类型分为3大类:1、文件存储 2块存储 3、对象存储
      1、文件存储类似于我们共享一个文件夹
      NFS/SAMBA/ftp
      NAS-网络区域存储
      2、块存储: 把一个硬盘/分区 直接 给你共享出去
      fs
      iscsi
      SAN—存储区域网
      DAS—直接附加存储(性能低下)
      3、对象存储: 给你一个很大的空间,但这个空间是由很多硬盘组成的(这些硬盘不一定是一个机器上的),其中一个硬盘可以理解为一个osd,每个osd又由很多pg组成,如现在需要读取(或写入)1G的信息,其中每个osd有200M,这样读取速度就会很快。
      在这里插入图片描述

    组成集群的每个服务器–称之为 节点(node)
    集群是由若干存储服务器组成(只有系统和硬盘,加入集群中)

    利用交换机使用集群

    下图node1和node2是主备模式,node1坏了自动切换到node2,node1和node2中的sdb盘的内容都是集群中的sdb1盘里的内容,所以node1坏了数据并不会丢失,也可以配置成 高性能模式(双活),高性能的集群可以理解为“读写分离”,其本质是将访问压力分散到集群中的多个节点,但是没有分散存储压力。
    在这里插入图片描述

    利用网络使用集群

    交换机很贵 一个也要几十上百万,所以 一般小企业是不会用交换机作为中转的,而是用网络
    在node节点上看到的实际上和本地硬盘一模一样,也和本地硬盘一样的正常使用,但实际数据是存放在集群中的。
    比如在node1上给sdb硬盘分区,被分区的硬盘实际是集群中的硬盘,因为node2和node1都是共享集群中的硬盘,所以在node1上分区硬盘后,node2上看到的硬盘也被分区了,所以需要分区硬盘只需要在一个节点上执行,如果node1上分区了再去node2上分区,会损坏磁盘数据。
    在这里插入图片描述
    上图中一个接口称之为一个lun,target中分配了多少个lun,node中就能读取到多少个硬盘。
    其中fc-san就是交换机
    iscsi-ip.san就是网络

    配置iscsi服务器端

    1、先在虚拟机中添加一块新的硬盘

    在这里插入图片描述
    然后创建分区,就是sdx1。。。这种
    在这里插入图片描述

    2、创建分区:fdisk 设备名

    创建完毕后刷新一下:partprobe 设备名
    在这里插入图片描述

    3、安装targetcli:yum -y install targetcli*

    安装完毕后启动target服务并设置开启自启:

    systemctl start target   
    systemctl enable target 
    

    在这里插入图片描述

    4、进入子系统:targetcli

    注意 在子系统中的根目录 并非系统的根目录,而是子系统的根。
    在这里插入图片描述
    根目录中对应的关系如下图:
    在这里插入图片描述

    5、iscsi中添加硬盘信息

    • iscsi中添加硬盘信息格式:/backstores/block create 自定义名称 设备名
      如:/backstores/block create block1 /dev/sda4(查看硬盘lsblk)
      在这里插入图片描述
      在这里插入图片描述
    • 删除添加的硬盘:/backstores/block delete 自定义的名称
      如:/backstores/block delete block1
      在这里插入图片描述
      重新创建2个block后面要用:/backstores/block create block1 /dev/sda5/backstores/block create block2 /dev/sda6
      因为需要2块,所以我把之前的主分区sda4删了多建了几个逻辑分区:lsblk在这里插入图片描述
      在这里插入图片描述

    6、创建iscsi

    • 创建iscsi格式为:/iscsi create 格式.年份-月份.*.com.自定义名称 (.*和.自定义名称两者必需有其一)
      如:/iscsi create iqn.2019-12.com.example.disk
    • 删除iscsi:/iscsi delete 已创建的全名称
      如:/iscsi delete example.disk
      在这里插入图片描述
      注:如果创建iscsi格式不对,会报错,无法创建成功:
      在这里插入图片描述
      创建一个iscsi 后面要用:/isisc create iqn.2019-12.com.disk

    7、进入新建的新建的iscsi目录

    如进入之前创建iscsi目录的:cd /iscsi/iqn.2019-12.com.disk/tpgl
    在这里插入图片描述

    8、创建acls(配置访问控制)

    • 新增acls
      acls是配置访问控制(即设置访问服务客户端声称的名字),就是说想要哪个ip或者ip段可以使用这个iscsi存储,格式为:/iscsi/iqn.2018-08.com.example.district18:system1/tpg1/acls/ create iscsi名称:允许的ip或者主机名 ,如果默认所有人都可以访问,那么这个可以不配置。
      如:我只允许10.233.3.226这个ip访问我: /iscsi/iqn.2018-08.com.example.district18:system1/tpg1/acls/ create iqn.2018-08.com.example.district18:10.233.3.226

    • 删除acls:acls/ delete 创建的全称 (如果不在acls目录下,需要完整地址,如:/iscsi/iqn.2018-08.com.example.district18:system1/tpg1/acls)
      在这里插入图片描述
      创建一个后面要用:acls/ create iqn.2019-12.com:ccx (ccx是一台服务器的主机名)

    9、luns里添加设备

    因为iscsi是虚拟的,所以需要指定设备,所以需要在luns里先添加设备(block中的硬盘)

    • 新增格式为:luns/ create /backstores/block/添加的名称
      如:我之前添加硬盘名词是block1和block2:luns/ create /backstores/block/block1 , luns/ create /backtores/block/block2
      在这里插入图片描述
    • luns里删除设备 luns/格式: delete lun* (ls查看序号,lun可以不要,直接跟序号即可)
      如:我刚才创建了2个 就是lun0和lun1,所以:luns/ delete lun0 , luns/ delete lun1在这里插入图片描述
      创建2个待会要用:luns/ create /backstores/block/block1 , luns/ create /backstores/block/block2

    10、portals(端口)

    portals的默认端口是3260,且对所有ip生效:ls可以查看portals,luns下面是portals,这就是端口,0.0.0.0 3260 意思是 3260端口是对所有ip开放的:
    在这里插入图片描述

    • 指定端口或ip
      说明: poerals的ip是自己(服务端)的IP, 指定IP和0.0.0.0的区别是:如果服务端有多个ip,0.0.0.0就全部放开了,但如果服务端只有一个IP,指定IP和0.0.0.0就没有区别!
      如果需要指定ip和端口,格式为:完整路径/portals/ create ip_address=ip ip_port=port
      如:我把10.233.3.226的端口指定为666:portals/ create ip_address=10.233.3.226 ip_port=666(注:我现在在portals目录下,如果不在portals目录,需要完整路径,如:/iscsi/iqn.2018-08.com.example.district18:system1/tpg1/portals
    • 可以删除该条目:portals/ delete 0.0.0.0 ip_port=port
      如:删除 0.0.0.0 的全部端口开放:portals/ delete 0 0 0 0 ip_port=3260
      如:下图中的 10.233.3.227 3260(就是只对227这个ip开放该端口,注意,226和227都是在同一个服务器上的ip)
      在这里插入图片描述
      改回对所有ip开放3260端口:portals/ create 0.0.0.0 3260在这里插入图片描述

    11、重启服务:systemctl restart target

    12、防火墙设置

    如果防火墙是打开的,需要把3260端口添加到防火墙:

    firewall-cmd  --add-port=3260/tcp    
    firewall-cmd  --add-port=3260/tcp --permanent
    

    iscsi服务端就配置完成了,exit退出。

    配置完毕后exit退出报错:

    如果配置过程中很顺利没有报错,但exit退出时报错,首先考虑是不是版本问题,cat /etc/redhat-release 查看当前版本,然后在查看你挂载的源是不是和版本同一个版本,如果是网络源 基本上不会因为版本导致exit报错。
    版本和本地源一样的意思如下图:
    在这里插入图片描述
    退出后第三句话提示 文件已经保存到该文件下,就是说,如果我要更改acls中创建的名称,直接到该目录下定位到改行,直接改即可(就不需要再进入到子系统删除后重新建):vi /etc/target/saveconfig.json
    在这里插入图片描述
    注:修改后需要重启服务后生效:systemctl restart target

    配置iscsi客户端

    1、安装iscsi的包: yum -y install iscsi*

    2、 vi /etc/iscsi/initiatorname.iscsi

    把*Name=后面改为之前定义的acls名称(查看服务端配置的acls :targetcli (进入子系统后),ls / 即可看到)
    在这里插入图片描述
    在这里插入图片描述

    3、重启服务并设置开机自启动

    systemctl restart iscsid  ,
    systemctl enable iscsid
    

    在这里插入图片描述

    做一个发现的操作,发现target的名字

    iscsiadm -m discovery -t st -p 服务器ip
    如:我的服务器ip是226(现在客户端ip是225):iscsiadm -m discovery -t st -p 10.233.3.226
    在这里插入图片描述
    一开始我添加是报错的(no route to host)报错如下图:
    在这里插入图片描述
    报错解决:我去看了 /etc/hosts里面,没有添加解析,我添加了解析后重试 依然报错,然后查看当前防火墙,发现是打开的,我就把防火墙关了依然不行,我就去看服务器的防火墙,依然是打开的,把服务器防火墙关闭后,成功。因为这是测试机 我以为我的防火墙是关闭的,就没有添加3260端口,所以如果防火墙必须打开,把端口添加进去即可。 下图 是查看防火墙以及关闭防火墙:
    在这里插入图片描述

    • 查看已经连接的设备:iscsiadm -m session
    • 查看发现纪录:iscsiadm -m discovery
    • 删除发现纪录:iscisadm -m discovery -p 服务端ip -o delete
      在这里插入图片描述
      重新做一个发现纪录 待会要用:iscsiadm -m discovery -t st -p 10.233.3.226

    把服务器端配置的硬盘添加到客户端(也就是登陆):

    不指定组登陆:iscsiadm -m discovery -t st -p 服务器ip -l (L)(不建议用)
    指定iscsi组登陆:iscsiadm -m node -T iscsi名称 -p 服务器ip -l(是小L)
    添加之前先查看客户端硬盘信息:lsblk,只有sda
    在这里插入图片描述
    查看iscsi名称:targetcli(进入子系统后),ls / 即可看到:
    在这里插入图片描述
    以我的为例,不指定组登陆:iscsiadm -m discovery -t st -p 10.233.3.226 -l (很方便 很好记,ip后面不加-l 就是查看,加-l就是登陆)
    指定组登陆:iscsiadm -m node -T iqn.2019-12.com.disk -p 10.233.3.226 -l
    登陆之前lsblk看不到服务器的硬盘,登陆成功以后lsblk就会看到服务器配置的硬盘信息了。
    在这里插入图片描述

    登陆报错处理

    • 登陆报错截图
      在这里插入图片描述
    • 处理:
      只有一个原因,客户端 vi /etc/iscsi/initiatorname.iscsi里面的路径指定错误,指定的是acls的名称,去检查是不是指定为iscsi的名称了:
      在这里插入图片描述

    退出登陆

    不想用已添加的硬盘了,退出登陆即可:iscsiadm -m node -T iscsi名词 -p 服务器ip -u (如果有多组,退出指定组) ,iscsiadm -m node --logoutall=all / iscsiadm -m node -u ALL (2个均为注销所有连接)
    如:iscsiadm -m node -T iqn.2019-12.com.disk -p 10.233.3.226 -u
    在这里插入图片描述
    注销后只是相当于退出登陆,但重启后共享存储又存在了,所以需要删除存储硬盘:

    • 删除所有:iscsiadm -m node -o delete
    • 删除指定组:iscsiadm -m node -T iscsi名称 -p 服务器ip -o delete

    挂载iscsi(要做发现和登陆以后再挂载)

    分区:fdisk 设备名 (注意,这个设备名是iscsi分享的设备名,不是本地设备)
    格式化:mkfs.ext4(xfs) 设备名(注意,这个设备名是iscsi分享的设备名,不是本地设备
    临时挂载:mount 格式化后的设备名 挂载路径
    命令:
    在这里插入图片描述
    在这里插入图片描述
    上述是临时挂载,如果需要永久挂载,需要吧信息写入到fsteb中,和本地硬盘一样,但在第四项,需要加上_netdev必须加上,不然开机系统不能正常启动(因为不加_netdev就是在本地找硬盘分区,但本地并不存在这个硬盘分区,所以系统起不来)。
    在这里插入图片描述
    上诉操作做完以后,整个共享存储从配置到使用就完成了,但lsblk看到的共享存储盘,重启是会自动加载到本机的,如果只想用一次性,不需要重启生效,去配置文件中把自动挂载注释掉:
    vi /etc/iscsi/iscsid.conf
    在这里插入图片描述

    客户端配置扩展实验

    扩展实验,就是说,我在服务器上配置了2组iscsi,想在客户端把这2组都配上去,经过种种实验,最终发现 ,客户端配置文件中,不允许同时写入两个秘钥;详细如下图:
    服务器配置,2组iscsi:
    在这里插入图片描述
    客户端配置:先写入文件vi /etc/iscsi/initiatorname.iscsi
    在这里插入图片描述
    重启:systemctl restart iscsid
    发现:iscsiadm -m discovery -t st -p 10.233.3.226
    在这里插入图片描述
    登陆:iscsiadm -m discovery -t st -p 10.233.3.226 -l (挂载所有)
    在这里插入图片描述
    原因:系统只认配置文件/etc/iscsi/initiatorname.iscsi的其中一组,但这种情况想把2组都挂上去怎么弄呢!
    刚才执行全部登陆的时候成功了一组,所以我们现在去配置文件中把成功的那组注释掉,重启服务,再次挂载即可!!
    如:我刚才成功的是new,现在去配置文件把new注释掉,然后重启服务:
    在这里插入图片描述
    再次登陆,哈哈哈,成功了。我真是鬼才

    为了测试能正常使用,我分区 格式化并挂载了/etc/iscsi/initiatorname.iscsi文件中已经注释的文件,证明该方法 能用
    在这里插入图片描述
    当lsblk能看到硬盘以后,即全部配置完成,然后就可以正常使用了,但需要分区,格式化然后挂载目录,因为现在看到的其实是新盘,也就是相当于重新添加的硬盘。 (分区格式化挂载就不一一说明了)
    查看完整名称:fdisk -l
    在这里插入图片描述
    分区:fdisk 设备名
    格式化:mkfs.ext4(xfs) 设备名
    临时挂载:mount 设备名 挂载路径
    命令:
    在这里插入图片描述
    在这里插入图片描述
    上述是临时挂载,如果需要永久挂载,需要吧信息写入到fsteb中,和本地硬盘一样,但在第四项,需要加上_netdev,必须上,不然开机系统不能正常重启。
    在这里插入图片描述
    上诉操作做完以后,整个共享存储从配置到使用就完成了,但lsblk看到的共享存储盘,重启是会自动加载到本机的,如果只想用一次性,不需要重启生效,去配置文件中把自动挂载注释掉:
    vi /etc/iscsi/iscsid.conf
    在这里插入图片描述
    查看已连接设备:
    查看已经连接的设备:iscsiadm -m session
    在这里插入图片描述
    查看详细:iscsiadm -m session -P1 (1可替换为1,2,3,1-3分别代表详细程度)
    在这里插入图片描述

    展开全文
  • 今天给大家介绍如何在Linux上面搭建IP SAN iscsi存储系统,应且在服务器客户端访问共享存储 首先介绍一下iscsi,iscsi用于将scsi数据块映射为以太网数据包,基于tcp/ip协议来传输数据包,分为iscsi target和iscsi ...

    今天给大家介绍如何在Linux上面搭建IP SAN iscsi存储系统,应且在服务器客户端访问共享存储

    首先介绍一下iscsi,iscsi用于将scsi数据块映射为以太网数据包,基于tcp/ip协议来传输数据包,分为iscsi target和iscsi initiator,前者是共享存储的主机,可以是一个可以容纳很多个磁盘的PC,后者是用来访问target的客户端主机,initiator用于建立连接并且实现scsi通讯。

    下面说下我的主机网络环境:

    iscsi target主机:210.72.3.230( Centos 6.5)在新建虚拟机的时候我在上面加了一块硬盘sdb

    iscsi initiator主机:192.168.10.43(win 7 )

    iscsi initiator主机:210.72.3.247(window server 2008)

    内网192的主机和两个外网的主机是相互连着的


    1安装iscsi target

    http://iscsitarget.sourceforge.net 下载

    这里的版本是1.4.20.2

    tar zvxf iscsitarget-1.4.20.2.tar.gz

    cd iscsitarget-1.4.20.2

    make

    make install

    这里可能会报错

    1/lib/modules/2.6……/build,no such file or……

    意思是iscsi没有连接到内核模块,或者是内核模块不存在,在当前目录下输入下面命令

    yum -y install kernel-devel

    cd  /lib/modules/2.6……/

    ln -s /usr/src/kernels/2.6……/     build

    接着再make,可能又会报错,patch is not install

    yum -y install patch

    接着再make,可能又会报错,perl没有安装

    yum -y install perl

    make

    make install

    记得安装make和gcc


    2配置iscsi target

    vi /etc/iet/ietd.conf

    定位到有Target字眼的地方,将前面的注释#删除,这个是iscsi target的名称,在同一子网里面是唯一的,我这里修改了年份和月份

    接着定位到有Lun字眼的地方

    将Lun前面的注释#删除掉,修改磁盘的名字,我这里因为添加的磁盘是sdb,所以修改为sdb

    fdisk -l命令可以看到我的没有挂载的磁盘sdb

    保存退出之后输入service iscsi-target start启动夫妇,发觉启动失败提示fatal module iscsi-trgt not found

    这是由于iscsi模块文件没有放在正确目录导致的,解决办法如下

    mkdir /lib/modules/`uname -r`\kernel\scsi(uname -r内核版本)

    find /-name "iscsi-trgt.ko"

    然后cd进入iscsi-trgt.lo的目录

    cp iscsi.trgt.ko /lib/modules/`uname -r`/kernel/iscsi

    depmod -aq(重新编译内核)

    再启动服务service iscsi-target start


    3Windows上面配置iscsi initiator

    在Windows系统上面(192.168.10.43)的搜索里面查iscsi,打开,会提示是否开启iscsi服务,选择“是”

    在发现选项卡上面点击“发现门户”,输入iscsi-target的主机IP,端口默认,点击确定

    点击目标选项卡,点击连接

    打开windows的“计算机管理”,打开“磁盘管理”,就可以看到新添加的共享存储,第一次使用要对其进行格式化还有添加mbr才能进行分区,就是在下面找到共享存储的名字,右键单击名字,选择添加MBR引导,在磁盘格式化,然后进行分区,就把磁盘挂载上来使用了

    在windows server 2008服务器上面也类似操作,但是要在磁盘名字那里右键单击,选择联机

    注意,如果第一次在一台Windows主机上面格式化并且进行了分区的话,在别的Windows上面就不用执行这些操作了,如这台Windows server 2008的主机,选择联机之后就可以自动连接到磁盘了。

















    
    展开全文
  • Linux下共享内存编程(共享存储空间)

    万次阅读 多人点赞 2018-07-29 23:44:08
    共享存储允许两个或多个进程共享一个给定的存储区,是进程间通信最快的一种方式。 不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问。 最简单的共享内存的使用流程 ①ftok函数生成键值 ②...

    共享存储允许两个或多个进程共享一个给定的存储区,是进程间通信最快的一种方式。

    不要同时对共享存储空间进行写操作,通常,信号量用于同步共享存储访问。

    最简单的共享内存的使用流程

    ①ftok函数生成键值

    ②shmget函数创建共享内存空间

    ③shmat函数获取第一个可用共享内存空间的地址

    ④shmdt函数进行分离(对共享存储段操作结束时的步骤,并不是从系统中删除共享内存和结构)

    ⑤shmctl函数进行删除共享存储空间

    1.ftok函数生成键值

    每一个共享存储段都有一个对应的键值(key)相关联(消息队列、信号量也同样需要)。

    所需头文件:#include<sys/ipc.h>

    函数原型 :key_t ftok(const char *path ,int id);

    path为一个已存在的路径名

    id为0~255之间的一个数值,代表项目ID,自己取

    返回值:成功返回键值(相当于32位的int)。出错返回-1

    例如:key_t key = ftok( “/tmp”, 66);

    2.shmget函数创建共享存储空间并返回一个共享存储标识符

    所需头文件:#include<sys/shm.h>

    函数原型: int shmget(key_t key, size_t size,int flag);

    key为ftok生成的键值

    size为共享内存的长度,以字节为单位

    flag为所需要的操作和权限,可以用来创建一个共享存储空间并返回一个标识符或者获得一个共享标识符。

    flag的值为IPC_CREAT:如果不存在key值的共享存储空间,且权限不为0,则创建共享存储空间,并返回一个共享存储标识符。如果存在,则直接返回共享存储标识符。

    flag的值为 IPC_CREAT | IPC_EXCL:如果不存在key值的共享存储空间,且权限不为0,则创建共享存储空间,并返回一个共享存储标识符。如果存在,则产生错误。

    返回值:成功返回共享存储ID;出错返回-1

    例如:int id = shmget(key,4096,IPC_CREAT|IPC_EXCL|0666);创建一个大小为4096个字节的权限为0666(所有用户可读可写,具体查询linux权限相关内容)的共享存储空间,并返回一个整形共享存储标识符,如果key值已经存在有共享存储空间了,则出错返回-1。

         int id = shmget(key,4096,IPC_CREAT|0666);创建一个大小为4096个字节的权限为0666(所有用户可读可写,具体查询linux权限相关内容)的共享存储空间,并返回一个共享存储标识符,如果key值已经存在有共享存储空间了,则直接返回一个共享存储标识符。

    3.shmat函数获取第一个可用共享内存空间的地址

    所需头文件:#include<sys/shm.h>

    函数原型: void *shmat(int shmid, const void *addr, int flag);

    shmid为shmget生成的共享存储标识符

    addr指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置

    flag为对数据的操作,如果指定为SHM_RDONLY则以只读方式连接此段,其他值为读写方式连接此段。

    翻阅linux下shm.c文件得到#define SHM_RDONLY      010000  /* read-only access */

    返回值:成功返回指向共享存储段的指针;错误返回-1(打印出指针的值为全F)

    例如:char *addr  = shmat(id, NULL, 0);就会返回第一个可用的共享内存地址的指针的值给addr 

    4.shmdt函数进行分离

    当不需要对此共享内存进行操作时候,调用shmdt函数进行分离,不是删除此共享存储空间哟。

    所需头文件:#include<sys/shm.h>

    函数原型: int shmdt(const void *addr);

    addr为shmat函数返回的地址指针

    返回值:成功返回0;错误返回-1

    例如:int ret = shmdt(addr);

    5.shmctl函数对共享内存进行控制

    简单的操作就是删除共享存储空间了,也可以获取和改变共享内存的状态

    所需头文件:#include<sys/shm.h>

    函数原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

    shmid就是shmget函数返回的共享存储标识符

    cmd有三个,常用删除共享内存的为IPC_RMID;IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中;IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内。(内核为每个共享存储段维护着一个结构,结构名为shmid_ds,这里就不讲啦,里面存放着共享内存的大小,pid,存放时间等一些参数)

    buf就是结构体shmid_ds

    返回值:成功返回0;错误返回-1

    例如:int ret = shmctl(id, IPC_RMID,NULL);删除id号的共享存储空间

     

    ps:在Linux下,比如你申请24字节大小的共享存储空间,系统还是会默认给你分配一页的大小,但你还是只能使用这一页上24字节的空间。使用getconf PAGE_SIZE 命令就能显示出一页的大小

    使用ipcs -m可以查看当前系统所有的共享内存空间信息

    如果你的程序创建了一个共享内存段,但没有销毁,可以使用命令ipcrm -m shmid命令删除共享内存段,不然程序再运行有可能出错。

    下面用一个代码例子来使用共享内存

    我创建了一个结构体,想让结构体存入共享内存。写了两个程序,service和client,代码基本相同,不同就是service程序的开始创建共享内存。这两个程序是一个死循环,让你选择是存数据还是读数据还是销毁共享内存。代码写的不是很精致,主要是为了练共享内存,见谅哈。

    command.c文件,构造想存入的结构体,和共享内存的操作函数

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/types.h>
    #include<sys/shm.h>
    #include "Command.h"
    int sharememory(int ipc_size,int flag)
    {
    	int id;
    	key_t key=ftok("/tmp",66);
    	if(key < 0)
    	{
    		printf("get key error\n");
    		return -1;
    	}
    	id = shmget(key,ipc_size,flag);
    	if(id < 0)
    	{
    		printf("get id error\n");
    		return -1;
    	}
    	return id;
    }
    
    int create_ipc(int ipc_size)
    {
    	return sharememory(ipc_size,IPC_CREAT|IPC_EXCL|0666);
    }
    int get_ipc(int ipc_size)
    {
    	return sharememory(ipc_size,IPC_CREAT|0666);
    }
    int destroy_sharememory(int id)
    {
    	return shmctl(id,IPC_RMID,NULL);
    }

    command.h文件。好让service和client调用嘛,方便。

    #define NAME_LEN 20
    typedef struct {
    	char name[NAME_LEN];
    	int age;
    }ckx;
    int sharememory(int ipc_size,int flag);
    int create_ipc(int ipc_size);
    int get_ipc(int ipc_size);

    service.c文件。创建共享内存空间啦,读写等

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/shm.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include "Command.h"
    
    int main()
    {
    	int id=create_ipc(sizeof(ckx));
    	int i=0;
    	ckx *p;
    	if(id < 0)
    	{
    		printf("create sharememory error\n");
    		return 0;
    	}
    	id = 0;
    	while(1)
    	{
    		printf("\n\n1.input data to sharememory\n2.get sharememory data\n\
    3.destroy sharememory\ninput select:");
    		scanf("%d",&i);
    		if(i > 3 |i< 1)
    		{
    			printf("input error\n");
    			continue;
    		}
    		
    		id = get_ipc(sizeof(ckx));
    		if(id < 0)
    		{
    			printf("get sharememory error\n");
    			break;
    		}
    		p = (ckx *)shmat(id,NULL,0);
    		if(p < 0)
    		{
    			printf("get sharememory addr error\n");
    			p = NULL;
    			break;
    		}
    		
    		if(i == 1)
    		{
    			char name[NAME_LEN];
    			int age=0;
    			
    			printf("input name:");
    			fflush(stdin);
    			getchar();
    			gets(name);
    			printf("input age:");
    			scanf("%d",&age);
    			
    			strcpy(p->name,name);
    			p->age = age;
    			printf("write success\n");
    
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    			}
    			id = 0;
    		}
    		if(i ==  2)
    		{
    			printf("name:%s \t age:%d\n",p->name,p->age);
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    				break;
    			}
    			id = 0;
    		}
    		if(i == 3)
    		{
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    				break;
    			}
    			break;
    		}
    	}
    	if(id !=0)
    	{
    		if(destroy_sharememory(id)<0)
    		{
    			printf("destroy error\n");
    		}
    	}
    }
    

    client.c基本上就和service.c代码差不多啦,只是想体现共享内存嘛,service读写和client读写,观察现象,体现共享内存

    #include<stdio.h>
    #include<sys/shm.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/types.h>
    #include<stdlib.h>
    #include "Command.h"
    
    int main()
    {
    	int i=0;
    	ckx *p;
    	int id = 0;
    	while(1)
    	{
    		printf("\n\n1.input data to sharememory\n2.get sharememory data\n\
    3.destroy sharememory\ninput select:");
    		scanf("%d",&i);
    		if(i > 3 |i< 1)
    		{
    			printf("input error\n");
    			continue;
    		}
    		
    		id = get_ipc(sizeof(ckx));
    		if(id < 0)
    		{
    			printf("get sharememory error\n");
    			break;
    		}
    		p = (ckx *)shmat(id,NULL,0);
    		if(p < 0)
    		{
    			printf("get sharememory addr error\n");
    			p = NULL;
    			break;
    		}
    		
    		if(i == 1)
    		{
    			char name[NAME_LEN];
    			int age=0;
    			fflush(stdin);
    			getchar();
    			printf("input name:");
    			gets(name);
    			printf("input age:");
    			scanf("%d",&age);
    			
    			strcpy(p->name,name);
    			p->age = age;
    			printf("write success\n");
    
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    			}
    			id = 0;
    		}
    		if(i ==  2)
    		{
    			printf("name:%s \t age:%d\n",p->name,p->age);
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    				break;
    			}
    			id = 0;
    		}
    		if(i == 3)
    		{
    			if(shmdt(p) == -1)
    			{
    				printf("shmdt error\n");
    				break;
    			}
    			break;
    		}
    	}
    	if(id !=0)
    	{
    		if(destroy_sharememory(id)<0)
    		{
    			printf("destroy error\n");
    		}
    	}
    	
    	
    }
    

     

    展开全文
  • YARN的共享存储服务

    2019-05-29 00:25:33
    文章目录前言YARN的共享存储服务的起源YARN的共享存储服务架构共享存储服务的组件构成共享存储服务的流程后续改进工作参考文献 前言 在YARN上运行的任务,在任务正式开始运行之前,需要有一步资源的localization的...

    前言


    在YARN上运行的任务,在任务正式开始运行之前,需要有一步资源的localization的过程,然后用户的任务才能顺利地跑起来。这个”资源“可以是用户依赖的库文件等任务运行所需要的文件。这些资源文件被YARN中此任务对应的Container所共享,这些Container会从一个共享存储的地方去下载这个资源文件。那么在此之前,这个资源文件还需要被上传到一个共享存储的地方。本文,笔者将要阐述的主题就是关于共享存储的主题。

    YARN的共享存储服务的起源


    在YARN早期的实现中,YARN将HDFS作为一个中间资源文件的存储媒介,然后后续的Container task根据资源路径从HDFS中download下文件。这个资源文件并不是完全共享的,它只作用于当前所属的应用,更准确地来说,它只作用于某个applicationId。在这种模式下,假设后续有完全相同的任务再次被执行,它还是要上传完全一样的文件到HDFS中,这无疑造成了带宽的浪费。

    于是,YARN实现了一种真正意义上的完全共享的存储服务,它可以跨应用间提供资源的共享服务,下面开始进入本文的主题。

    YARN的共享存储服务架构


    共享存储服务的组件构成


    YARN的共享存储服务并没有实现在现有的RM服务中,而是另外实现了一个独立的服务来做这个事情,名为ShardCacheManager。在这个Manager内,具体模块包含以下:

    • SharedCacheUploaderService,缓存资源上传服务,用以上传用户的资源文件。
    • CleanerService,缓存资源清理服务,清理stale的资源文件。
    • ClientProtocolService,用户提交使用资源的协议。
    • SCMAdminProtocolService,共享存储服务管理员接口服务,目前只要用于外界人工触发启动cleaner服务。
    • SCMStore,共享存储资源的元数据信息存储,目前SCM只维护了in memory的存储,还并不支持persist的外部存储。

    共享存储服务的流程


    当我们说一个任务启动的时候,它是如何将自己的资源文件上传到YARN的共享存储服务中,供后续其它应用的使用呢?下面我们来简单看看里面的过程。

    1)任务在正常执行YARN内部的localization之后,判断是否启用共享存储的服务,如果启用了,则调用ClientProtocolService接口,上传资源文件到SCM服务中。
    2)SCM进而会触发SharedCacheUploaderService来上传用户的资源文件,在这里资源文件的区分方式是以它的checksum值作为唯一区分标志key,然后再结合一定的目录深度。目录深度的引入是为了防止一个目录下文件数量过多导致性能下降。同时还有appId的传入,意为此appId对该资源的一个引用。对应地,有一个释放资源的接口,两个客户端使用接口定义如下:

    Path use(String checksum, String appId)
    boolean release(String checksum, String appId);

    如上面use接口定义的,当应用在请求使用一个已有资源的情况时,它会得到一个HDFS的path,然后直接从这个path里去取得资源。
    3)对应共享存储服务而言,它的定位是足以支持大规模量级的缓存资源文件,它不仅在目录级别做了深度划分的处理,其次它实现了一种基于staleness的资源清除策略。此规则策略大致如下:
    1.每个共享存储资源在SCMStore中除了标志key信息外,还额外附有1)最近访问时间2)引用计数值信息。
    2.当满足没有应用引用该共享存储资源并且他的最近访问时间距离当前时间已经超过stale阈值时,cleaner服务即可以将此资源从HDFS中删除了。SCM以此达到一个比较稳定的资源存储量。

    按照上述的步骤,流程图如下所示:

    在这里插入图片描述

    后续改进工作


    当然在后续还是有很多东西可以进行继续完善的,比如设计Security方面的控制,token,authorization的管控,SCM服务和RM的localization服务之间的协同合作等等。

    回过头来看YARN的共享存储服务,整体实现较为轻量级,因为实际存储过程完全依赖了HDFS,所以过程也比较清晰,简洁。用一句话来概括其实现,SCM是基于HDFS之上实现了一个二次资源存储管理系统。

    参考文献


    [1].https://issues.apache.org/jira/browse/YARN-1492 . truly shared cache for jars (jobjar/libjar)

    展开全文
  • 共享存储挂载

    2018-12-19 13:22:15
    root下确定共享存储大小: fdisk -l mkdir oradata 创建文件系统mkfs.ext4 /mnt/sdba 创建挂载点 mkdir /mnt/sdba 将分区挂在到本地目录mount /dev/sdb /oradata
  • 共享存储技术

    2014-11-26 11:16:33
    共享存储技术 n 什么是共享存储 共享存储,指的是多台服务器访问(写)同一个存储设备的同一个分区。通俗一点讲就是说系统允许多个用户(进程)共享同一份文件。如果不提供此功能,就意味着凡是需要该文件的用户,...
  • vmware配置共享存储

    千次阅读 2019-07-04 09:47:22
    说明:在使用VM安装oraclre rac时需要建立共享存储。oracle rac共享存储的建立有多重方式,博主选择了操作比较简单的方案。当前有两个虚拟机vm1和vm2。在虚拟机关闭的状态下。进行虚拟机的设置。 VM1操作 为vm1...
  • Iscsi实现共享存储

    千次阅读 2017-10-20 15:19:41
    Iscsi实现共享存储平台:Openstatic Centos6.8作为服务端 RHEL7.2作为客户端搭建iscsi共享存储 关于网卡只能识别出一个网卡的问题,重启NetworkManager服务 systemctl restart NetworkManager.service 配置网卡...
  • kubernetes 共享存储原理

    千次阅读 2018-01-02 09:05:06
    共享存储原理 1、pv详解 pv作为存储资源,主要包括:存储能力、访问模式、存储类型、回收策略、后端存储类型等关键信息的设置。pv的关键配置参数如下: 存储能力 capacity:storage=5Gi 访问模式 access modes...
  • esxi存储(外部共享存储

    千次阅读 2018-05-27 19:57:00
    vSphere 基础物理架构中存储是一个非常关键的部分,没有好的存储,虚拟化也就没有存在的价值,并且它能够决定其...通过搭建共享存储,实现虚拟机的迁移与管理。 三、实验步骤: 1、在10.200主机上安装openfiler,...
  • 题目:创建一个共享存储区,大小4个字节(int大小)。创建一个子进程,然后子父进程独自运行。父进程写入一个数字到共享存储区,子进程在共享存储区把该数字读出。 代码量很少,纯属应付作业 笔者在telnet上写这些...
  • ESXi挂载NFS共享存储

    千次阅读 2019-10-16 14:24:58
    通常VMware的整体架构由三个部分组成,虚拟化环境(包括ESXi与vCenter以及VM),交换机...本文介绍的是通过NFS协议挂载共享存储上的VS01卷,共享存储上已经赋予ESXi主机访问该卷的权限。 1. 登陆vCenter,点击ESXi...
  • NFS共享存储服务

    千次阅读 2018-06-05 09:53:08
    目录1 什么是NFS2、NFS工作原理2.1 NFS共享与客户端挂载结构图2.2 什么是RPC2.3 NFS工作流程2.4 NFS参考资料3 搭建NFS共享存储服务3.1 配置环境3.2 nfs多个进程功能介绍3.3 NFS服务启动的进程说明3.3 NFS Server端的...
  • test-1与test-2都是vmwarevcenter中的虚拟机,在同一台服务器下,现在要搭建一个高可用集群进行测试,需要共享存储,谨参照https://blog.csdn.net/chinagissoft/article/details/52909374,来实现vmwarevcenter下的...
  • 虚拟机vmware 模拟共享存储

    千次阅读 2018-06-14 15:23:19
    虚拟机vmware 模拟共享存储使用VMWARE安装RAC,需要模拟两台主机和一个共享存储。在VMWare里面可以使用vmware-vdiskmanager工具来创建一块或几块共享磁盘来模拟共享存储。下面简单介绍一下vmware-vdiskmanager的使用...
  • 共享存储区通信

    千次阅读 2018-06-07 11:16:27
    实验内容:使用系统调用shmget(),shmat(),shmctl()编制一长度为1K的共享存储区发送和接收的程序。实验要求:(1)为便于操作和观察结果,用一个程序作为“引子”,先后FORK()两个子进程,SERVER和CLIENT,进行...
  • Centos配置NFS共享存储

    2019-02-20 14:32:45
    在集群中经常要对用户家目录等信息进行统一管理,便需要将Home文件夹作为共享存储分享给整个集群;所以在这里记录一下NFS共享存储的配置过程 NFS服务器 安装 NFS 和 rpcbind 服务 检查是否已经安装 # rpm -q nfs...
  • iSCSI存储用作Proxmox VE的LVM共享存储 椅栏听风舞0人评论7274人阅读2018-08-20 12:20:00 本例测试环境: DELL R620 E5-2630 v2,128G,250SSD*2,Raid1 三台,安装Proxmox VE 5.X Synology DS1817+...
  • 展开 vSphere 基础物理架构中存储是一个非常关键的部分,没有好的存储,虚拟化也就没有存在的价值,并且它能够决定...通过搭建共享存储,实现虚拟机的迁移与管理。 三、实验步骤: 1、在10.200主机上安装openf...
  • OpenStack添加iscsi共享存储

    千次阅读 2018-08-31 17:14:28
    作者:独笔孤行@TaoCloud OpenStack支持多种类型后端存储,包括NFS、Ceph、GlusterFS、FC、iSCSI等...1.在cinder节点上用iscsi命令iscsi共享存储: [root@OpenStackNewton ~]# iscsiadm -m discovery -t st -p 192...
  • VMware Workstation中的虚拟共享存储 所周知,Windows群集是Windows服务器中非常重要的一部分,为此,我们正式需要共享存储和至少两个节点来配置Windows服务器上的群集服务。如今,一天的VMware工作站如火如荼,...
  • oracle rac 共享存储结构

    千次阅读 2016-01-13 15:10:16
    oracle rac 共享存储结构
  • 共享存储热迁移虚拟机

    千次阅读 2018-08-16 20:52:14
    装完之后关闭系统,添加一块硬盘用作共享存储。 openfiler页面配置iscsi 配置允许哪个网段可以访问 创建lvm卷,(pv、vg、lv) pv 选择硬盘 VG LV 启动服务 映射 为...
  • 文章目录一:什么是共享存储服务二:NFS的优缺点2.1:NFS的优点2.2:NFS的缺点三:部署NFS共享存储服务3.1:环境需要3.2:服务搭建 一:什么是共享存储服务 NFS(Network File System)即网络文件系统,是FreeBSD...
  • Linux HA集群——共享存储

    千次阅读 2018-05-21 17:55:28
    为什么需要共享存储 绝大多数集群都使用共享存储。那why?集群中要保证重要资源的可用性。资源可能运行在任意节点,可能需要访问相同的文件。如果集群资源只处理静态文件,那就不需要共享存储。如果文件改动不频繁...
  • ISCSI共享存储

    2019-07-07 10:16:54
    常见存储方式 DAS 直连式存储 主板---线---硬盘 IDE SATA SAS NAS 共享文件系统(NFS,samba) SAN 共享块设备,没格式化(iscsi---廉价版的SAN) 标准SAN:光纤 分布式存储 Iscsi基本原理 iSCSI网络磁盘,共享硬盘和...
  • 进程间通信-共享存储

    2015-07-24 17:14:16
    共享存储  进程间通信方式之一,创建一个共享存储区,各个进程通过在指定地址或者内核选用第一个可用地址来对共享存储区进行数据的读写操作达到进程间数据交互。对同一个共享存储区操作,会涉及到对同一块数据进行...
  • NFS共享存储服务介绍及搭建方法

    千次阅读 2020-07-12 13:54:08
    NFS共享存储服务介绍及搭建方法 文章目录NFS共享存储服务介绍及搭建方法一、NFS共享服务介绍二、搭建NFS共享服务三、常见故障处理 一、NFS共享服务介绍 NFS(Network File System)网络文件系统 1、依赖于RPC...
  • Oracle之利用iscsi构建RAC共享存储测试

    万次阅读 2017-02-24 12:44:49
    iscsi 共享存储 oracle rac asm 共享存储

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,245
精华内容 20,898
关键字:

共享存储