Ubuntu下部署FastDFS 5.05

  很早前得知这样一个开源分布式的文件存储方案,一直没有正式的使用过,正好这次相册升级可以试试了,起初以为fastdfs也是通过block来优化小文件存储的,实际上也是文件形式管理,可以预见大量的小文件还是会有问题,可能更好的解决方案是淘宝TFS。不过fastdfs已远远满足我的需求了。而且及其轻量,这货在google code上早已停止更新,最新的版本可以在这里获取,目前下载的最新版本是5.05,更新于2014-12-02。在这里可以找到更多的说明。

  下载好后,server端分为两个部分,一个是tracker,一个是storage。顾名思义,前者调度管理,负载均衡,后者则是实际的存储节点。两个都能做成集群,以防止单点故障。以前的4.x版本依赖libevent,现在不需要了,只需要libfastcommon。安装方法如下:

1. 下载安装libfastcommon

git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon/
./make.sh
./make.sh install

确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。

这时候需要设置环境变量或者创建软链接

export LD_LIBRARY_PATH=/usr/lib64/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

2. 下载安装fastdfs

tar xzf FastDFS.tar.gz
cd FastDFS/
./make.sh
./make.sh install

确认make没有错误后,执行安装,默认会安装到/usr/bin中,并在/etc/fdfs中添加三个配置文件。

3. 修改配置文件
首先将三个文件的名字去掉sample,暂时只修改以下几点,先让fastdfs跑起来,其余参数调优的时候再考虑。
tracker.conf 中修改

base_path=/usr/fastdfs #用于存放日志。

storage.conf 中修改

base_path=/usr/fastdfs-storaged #用于存放日志。
store_path0=/usr/fastdfs0 #存放数据,若不设置默认为前面那个。
tracker_server=192.168.29.132:22122 #指定tracker服务器地址。

client.conf 中同样要修改

base_path=/usr/fastdfs #用于存放日志。
tracker_server=192.168.29.132:22122 #指定tracker服务器地址。

4. 启动tracker和storage

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

5. 检查进程

root@ubuntu:~# ps -ef |grep fdfs
root       7819      1  0 15:24 ?        00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
root       8046      1  0 15:36 ?        00:00:01 fdfs_storaged /etc/fdfs/storage.conf start

表示启动ok了,若有错误,可以在/usr/fastdfs目录下检查日志。

6. 上传/删除测试
使用自带的fdfs_test来测试,使用格式如下:

root@ubuntu:~# fdfs_test /etc/fdfs/client.conf upload /home/steven/01.jpg 
...
group_name=group1, ip_addr=192.168.29.132, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKgdhFTV0ZmAP3AZAPk-Io7D4w8580.jpg
...
example file url: http://192.168.29.132/group1/M00/00/00/wKgdhFTV0ZmAP3AZAPk-Io7D4w8580.jpg
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKgdhFTV0ZmAP3AZAPk-Io7D4w8580_big.jpg
...
example file url: http://192.168.29.132/group1/M00/00/00/wKgdhFTV0ZmAP3AZAPk-Io7D4w8580_big.jpg

使用fdfs_delete_file来删除文件,格式如下:

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgdhFTV11uAXgKWAPk-Io7D4w8667.jpg

可以看到,上传ok了,这里会生成两个文件,这是fastdfs的主/从文件特性,以后再介绍。example file url是不能在浏览器中直接打开的,除非配合nginx使用,这里我不需要了。删除文件需要完整的group_name和remote_filename。

编译Open-JDK-7详细记录

  本次编译的系统环境是Ubuntu Linux 64-bit,编译用户root。需要以下软件包的依赖,如果是新的环境直接复制粘贴到终端即可,如果系统有了也不会重复安装的,建议安装之前把软件仓库update一次。

apt-get install mercurial build-essential gawk m4 openjdk-6-jdk ant 
libasound2-dev libcups2-dev libxrender-dev xutils-dev binutils libmotif3 
libmotif-dev zip libfreetype6-dev xorg-dev x11proto-print-dev

1、下载OpenJDK的源代码

hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev/
chmod 755 get_source.sh
./get_source.sh

2、设置环境变量

#语言选项
export LANG=C

#bootstrap jdk路径
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64

