博文

目前显示的是 九月, 2007的博文

在Freebsd下用geom作软RAID

嗯,Freebsd截至到6.x,都还只支持raid-0和raid-1,不支持raid5。
下面说如何利用geom框架中的gmirror实现raid1。
假设有两块空的数据盘,/dev/da1,/dev/da2。要求大小一样。
首先把/dev/da1和/dev/da2联合成一个磁盘data,调度算法采用round-robin
#gmirror label -v -b round-robin data da1 da2
然后加载gmirror。
#gmirror load
此时在/dev/mirror 下就有一个叫做data的盘了。
然后初始化这个盘
#fdisk -vBI /dev/mirror/data
#bsdlabel -wB /dev/mirror/datas1
#newfs -U /dev/mirror/datas1a
然后按照平常的方式挂载即可
#mount /dev/mirror/data /data1
为了让gmirror能够开机自动加载,需要把这句话追加到/boot/loader.conf中
geom_mirror_load="YES"
然后,如果为了加载方便,那么请在/etc/fstab中增加一条挂载项。

MYSQL5 新建从库的步骤

由于误操作等种种原因,MYSQL的主从库之间经常会发生不同步的问题。解决办法是停掉从库,删除所有数据。并按以下步骤重建从库。
1、mysql_install_db --datadir=/data1/slavevar
2、在/data1/slavevar下设置my.cnf
主库的my.cnf示例
[mysqld]
log-bin=mysql-bin
server-id=1
port = 3306
socket = /tmp/mysql.sock
从库的my.cnf示例
[mysqld]
log-bin=mysql-bin
server-id=2
port = 3307
socket = /tmp/mysql.3307.sock
relay-log = /data1/slavevar/localhost-relay-bin
3、chown -R mysql:mysql slavevar
4、/usr/local/etc/rc.d/mysql-server-slave start
5、登陆主库
FLUSH TABLES WITH READ LOCK;
然后运行
SHOW MASTER STATUS
并记录下状态
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000005 | 223 | | |
+------------------+----------+--------------+------------------+
6、从主库中dump出所有数据
mysqldump -hlocalhost -uroot -p --all-databases --master-data > dbdump.db
7、释放主库的锁
在mysql下运行
unlock tables;
8、启动从库
/usr/local/l…

新浪网招聘高级研发工程师(多名)

1)新闻发布系统高级研发工程师
岗位职责:参与新闻发布系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、熟悉HTTP协议及W3C相关互联网规范,熟练掌握XHTML、CSS、DIV、Javascript技术;
3、具备2年以上的互联网行业Unix/Linux/FreeBSD下的C/C++开发经验,熟悉面向对象的软件设计方法,熟悉设计模式的应用;
4、熟练掌握Perl编程语言,至少有1年的Perl开发经验;
5、熟练掌握MySQL数据库应用,具备数据库应用系统的规划及设计能力;
6、具备良好的代码编程习惯及较强的文档编写能力;
7、具备强烈的进取心、求知欲及团队合作精神,有较强的沟通及协调能力;
8、具备CMS系统开发经验者优先考虑;
欢迎优秀人才加盟,一旦录用,待遇从优!联系邮箱: job@vip.sina.com
2)新闻抓站系统高级研发工程师
岗位职责:参与新闻抓站系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、具备良好的代码编程习惯及较强的文档编写能力,有较强的沟通及协调能力;
3、具备1年以上的Solaris或Linux或FreeBSD下的C/C++开发经验,有扎实的C/C++根基;
4、熟悉Unix下的系统编程和网络编程,熟悉面向对象的软件设计方法;
5、熟悉HTTP协议及W3C相关互联网规范,熟练掌握XHTML、CSS、Javascript技术;
6、熟练掌握MySQL数据库应用,具备数据库应用系统的规划及设计能力,具有熟练的mysql维护能力。
7、熟悉Perl编程语言
如具有以下开发经验或者技能更佳:
1、有内容管理系统的开发经验
2、有Web Mining领域相关专业背景或知识
欢迎优秀人才加盟,一旦录用,待遇从优!联系邮箱: job@vip.sina.com
3)新闻搜索系统高级研发工程师
岗位职责:参与新闻搜索系统的规划、研发、维护等工作;
任职要求:
1、重点综合性大学计算机或相关专业本科以上毕业, 英语4级以上, 能熟练阅读英文文档;
2、具备良好的代码编程习惯及较强的文档编写能力,有较强的沟通及协调能力;
3、精通C/C++/Java中至少一门开发语言,熟悉面向对象的软件设计方法,熟悉设计模式的应用;
4、对算法设计,数据结构有深…

