yaron's space
以技术为主
以技术为主
三 28th
drupal没有wordpress普及,但是功能应该比wordpress更强大,有以下8个用途:
项目主页:http://drupal.org
1. 文件存储分享站点
使用Drupal创建文件分享,你可以使用 CCK 和 Views ,也包括一些模块,比如Media Mover, Filebrowser 或者 Web File Manager。看看Box.net,你会非常感兴趣的^_^。
2. 社交网站
在社交网络能力方面,Drupal可能是最好的CMS。Drupal提供了强大的用户管理和权限管理系统。但是如果你想创建强大的社交网站,就需要一些模块,见http://drupal.org/node/206724。
你想看一些案例?Imbee 或者 GoingOn。
3. Twitter Clone
建议你不要尝试利用Drupal创建Twitter竞争产品,但是,如果你想整合Twitter功能到你的站点,Drupal的微博模块 可以帮到你。
4. 新闻News portal
如果你想创建新闻站点或杂志站点,Drupal的完美的选择。使用CCK 和 Views ,你可以创建所有的发布内容类型,并且可灵活列表。这样的新闻站点非常之多,比如New York Observer。
5. 博客网络
用Drupal创建博客网站,很轻松,甚至无需额外模块。看看 Wisebread吧。
6. 视频分享站点
这类站点太耗带宽了,如果你决定创建,那么Drupal来帮你实现吧。FlashVideo 模块提供了创建Youtube克隆的强大能力,它整合了CCK,转换视频到FLV,并有分享代码。另外你也可以尝试Media Mover 和 SWF Tools 。MTV UK 站点就是Drupal创建的。
7. 图片分享站点
Image module ,这个模块将派上用场,可让你创建类Flickr站点,很好很强大。MyFinePix 就是Drupal创建的照片分享站点。
8. 类Digg-like news site
感谢 Drigg module, 这个模块可帮助你快速建立Digg克隆站点。流行的设计社交新闻网Designbump在使用Drupal。
三 17th
1. uptime命令
输出:09:32:17 up 8:41, 1 user, load average: 0.01, 0.00, 0.00
其中8:41代表系统已经运行8小时41分
2.查看/proc/uptime
[yangguang@sim124 ~]$ cat /proc/uptime 31351.83 31341.94 #第一个数字代表已经运行的时间 #可以用date命令来计算出系统的启动时间 [yangguang@sim124 ~]$ date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M:%S" 2011-03-17 00:50:51 #使用date命令计算系统的运行时间 [yangguang@sim124 ~]$ cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d秒\n",run_days,run_hour,run_minute,run_second)}' 系统已运行:0天8时45分27秒
三 16th
fnv全称”Fowler/Noll/Vo”,特点是快速而且冲突率比较低,在url hostname或者ip的哈希有广泛的应用, 详细信息请点击这里
下面是fnv在Sheepdog中用法的实现,将任意字符串转化为uint64_t
/* * 64 bit FNV-1a non-zero initial basis */ #define FNV1A_64_INIT ((uint64_t) 0xcbf29ce484222325ULL) /* * 64 bit Fowler/Noll/Vo FNV-1a hash code */ static inline uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval) { unsigned char *bp = (unsigned char *) buf; unsigned char *be = bp + len; while (bp < be) { hval ^= (uint64_t) *bp++; hval += (hval << 1) + (hval << 4) + (hval << 5) + (hval << 7) + (hval << 8) + (hval << 40); } return hval; }
三 15th
该模块是作为sheepdog工作线程模块,存在多个工作线程,默认NR_WORKER_THREAD =64个工作线程;线程的入口函数为worker_routine,同时struct work_queue中pending_list是双向链表,worker_routine从该链表中读取任务,然后执行,接着将执行过的任务放到struct worker_info中finished_list双向链表,然后向main thread发送一个信号,接着调用bs_thread_request_done来执行finished_list中任务的done函数,该函数的作用是发送响应信息。涉及的文件主要是worker.c和Worker.h

