安装PBFT to red hat 7.2
1.安装Red Hat 7.2
物理机:ubuntu 12.04+虚拟机:kvm
使用虚拟机管理程序virt-manager安装red hat 7.2(ISO文件:enigma-i386-disc1.iso+enigma-i386-disc2.iso)
在建立虚拟机的步骤5的高级选项的网络模式中选择"Specify shared device name",使用网桥br0.在ubuntu中设置网桥
auto lo iface lo inet loopback auto br0 iface br0 inet static bridge_ports eth0 address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1
选择"Installation Type"时,选择custom安装.
给磁盘分区
根据在ubuntu中建立的网桥地址设置ip(本人ip设置为192.168.1.150),不使用dhcp方式
输入root密码并建立一个用户
选择"Package Group Selection"时只保留"Network Support"和"Software Development".在勾选"Individual Package Selection"之后把"Applications/Internet中的openssh相关的都选上并安装依赖包.这样总的安装大小只有494MB
开始安装,安装过程中要更换一次光盘,使用virt-manager安装的话光盘很好更换,从"显示图形控制台"切换到"显示虚拟硬件详情"栏,把IDE CDROM断开连接,更换新的iso文件之后就可以使用了
安装完成后把IDE CDROM断开再重启系统
2.设置Red Hat 7.2
1.配置ssh并实现无密码登录
在red hat中使用scp把从enigma-i386-disc1.iso中把openssh-server-2.9p2-7.i386.rpm拉取到本地,并安装好,此时"rpm -qa |grep openssh"会显示openssh-client,openssh-server都已经装好了
在物理机上
ssh-keygen -t rsa scp id_rsa.pub york@192.168.1.150:/home/york
在虚拟机上修改/etc/ssh/sshd_config为
RhostsAuthentication yes
RhostsRSAAuthentication yes
RSAAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
并把pub文件输入authorzied_keys, 并修改authorized_keys权限为600, 并复制authorized_keys为authorized_keys2
cat id_rsa.pub >> .ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys2
此时应当可以无密码连接(物理机连虚拟机)了
2.使用root用户修改开机时间 "vi /etc/grub.conf",把timeout改成1
3.利用自启动服务配置程序ntsysv把sendmail服务取消
4.修改/home/用户/.bash_profile,在PATH后面添加:/sbin:/usr/sbin:/usr/local/sbin:/usr/kerberos/sbin这几个路径。然后执行命令:source .bash_profile,这是修改用户的环境变量,使用户可以使用其它命令
3.安装程序
1.把gmp-5.0.5.tar.bz2, sfs-0.6.tar.gz, vim-7.3.tar.bz2, bft-base-src-rh72.tar.gz通过scp拷贝到虚拟机上
依次安装vim,, gmp, sfs
./configure
make
make install
安装sfs时要创建sfs组和用户,再configure,make,make install
groupadd sfs;useradd -g sfs sfs
2.最后编译bft的libbyz,在此之前先要把sfs和gmp的头文件文件夹做链接
ln -s /usr/local/include/sfs-0.6 sfs ln -s ~/bft/gmp-5.0.5 gmp
再修改sfs(/usr/local/include/sfs-0.6)中的rabin.h的函数(line 62,line 102)
-- Patch the file sfs/rabin.h to add the following method to rabin_pub: bool verify (const char *msg, const unsigned sz, const bigint &s) const { bigint m; E2 (m, s); D1 (m, m); sha1ctx sc; sc.update (msg, sz); return post_verify (&sc, m, nbits); } and the following method to rabin_priv: bigint sign (const char *msg, unsigned len) const { sha1ctx sc; sc.update(msg, len); bigint m = pre_sign (&sc, nbits); E1 (m, m); D2 (m, m, rnd.getword ()); return m; }
注释gmp/gmp.h中的4行(line 2227)
#ifdef __cplusplus __GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr); //__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr); //__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr); __GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr); //__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr); //__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr); #endif
最后编译libbyz(在libbyz中运行make)
3.编译difs和simple
把simple的makefile中的LIBDIRS一行后面加" -L/usr/local/lib/sfs-0.6/"(注意空格)
然后make就可以通过编译
4.配置pbft
1.把config_private做链接到simple中,把config_private/config也复制到simple中
ln -s ../config_private/
cp config_private/config .
2.按需求修改配置文件config(server放在前面,后面才是client,我需要mbft_0作为client 其他的作为replica)
generic 1 1800000 5 234.5.6.8 3669 mbft_1 192.168.1.151 3669 bfaa873efc926cb91646a89e45f96582041e3eed35cde0ef60b5c006cfad883781ee807411b0df3c74dc3ebbbce59c21d67711c83ecf596357c23dba33da338fb5577179a3b6188c59590aa1301eb852c0e14fa9225c0b377fee944eb9fa110ad7a316269e4b13b153887426a347c7c3c5feb1e3107bac4c6e29327b3343c405 mbft_2 192.168.1.152 3669 bfaa873efc926cb91646a89e45f96582041e3eed35cde0ef60b5c006cfad883781ee807411b0df3c74dc3ebbbce59c21d67711c83ecf596357c23dba33da338fb5577179a3b6188c59590aa1301eb852c0e14fa9225c0b377fee944eb9fa110ad7a316269e4b13b153887426a347c7c3c5feb1e3107bac4c6e29327b3343c405 mbft_3 192.168.1.153 3669 bfaa873efc926cb91646a89e45f96582041e3eed35cde0ef60b5c006cfad883781ee807411b0df3c74dc3ebbbce59c21d67711c83ecf596357c23dba33da338fb5577179a3b6188c59590aa1301eb852c0e14fa9225c0b377fee944eb9fa110ad7a316269e4b13b153887426a347c7c3c5feb1e3107bac4c6e29327b3343c405 mbft_4 192.168.1.154 3669 bfaa873efc926cb91646a89e45f96582041e3eed35cde0ef60b5c006cfad883781ee807411b0df3c74dc3ebbbce59c21d67711c83ecf596357c23dba33da338fb5577179a3b6188c59590aa1301eb852c0e14fa9225c0b377fee944eb9fa110ad7a316269e4b13b153887426a347c7c3c5feb1e3107bac4c6e29327b3343c405 mbft_0 192.168.1.150 3669 bfaa873efc926cb91646a89e45f96582041e3eed35cde0ef60b5c006cfad883781ee807411b0df3c74dc3ebbbce59c21d67711c83ecf596357c23dba33da338fb5577179a3b6188c59590aa1301eb852c0e14fa9225c0b377fee944eb9fa110ad7a316269e4b13b153887426a347c7c3c5feb1e3107bac4c6e29327b3343c405 5000 150 9999250000 // The format is: // Service name // Maximum number of faults // Authentication period (ms) // Number of principals (excluding group) // IP multicast group address and port // domain_name IP_address port public_key_base16 // .... (x Number of principals) // Then the replica specific portion // view change timeout in mseconds // status timeout in mseconds // recovery timeout in mseconds
3.在/etc/hosts中第一个非注释行添加(应该当被第一个检测)
192.168.1.150 mbft_0
至此,在simple下运行./server是可以建立起replica的
4.使用virt-manager拷贝虚拟机,拷贝完成后需要进行设置
进入/etc/hosts;修改ip和主机名
/etc/sysconfig/network修改主机名;
利用netconfig修改ip地址;
完成之后进入simple,mbft_1-4号机上执行./server mbft_0号机上执行./client就可以看到执行结果了
(详细的出错原因和调试过程在此处省略,需要查阅的请猛戳http://www.cnblogs.com/york-hust/category/394202.html查看安装log)