#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线程数,按CPU核数配置就可以了,我这机器是i7 8核
export HOTSPOT_BUILD_JOBS=8
export ALT_PARALLEL_COMPILE_JOBS=8

#与之前编译的版本做比较,没意义,跳过即可
export SKIP_COMPARE_IMAGES=true

#使用预编译的头文件,不加慢些
export USE_PRECOMPILED_HEADER=true

#要编译的内容,这里只编译了JDK和LANGTOOLS。
export BUILD_LANGTOOLS=true
export BUILD_JDK=true

#不需要打包
export BUILD_DEPLOY=false
export BUILD_INSTALL=false

#设置编译输出的目录
export ALT_OUTPUTDIR=/root/jdk7u-bin

#取消系统java环境变量
unset JAVA_HOME
unset CLASSPATH

  这里要求系统先装一个JDK环境,编译OpenJDK7至少要求OpenJDK6以上,因为编译期间有很多java语言写的过程,这个叫做“Bootstrap JDK”,我这是用apt-get安装的,所以默认路径如此。更多配置信息可以参考源代码目录下的README-builds.html。

3、编译

  用env确认下变量没错的话就可以进行编译了,如果有错误,依据错误提示修正后用make clean清理一次,再执行编译。

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

  这样可以记录下编译的日志,不需要也可以直接make all,我这里编译大概需要15分钟就可以了,看到以下信息表示成功。

#-- Build times ----------
Target all_product_build
Start 2013-12-24 13:04:19
End   2013-12-24 13:21:02
00:01:41 corba
00:04:18 hotspot
00:00:16 jaxp
00:00:19 jaxws
00:09:34 jdk
00:00:32 langtools
00:16:43 TOTAL

4、运行检测

  进入之前配置的输出目录下的bin,执行java -version可以看到build里面加入了用户机器名

root@dorole.com:~/jdk7u-bin/bin# ./java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00)
OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)

  Java的编译和解释就算ok了,接下来还要测试下jvm是否正常。进入jdk7u-bin/hotspot/outputdir目录,可以发现有子目录linux_amd64_compiler2/,前面的linux是根据宿主系统来决定的,我们这里是linux,amd64不用多说,compiler2表示Server VM,compiler1表示Client VM。进入后又有子目录分别对应了不同的优化级别,优化级别越高,性能越牛叉,生成的代码越难以调式,具体哪个目录下有内容得看make的参数,我这里是在product/下面。

  虚拟机的启动器名字叫gamma,先编辑目录下的env.sh,可以看到默认的JAVA_HOME并不是我们自己编译的,修改下即可。可以执行目录下的test_gamma脚本来进行测试,这个脚本主要是调用javac去编译jdk7u-dev/hotspot/make/test/Queens.java,并执行解八皇后问题。

  直接执行gamma可能会失败,因为找不到新编译出来的libjvm.so文件,没关系加入到系统就好了。在/etc/ld.so.conf.d中建立java.conf,内容为libjvm.so所在目录。再执行ldconfig即可。

root@dorole.com:/etc/ld.so.conf.d# cat java.conf
/root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product

root@dorole.com:/etc/ld.so.conf.d# ldconfig
root@dorole.com:/etc/ld.so.conf.d# ldconfig -p | grep jvm
        libjvm.so (libc6,x86-64) => /root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product/libjvm.so

  看到有最后一行的输出就可以了,再回到gamma目录,执行就可以了。

root@dorole.com:~/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product# ./gamma -version
Using java runtime at: /root/jdk7u-bin
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00)
OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)

  到此,整个编译OpenJDK就算完成了。

端午随想

  每次回家,总会找到久违的感动。

  05年配的一台台式机,毕业后一直放在家里用着,发现开机的时候有个Grub的界面一闪而过,想到好像装了个Ubuntu Linux在里面,重启后试着进去看了看,果然还是2.6的内核,系统自检提示硬盘已有1130天没检查过了,差不多3年没进过这个系统了。

  还好root密码没忘记,进入桌面后布局图标一切如此熟悉,大概那些年的大学就耗在这个上面了。Compiz特效管理器,估计是玩的最Hi的了,那时候最喜欢的3D立方体旋转桌面,拖动窗口的果冻效果,各种炫丽,各种花哨。在那个单核256内存xp横行的年代,ubuntu带来的华丽界面确实让人眼前一亮,从此与linux结下不解之缘。虽现在早已不作为主系统来用,但在服务器上还是天天用到,开源自由的思想依然最最赞美的。

  写这篇文章的时候IBus出现了问题,有些字符出不来,在云输入法帮助下敲完。放上一张Compiz Config截图。