几种lock

lockf(), fcntl(2), and flock(2) 相容。
flockfile与flock没有关系。flockfile一般是用pthread_mutex实现的,一个带计数的锁,该锁被最近一次调用flockfile的线程所拥有。
调用flockfile时,如果该stream未被调用过flockfile或者拥有者不是当前线程,则尝试获取锁(此处可能会陷入等待),并将计数器初始化为1。
如果上次调用flockfile的就是此线程,则counter的计数加一。
调用funlockfile时,如果锁的拥有者不是当前线程,则释放锁,否则计数器减一。
计数器归0后,锁被释放。
flockfile适合被用于同一个进程内多个线程间的带计数的同步。

FreeBsd的PID库使用说明

pidfile_open打开一个文件,例如/var/run/httpd.pid,然后使用flock锁住这个文件。
如果锁文件失败,说明有同样的进程正在跑,那么从该文件中把pid读出来,并返回。
这个函数可以在fork之前调用。
pidfile_write函数把pid写入到刚才打开的pid文件中。
pidfile_close关闭刚才打开的pid文件,应该在fork开始一个子进程之后调用。
pidfile_remove删除pid文件
示例代码:struct pidfh *pfh; pid_t otherpid, childpid; pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid); if (pfh == NULL) { if (errno == EEXIST) errx(EXIT_FAILURE, "Daemon already running, pid: %d.", otherpid); /* If we cannot create pidfile from other reasons, only warn. */ warn("Cannot open or create pidfile"); } if (daemon(0, 0) == -1) { warn("Cannot daemonize"); pidfile_remove(pfh); exit(EXIT_FAILURE); } pidfile_write(pfh); for (;;) { /* Do work. */ childpid = fork(); switch (childpid) { case -1: syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno)); break; case0: pidfile_close(pfh); /* Do child work. */b…

Berkeley DB 学习笔记