| struct work_queue {
int wq_state; // int nr_active; //当前活跃的任务数目 struct list_head pending_list;//待执行的任务列表 struct list_head blocked_list; //没有用处了 }; struct worker_info { struct list_head worker_info_siblings;//链表的连接器,目前只有一个worker_info int nr_threads; //线程个数 pthread_mutex_t finished_lock; // struct list_head finished_list; /* wokers sleep on this and signaled by tgtd */ pthread_cond_t pending_cond; /* locked by tgtd and workers */ pthread_mutex_t pending_lock; /* protected by pending_lock */ struct work_queue q; pthread_mutex_t startup_lock; pthread_t worker_thread[0]; //工作线程的数据结构 }; |
这里需要特殊说明的是,有关任务Worker的属性WORK_SIMPLE和WORK_ORDERED,及有关block相关的函数,在0.2版本中应该是没有用处的,当时我也迷惑一阵。
Sheepdog存在三类的工作任务:
三 15th
1.
| struct sd_req {
uint8_t proto_ver; uint8_t opcode; //操作类型 uint16_t flags;// uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t opcode_specific[8]; }; |
struct sd_rsp {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t opcode_specific[7]; }; |
| 这两个数据结构应该是作为抽象类,可以看出sizeof(struct sd_req) == sizeof(struct sd_rsp),这个是设计者故意为之,因为在发送请求和接收响应时,客户端是使用同一片内存区域; | |
2.
| struct sd_obj_req {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint64_t oid;//object id uint64_t cow_oid; uint32_t copies;//副本个数 uint32_t tgt_epoch; uint64_t offset; }; |
struct sd_obj_rsp {
uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t copies; uint32_t pad[6]; }; |
| 对object进行请求及响应,这里需要说明的一点:object在Sheepdog中作为数据存储单元,分为data_object 和vdi_object,分别存储数据和vdi的元数据,即后面提到的sheepdog_inode的内容,分片大小为4M。不知作者为何分这么小的分片? | |
|
struct sd_vdi_req { uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint64_t vdi_size; //vdi的大小 uint32_t base_vdi_id; uint32_t copies; uint32_t snapid; uint32_t pad[3]; }; |
struct sd_vdi_rsp { uint8_t proto_ver; uint8_t opcode; uint16_t flags; uint32_t epoch; uint32_t id; uint32_t data_length; uint32_t result; uint32_t rsvd; uint32_t vdi_id; uint32_t pad[5]; }; |
|
对vdi进行有关操作的请求和响应 |
|
三 11th
1. ##连接符的用法
在C语言中,## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串,一般跟在宏定义参数的前面。
2.#转换符的用法
#转化符是将传递的参数作为字符串来进行处理。
例如定义如下宏:
#define pasrse( i ) printf( "token" #i " = %d", token##i ) //同时定义如下的变量 int token1 = 1;
则调用parse(1)的打印结果为:
#宏展开: printf("token" "1" "= %d", token1);
token1=1
3.宏定义的可变参数
在宏定义中使用可变参数,只需在参数后面加入”…”,然后使用##连接即可
例如下面的例子:
#define LOG_INFO(fmt, args...) \ do { \ log_write("LOG_INFO", __func__, __FILE__, __LINE__, fmt, ##args); \ }while(0) //其中log_write的原型为: void log_write(const char *level, const char *func, const char *file, int line, const char *fmt, ...);
三 9th
include/
lib/
sheep/
collie/
三 7th
在 Vim 命令模式下,移动游标定位于某一个位置,键入 ctrl-v后状态栏上出现 VISUAL BLOCK 字样,即进入纵向编辑模式。移动游标以按需选择待编辑的区域
我们将下面的例子来说明三种用法,序列
10.60.1.191 10.60.1.192 10.60.1.193
修改为序列:
ping -c 4 10.60.5.191 >> resultso ping -c 4 10.60.5.192 >> resultso ping -c 4 10.60.5.193 >> resultso
1>crtl – v 进入列编辑模式
2> G 移动光标至最后一行,选中所要编辑的列
3> r 进入修改模式
4> 输入数字5,并按esc退出输入模式
结果如下:
10.60.5.191 10.60.5.192 10.60.5.193
1>crtl – v 进入列编辑模式
2> G 移动光标至最后一行,可视块覆盖了第一列
3> I 进入行首插入模式
4> ping -c 4,并按esc退出输入模式
结果如下:
ping -c 4 10.60.5.191 ping -c 4 10.60.5.192 ping -c 4 10.60.5.193
1>crtl – v 进入列编辑模式
2>G 移动光标至最后一行,可视块覆盖了最后一列
3> A 进入行尾插入模式
4> <<result,并按esc退出输入模式
搞定….
参考资料:http://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/index.html?ca=drs-
三 4th
最近这两天一直在看sheepdog的源码,有关sheepdog的用法,请参考我的另一篇博客:KVM分布式共享存储解决方案-sheepdog 总的来说,sheepdog的代码量不是很大,在一万行左右,比起其他的分布式文件系统如kfs,ceph等还是比较轻量级的,而且定位也是针对qemu/kvm等volume的解决方案.
1. sheepdog是作为虚拟机kvm的volume使用的,是非普通的文件系统,这点和Amazon的EBS(Elastic Block Store)比较类似
2. sheepdog是一种对称(symmetric)的结构,各个节点的地位相同,没有中心节点,没有meta-server,使用Corosync 对物理节点进行管理
3. sheepdog中的对象存储分为两类,其一是One reader One Writer 其二是No writer multiple reader 而且对象是4M大小分片的,使用“一致性哈希”算法来确定对象存储位置,多副本存储
./collie/treeview.c ./collie/collie.c ./sheep/vdi.c ./sheep/store.c ./sheep/sdnet.c ./sheep/work.c ./sheep/sheep.c ./sheep/group.c ./lib/logger.c ./lib/event.c ./lib/net.c
sheep目录下是有关sheepdog的大部分逻辑的处理,部署在各个节点上
collie目录是作为管理管理sheep的代码
lib目录下是关于网络、日志和事件等处理模型
…..
今天暂时写到这里……待续
近期评论