Screenshot-CompizConfig设置管理器

尝试 Arch Linux

1. 前言

  折腾了多年的Ubuntu Linux,一直是依赖于图形界面,刚买vps那会儿居然连deb安装包都忘了该用什么命令了。试用过许多Linux的发行版,数Ubuntu用的时间最长,优点还是蛮多的:

  1. 中文支持比较完善
  2. 软件仓库丰富
  3. 驱动齐全
  4. 优雅的主题

  等等。当然缺陷也不少,相对openSUSE和Fedora,稳定性较差,系统臃肿,etc目录文件混乱,不易整理。

  喜欢简洁点的,Arch就是个不错的选择,安装镜像才340M,默认不带图形界面。更多可参考官网,下载地址:http://www.archlinux.org/download/

2. 使用U盘安装

  想想以前几乎每个Ubuntu新版本发布都是刻DVD,太不环保了。即使有了DVD-RAM还是得花不少时间来刻,所以这次选择U盘安装。上次在amazon标错价16g金士顿u盘才卖66元,幸运的捡了一个。在Linux中可以使用dd将ISO直接复制到U盘并制作成可引导的系统盘,命令如下:

sudo dd if=*.iso of=/dev/sdb bs=4M

/dev/sdb 为U盘所在的设备

  这样处理后的U盘,在windows系统中将无法使用,需要在磁盘管理器中再次格式化即可恢复。用U盘引导后直接进入安装,安装方法屏幕都有提示。需要注意的是在Arch中推荐将/boot单独作为一个分区,大小100m即可,在Ubuntu中则很随意。关于交换分区,我指定了一个分区为swap格式就无法格式化,删除后忽略即可通过。

接下来是选择软件包,这里最好将base和base-devel都选中,后面很多东西都是要编译安装的。mbr信息可以写在/dev/sda上。其中在安装grub的时候会打开编辑器编辑grub配置,如果有windows系统记得在这里取消最后几行注释,很简单。

3. 安装网卡驱动

  大概几分钟的样子,就装完了。重启后就直接到了shell环境了,登录后发现没有网卡驱动,这可是最重要的一个硬件,这个不装好后面的都白搭。我acer笔记本是broadcom的网卡,其具体型号可以用lspci命令看到,我的是Netlink 57780,找一台能上网的或者手机到broadcom官网下载驱动,地址:http://www.broadcom.com/support/ethernet_nic/downloaddrivers.php

  全部解压后只需make && make install,再重启即可完成网卡驱动的安装,具体可参考tg3-3.116j.tar.gz中的readme.txt。

  折腾到此暂告一段落,离正真使用还差很远,有时间再来整图形界面。

Ubuntu Linux中连接Android真机调试

首先确保用数据线链接后能识别设备,输入:lsusb,可以看到类似输出

dorole@ubuntu:~$ lsusb
Bus 002 Device 006: ID 0bb4:0c87 High Tech Computer Corp.
Bus 002 Device 004: ID 0402:9665 ALi Corp.
Bus 002 Device 003: ID 04fc:05da Sunplus Technology Co., Ltd
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0951:1643 Kingston Technology
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

这样手机的vendor id和描述就出来了,第一条即是,htc的机器硬件id一般都是0bb4。

在/etc/udev/rules.d/目录下建立50-android.rules规则文件,内容如下:

SUBSYSTEM==”usb”, ATTR{idVendor}==”0bb4″, MODE=”0666″

修改后重启udev服务

dorole@ubuntu:/$ sudo /etc/init.d/udev restart

切换到android sdk的platform-tools目录下,重启adb服务,再输入adb devices就应该能找到设备了。

dorole@ubuntu:~/android-sdk-linux_x86/platform-tools$ sudo ./adb kill-server
dorole@ubuntu:~/android-sdk-linux_x86/platform-tools$ sudo ./adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
dorole@ubuntu:~/android-sdk-linux_x86/platform-tools$ sudo ./adb devices
List of devices attached
SH0CDPL00575    device

这样就可以在eclipse中的DDMS来调试android真机了,有些步骤是需要root权限的。