Berkeley DB 的数据库 目前提供四种访问方式:Btree, Hash, Queue和Recno。每个数据库是以什么样的方式创建的,以后就必须用什么样的方式访问。
对用户而言,Berkeley DB内存储的都是key-pair这样的键值对。
对于Btree,在插入、删除一条记录的时候,其它记录的record number也会随之而改变。而Queue不变。Recno可设置为改变或不改变(默认是不改变)。
Hash不支持Logical record number。
Btree:
采用已排序的、平衡树的结构存储数据。查询、插入、删除的效率都是0(logN)。
既支持按key查找,也支持按record number查找。
Hash:
以hash的结构存储数据。采用的方式是“Extended Linear Hashing”
Queue和Recno只存储data,key是由数据库内部产生一个logical record number来唯一标识每条记录。
Queue:
每条记录的长度固定。(即每条记录的最大长度必须实现已知)
可以使用get方法从队列的头部原子化的获取并删除记录。
支持记录级别的锁,因之比Recno具有更高的并发度。
在插入、删除一条记录的时候,其它记录的record number不会改变。
Recno:
每条记录的长度固定或不定。
可采用一个flat text file做后存储。
如果记录的长度不定,且采用了一个flat text file做后存储,则需要设置一个特殊的字节做为记录的结束符。如果没有设置,默认是'\n'。如果有多个进程要同时向其插入/删除数据,则需要一次把整个后存储文件读入,否则只在调用get的时候读入必须的行。而且应该只有一个进程设置了flat text file,且该进程需要设置DB_SNAPSHOT参数。
对于二进制数据,可以采用出现频率最小的数字(d)做为结束符,在插入的时候把原始数据中出现d的地方后面再加一个d。
例如以下的代码向/tmp/make.conf中追加一行intmain(int argc,char* argv[]){ setlocale(LC_ALL,""); DB* db; db_create(&db,NULL,0); ///此处应该先ftrylockfile /tmp/mak…

再说BSD/Linux的su

用惯了Linux的人再去用BSD的时候,很多都会抱怨说为什么只有wheel组的人才能su? wheel是一个什么东西?
在gnu版的su的man页的末尾,有这么一段 Richard Stallman 的 解释:
Sometimes a few of the users try to hold total power over all the
rest. For example, in 1984, a few users at the MIT AI lab decided to
seize power by changing the operator password on the Twenex system and
keeping it secret from everyone else. (I was able to thwart this coup
and give power back to the users by patching the kernel, but I wouldn't
know how to do that in Unix.)

However, occasionally the rulers do tell someone. Under the usual
`su' mechanism, once someone learns the root password who sympathizes
with the ordinary users, he or she can tell the rest. The "wheel
group" feature would make this impossible, and thus cement the power of
the rulers.

I'm on the side of the masses, not that of the rulers. If you are
used to supporting the bosses and sysadmins in whatever they do, you
might find this idea strange at first.

而现在,那么一个大机房很多个无盘工作站共用一个Unix机的状况已经很少见了。站在系统管理员的角度来想…

列出机器上所有的网卡

功能类似于ifconfig -l
仅限bsd 下使用#include <sys/types.h> #include <sys/socket.h> #include <ifaddrs.h> #include <iostream> intmain(int argc,char* argv[]){ struct ifaddrs* ifap; if(getifaddrs(&ifap)) return -1; while(ifap!=NULL){ std::cout<<ifap->ifa_name<<std::endl; ifap=ifap->ifa_next; } freeifaddrs(ifap); return0; }

玩栈溢出

voidmytrap(void){ puts("I win"); } intfunc(int c){ int buf[100]; buf[10]=c; ///把以前的返回地址存储起来///这里以前存储的是本函数的第一个参数的值 buf[102]=buf[101]; ///把栈中的返回地址给修改掉 buf[101]=&mytrap; return0; } intmain(int argc,char\* argv[]){ func(10); return0; } 以前我发现过windows xp自带的ftp客户端存在缓存区溢出的漏洞,并且在微软新闻组上报告了该漏洞。只是后来一两年也没发现过有关于它的补丁。

dbenv的问题

我的一个程序使用了berkeley db数据库,并且使用了env。但是这个程序偶尔会被其它的进程kill -9杀死。当它再次启动的时候,有可能会发现 env已经被损坏,然后就打开数据库环境失败。
解决办法是在打开env的时候加入这两个flags:DB_REGISTER|DB_RECOVER。这样一来,程序的启动速度就会明显慢很多,但是它会自动检查env并修复不一致。

站在面向对象的角度理解IPC

全局函数是特殊的对象序列化是对象的7大基本元素之一webserivce、sun rpc,所要解决的第一个问题就是如何把函数的参数序列化。对于sun rpc,它采用了xdr,对于webservice,它采用了xml(soap)函数自身也可被序列化,不过它很简单,例如只需要找一个唯一的标识符来表示它。sun rpc采用整数(程序号、版本号、函数号),webservice采用自身的一套xml规范。序列化完成后所要做的就是选择恰当的传输协议传输过去。相比而言,sun rpc很自由,tcp、udp、unix domain socket都可以,而web service则是主要使用http,也有udp的规范,还有smtp的但是很少使用。对于同主机内的ipc,它无法采用unix domain socket这样的高效方式。记得有人说
web service = http + xml + rpc<

升级了下blog所用的wordpress

晚上没事儿做,就升级了下blog所用的wordpress。从2.0.x升级到2.2.x。开始的时候总是失败,反复的download、upload,更新、回滚,后来发现是我以前所用的统计软件 firestat 和这个版本的wordpress不兼容。唉……删了它!
感觉wordpress的可视化编辑器还是太弱太弱了。不过新版本加了export功能,是我比较喜欢的。