关于环回设备
环回设备 (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_orphan把skb孤立,使他跟发送socket和协议栈不再有任何联系,也即对本机来说,这个skb的数据内容已发送出去了,而skb相当于已被释放掉了。skb_orphan所做的实际事情是,首先从skb->sk(发送这个skb的那个socket)的sk_wmem_alloc减去skb->truesize,也即从socket的已提交发送队列的字节数中减去这个skb,表示这个skb已发送出去了,同时,假如有进程在这个socket上写等待,则唤醒这些进程继续发送数据报,然后把socket的引用计数减1,最后,令sk->destructor和skb->sk都为NULL,使skb完全孤立。实际上,对于环回设备接口来说,数据的发送工作至此已全部完成,接下来,只要把这个实际上还未被释放的skb传回给协议栈的接收函数即可。
在传回去之前,还需要做一些工作,因为协议栈在发送数据报时,为数据报打以太网首部时,skb->data是指向以太网首部的开始位置的,网络设备接口传回的数据报是需要已剥离了以太网首部的,所以令skb->data加上ETH_HLEN(14),令skb->mac.raw指向原来data的位置,即以太网首部。然后,需要确定skb->pkt_type的值,即该数据报的类型,假如以太网首部中的目的mac地址是个组播或广播地址,则skb->pkt_type为PACKET_BROADCAST或PACKET_MULTICAST,关于MAC地址类型的判断方法以后再周详分析。否则,假如目的mac地址不等于本接口设备的mac地址,则skb->pkt_type为PACKET_OTHERHOST,否则就为默认值PACKET_HOST。最后,配置skb->protocol(ETH_P_IP,ETH_P_ARP或其他),配置skb->dev,再更新一下统计值,把skb交回给协议协栈即可。
struct net_device更有一些跟协议栈的处理流程关系比较密切的成员函数,下面一一介绍。
hard_header,该成员被以太网设备驱动程式用于为每一个待发送数据报构建以太网首部,系统中任何以太网设备驱动程式共享一个函数即eth_header。任何数据报在传递给该函数之前,其skb头部预留了以太网首部的空间,data成员指向网络层首部,eth_header将data成员指向以太网首部,并为以太网首部填入目的以太网地址,源以太网地址和网络层协议类型(ETH_P_IP或ETH_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.
mkdir /srv
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)mkfs.xfs -i size=1024 /srv/swift-disk #i是指inode_options,size是指文件系统的inode大小是1024bytes
编辑 /etc/fstab 增加 /srv/swift-disk /mnt/sdb1 xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0
参数 nodiratime: Do not update directory inode access times on this filesystem.
# /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).
参数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。- mkdir /mnt/sdb1
- mount /mnt/sdb1
mkdir /mnt/sdb1/1 /mnt/sdb1/2 /mnt/sdb1/3 /mnt/sdb1/4
chown -R swift:swift /mnt/sdb1/*
for x in {1..4}; do ln -s /mnt/sdb1/$x /srv/$x; done
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
chown -R swift:swift /etc/swift /srv/[1-4]/ /var/run/swift – Make sure to include the trailing slash after /srv/[1-4]/
Add to /etc/rc.local (before the exit 0): mkdir /var/run/swift chown swift:swift /var/run/swift #/etc/rc.local 是一个开机可自动执行的任务脚本,也就是说,如果你想让电脑在开机时自动执行的任务、程序,只要写进其中即可,/var/run 目录中存放的是自系统启动以来描述系统信息的文件