Using a loopback device for storage  使用环回设备用于存储

关于环回设备

环回设备 (loopback device)

Linux内核用结构体struct net_device表示一个网络设备接口,该结构体的成员hard_start_xmit是个函数指针,用于完成数据报在网络上的发送工作,其原型是:
    
int (*hard_start_xmit)( struct sk_buff *skb, struct net_device *dev );
    skb
是待发送的数据缓冲区,dev是该网络设备接口本身的一个指针。
    
环回设备接口由于是把数据报发给本机,所以其发送数据报函数比较特别,他把skb稍加处理后,又转回给协议栈的数据报接收函数netif_rx。其发送函数的函数名是loopback_xmit
   

  首先,loopback_xmit调用skb_orphanskb孤立使他跟发送socket和协议栈不再有任何联系,也即对本机来说,这个skb的数据内容已发送出去了,而skb相当于已被释放掉了。skb_orphan所做的实际事情是,首先从skb->sk(发送这个skb的那个socket)sk_wmem_alloc减去skb->truesize,也即从socket的已提交发送队列的字节数中减去这个skb,表示这个skb已发送出去了,同时,假如有进程在这个socket上写等待,则唤醒这些进程继续发送数据报,然后把socket的引用计数减1,最后,令sk->destructorskb->sk都为NULL,使skb完全孤立。实际上,对于环回设备接口来说,数据的发送工作至此已全部完成,接下来,只要把这个实际上还未被释放的skb传回给协议栈的接收函数即可。
    
在传回去之前,还需要做一些工作,因为协议栈在发送数据报时,为数据报打以太网首部时,skb->data是指向以太网首部的开始位置的,网络设备接口传回的数据报是需要已剥离了以太网首部的,所以令skb->data加上ETH_HLEN(14),令skb->mac.raw指向原来data的位置,即以太网首部。然后,需要确定skb->pkt_type的值,即该数据报的类型,假如以太网首部中的目的mac地址是个组播或广播地址,则skb->pkt_typePACKET_BROADCASTPACKET_MULTICAST,关于MAC地址类型的判断方法以后再周详分析。否则,假如目的mac地址不等于本接口设备的mac地址,则skb->pkt_typePACKET_OTHERHOST,否则就为默认值PACKET_HOST。最后,配置skb->protocol(ETH_P_IPETH_P_ARP或其他),配置skb->dev,再更新一下统计值,把skb交回给协议协栈即可。
    struct net_device更有一些跟协议栈的处理流程关系比较密切的成员函数,下面一一介绍。
    hard_header,该成员被以太网设备驱动程式用于为每一个待发送数据报构建以太网首部,系统中任何以太网设备驱动程式共享一个函数即eth_header。任何数据报在传递给该函数之前,其skb头部预留了以太网首部的空间,data成员指向网络层首部,eth_headerdata成员指向以太网首部,并为以太网首部填入目的以太网地址,源以太网地址和网络层协议类型(ETH_P_IPETH_P_ARP),该函数在协议栈中主要有两处被用到,一是ARP模块中,发送ARP请求或应答前,构建以太网首部用;另一处是在IP数据发送过程中,构建以太网首部用。
    hard_header_cache,用于创建以太网首部的高速缓冲,每一个邻居节点都有一个struct hh_cache *hh成员,用于缓冲该邻居节点的以太网首部,有了这个缓冲,以后再向这个邻居发数IP数据的时候,不必再调用hard_header构建以太网首部,而是直接从hh中拷贝即可。

If you want to use a loopback device instead of another partition, follow these instructions.

  1. mkdir /srv   

  2. dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=1000000

    (modify seek to make a larger or smaller partition

    dd是转换并复制文件命令,参数if指输入文件,of指输出文件,bs是每次读写bs大小的bytes,count是指复制count个输入块。调整seek参数的值以分配分区大小,swift-disk的大小=1024*1000000)
  3. mkfs.xfs -i size=1024 /srv/swift-disk    #i是指inode_options,size是指文件系统的inode大小是1024bytes

  4. 编辑 /etc/fstab 增加   /srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0    
    #  /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看。当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录,详细介绍 参数loop:表示loop设备 参数noatime:Do not update inode access times on this  filesystem  (e.g,  for faster access on the news spool to speed up news servers).
    参数 nodiratime: Do not update directory inode access times on this filesystem.
    参数nobarrier:This disables the use of write barriers in the jbd code.Write barriers enforce proper on-disk ordering of journal commits, making volatile disk write caches safe  to  use,  at some performance penalty.If  your  disks  are  battery-backed  in  one  way or another, disabling barriers may safely improve performance. 
    参数logbufs:Set  the  number  of in-memory log buffers. 默认值是8,表示文件系统的块大小是64KiB。 **Kibibyte是一种资讯计量单位,代表1024字节,即210字节,一般简称为KiB
  5. mkdir /mnt/sdb1
  6. mount /mnt/sdb1
  7. mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4

  8. chown -R swift:swift /mnt/sdb1/*

  9. for x in {1..4}; do ln -s /mnt/sdb1/$x /srv/$x; done

  10. mkdir -p /etc/swift/object-server /etc/swift/container-server /etc/swift/account-server /srv/1/node/sdb1 /srv/2/node/sdb2 /srv/3/node/sdb3 /srv/4/node/sdb4 /var/run/swift

  11. chown -R swift:swift /etc/swift /srv/[1-4]/ /var/run/swift – Make sure to include the trailing slash after /srv/[1-4]/

  12. Add to /etc/rc.local (before the exit 0):  mkdir /var/run/swift chown swift:swift /var/run/swift   #/etc/rc.local 是一个开机可自动执行的任务脚本,也就是说,如果你想让电脑在开机时自动执行的任务、程序,只要写进其中即可/var/run 目录中存放的是自系统启动以来描述系统信息的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值