2013年5月30日星期四

网络层点到点, 传输层端到端

在 TCP/IP 详解 卷一:协议 的第一章的总结部分有这样一句话: "网络层和运输层之间的区别是最为关键的: 网络层(IP)提供点到点的服务,而运输层(TCP和UDP)提供端到端的服务"  这句话本身有些抽象, 从网上找到了对于这句话的一些补充和解释.

2013年5月29日星期三

ubuntu update-rc.d 和 chkconfig 命令

在 redhat 和 centos 上可以用 chkconfig 来管理系统服务的启动, 但在 ubunut 上 12.04 还可以使用 chkconfig ,但在 12.10 起默认就没有安装 chkconfig 了, 当然可以通过 apt install chkconfig 来进行安装并使用. 今天主要是想说一下 debian/ubuntu 上可以替代 chkconfig 的命令 update-rc.d 命令.

2013年5月16日星期四

ubuntu vps 安装和设置

ubuntu vps  安装和设置。 对于 ubuntu vps 安装和设置的一系列记录。

1. 初始化安装后的设置
基于 ubuntu-12.04 32bit minimal, 使用 root 登陆到 vps 后, 新建用户:
adduser demo
根据提示创建用户和密码。下面将新建的这个用户添加到 sudo 用户组:
usermod -aG sudo demo
更新系统并安装 vim
apt-get update
apt-get upgrade
apt-get install vim
接下修改 sshd 的端口和登陆账号限制, 首先修改 /etc/ssh/sshd_config 文件
vim /etc/ssh/sshd_config Port 65536
PermitRootLogin no
修改 ssh 端口为 65536, 不允许 root 登陆,最后再添加如下一行到配置文件的最后
AllowUsers demo
设置仅允许 demo 账号登陆
2. 安装 lemp 环境(linux nginx mysql php) 首先安装 mysql-server
apt-get install mysql-server
因为默认安装的 mysql-server 比较占用内存,对于小内存的 vps 来说,需要进行一些优化,具体的可以参见 小内存 vps mysql 优化 这篇文章,在这里我再重复一下

cp /etc/mysql/my.cnf /etc/mysql/my.cnf.`date +%s`
find /usr/share/doc/mysql* -name my-small.cnf -exec cp {} /etc/mysql/my.cnf \;
sed -i 's/\[mysqld\]/&\nuser = mysql\n/' /etc/mysql/my.cnf
然后再修改 /etc/mysql/my.cnf 文件, 在 [mysqld] 下添加以下两行
 innodb=OFF 
default-storage-engine=MyISAM
然后重启mysql
/etc/init.d/mysql restart 
现在再下,经过以上几步的优化,vps 内存的占用大概只有 30m 左右,接下来安装 nginx 和php
apt-get install nginx
service nginx start
apt-get install php5-fpm
然后修改 /etc/php5/fpm/php.ini 文件
cgi.fix_pathinfo=0
然后重启 php5-fpm
service php5-fpm restart
然后开始配置 nginx 使其支持 php5-fpm, 首先备份一下default 配置文件
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
将 default 配置文件中的下面这段的注释给取消掉
       location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                # fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        } 
并将 server {} 段里面的 index 中添加 index.php

然后修改 /etc/php5/fpm/pool.d/www.conf 文件,将其中的 listen = 127.0.0.1:9000 修改为 listen = /var/run/php5-fpm.sock 然后重启 php5-fpm service php5-fpm restart
接下安装 phpmyadmin apt-get install phpmyadmin 并根据提示填写 mysql 的 root 密码, 注意,因为要使用nginx ,所以在 webserver 选择这里不要选择. 安装完成后 ln -s /usr/share/phpmyadmin/ /usr/share/nginx/www , 这样就可以通过 ip/phpmyadmin 的方式来访问 phpmyadmin 了, 在这里可能会有个报错说 The mysqli extension is missing , 解决办法是修改 /etc/php5/fpm/php.ini 文件,添加 extension=mysqli.so 然后重启 php5-fpm 和nginx 就可以了
最后打算再说一下 ftp ,设置为 限定指定的用户可以登录的方法
userlist_enable=YES //用户清单功能开启
userlist_deny=NO //把用户清单设为接受用户清单
userlist_file=/etc/vsftpd.user_list //用户清单文件为/etc/vsftpd.user_list
因为第二个语句把文件/etc/vsftpd.user_list设为接受用户清单,那么,文件里
面的用户名都能登录,不在文件里的用户不能登录。
从这里可以看出userlist_deny语句起了开关的作用,可把用户清单文件设为拒绝或是接受

2013年5月15日星期三

小内存 vps mysql 优化 (ubuntu)

小内存 vps mysql 优化 (ubuntu)

手里有个 512m 的vps ,安装的是 ubuntu 12.04; 使用 tasksel 安装 lamp 应用后,默认的内存占用大概在 350m 左右。 我以为是因为 apache 的原因,就打算使用 lemp ( linux + nginx + php-fpm + mysql ),手动安装 mysql-server: apt-get install mysql-server  后发现内存占用竟然也达到了 300m, 看来问题主要在 mysql-server 上。所以开始查找优化的方案。

首先参照 http://wiki.ubuntu.org.cn/Vps 上的教程对 mysql 进行优化

cp /etc/mysql/my.cnf /etc/mysql/my.cnf.`date +%s`
find /usr/share/doc/mysql* -name my-small.cnf -exec cp {} /etc/mysql/my.cnf \;
sed -i 's/\[mysqld\]/&\nuser            = mysql\n/' /etc/mysql/my.cnf

然后重启 mysql-server

/etc/init.d/mysql restart
 
然后再看内存占用,发现比之前少了一些,但是并不是很明显。
 
因为我只是安装 wordpress, 永不倒 innodb ,所以需要再进行如下优化
 
编辑 /etc/mysql/my.cnf 
 
在[mysqld] 下添加两行
 
innodb=OFF
default-storage-engine=MyISAM

然后重启 mysql

/etc/init.d/mysql restart 
 
再看内存占用情况,wonderful !只有 30多m 了! 


2013年4月22日星期一

perl dump 数据的几种方式

在使用 Perl 语言的过程中,经常会需要打印或者 dump 一个变量的数据内容。 因为 perl  的 There‘ is more than one way to do it 。 所以可以选择的方式也肯多,所以自己也就总结了一下自己京城使用的到的几种方法:
   1:  #!/usr/bin/perl
   2:  use warnings;
   3:  use strict;
   4:  use Data::Dump qw(dump);
   5:  use Data::Dumper;
   6:  use Smart::Comments;
   7:  use YAML;
   8:   
   9:  my @a = (1, [2, 3], {4 => 5});


我这里要对数组 @a 进行 dump 以方便调试和查看其内容。
从我 use 模块也可以看出来我要使用的几种方法:

(1)首先尝试 Data::Dump  的 dump 方法
 
   1:  dump(@a);

其对应的输出为:

   1:  (1, [2, 3], { 4 => 5 })


(2)尝试  Data::Dumper  的 Dumper 

   1:  print Dumper(@a);

其对应的输出为:

   1:  $VAR1 = 1;
   2:  $VAR2 = [
   3:            2,
   4:            3
   5:          ];
   6:  $VAR3 = {
   7:            '4' => 5
   8:          };



(3) 尝试 Smart::Comments 的  ###

   1:  ### @a;


其对应的输出为:

   1:  ### @a: [
   2:  ###       1,
   3:  ###       [
   4:  ###         2,
   5:  ###         3
   6:  ###       ],
   7:  ###       {
   8:  ###         '4' => 5
   9:  ###       }
  10:  ###     ]


(4)  尝试 YAML 里面的 Dump 函数

   1:  print YAML::Dump(@a);


其对应的输出为:

   1:  --- 1
   2:  ---
   3:  - 2
   4:  - 3
   5:  ---
   6:  4: 5
 

(5) 最后尝试一下 print 函数

   1:  print "@a";

其对应的输出为:

   1:  1 ARRAY(0x1acf998) HASH(0x1aece20)


综述:以上几种方法,可以看到各有个的不同,也有侧重点,比如 Data:Dump  几乎是按照代码里面的数据结构输出了; YAML::Dump 是以 yaml 格式输出, 而 print 方法最简单,但是却无法打印内嵌的哈希元素,智能打印其引用的内存地址,这当然不是我们想要的。 Smart::Commnets  的输出很适合进行调试。 所以根据自己的需要各取所需了。   我这里只是列出了 5中方法,参考下面的这篇可以看到更多种方法的对比。
Dumping data in Perl
http://oylenshpeegul.typepad.com/blog/2012/01/dumping-data-in-perl.html

2013年3月25日星期一

linux没有扩展名的概念

记得以前工作的时候就犯过一个错,认为 linux win 一样都有扩展名的概念, 结果给程序带来了不少问题。

这里也提醒下开始接触 linux 的朋友, linux 下没有扩展名的概念,所有的 .XXX 只是为了方便你去辨识是哪类文件而已。
GCC文件后缀名:
  .c为后缀的文件,C语言源代码文件; 
  .a为后缀的文件,是由目标文件构成的档案库文件; 
  .C,.cc或.cxx 为后缀的文件,是C++源代码文件; 
  .h为后缀的文件,是程序所包含的头文件; 
  .i 为后缀的文件,是已经预处理过的C源代码文件; 
  .ii为后缀的文件,是已经预处理过的C++源代码文件; 
  .m为后缀的文件,是Objective-C源代码文件; 
  .o为后缀的文件,是编译后的目标文件; 
  .s为后缀的文件,是汇编语言源代码文件; 
  .S为后缀的文件,是经过预编译的汇编语言源代码文件。

2013年3月24日星期日

owncloud 私有云平台 (1): 编译 windows client

最近因为工作需要,接触了 owncloud 私有云平台,感觉真的很不错; 最特别的是其 app 扩展功能, 任何人都可以为依据这个私有云平台开发插件和应用, 目前这个平台已经可以集成 email rss  等相关应用, 我认为以后可能还会集成 blog 或者 微博等相关应用,这样这款应该就可以真正的成为个人应用云平台。

 

下面转入正题,owncloud windowslinuxandroid ios 的客户端, 这里主要说一下 owncloud windows client 的编译过程。

1. 首先是编译环境,基于 opensuse 12.1 x64 版本,因为要在 linux 上编译 windows 程序,因此需要构建交叉编译环境。 构建这交叉编译环境是个力气活,因为要添加各种源,还有各种依赖要去解决和安装,所以花的时间比较长。 这里可以参考一下官方的文档 这篇文档。(在这里我建议在虚拟机里面安装 opensuse 并构建交叉编译环境,这样就可以将安装好的编译环境导出备份,以做后用。)

2. 编译过程。 只要交叉编译环境搭建好之后,剩下的就比较顺利了。

   <code>

   #  cd ~

   #  mkdir owncloud-client

   #  cd owncloud-client

   #  git clone git://git.csync.org/users/freitag/csync.git ocsync

   #  git clone git://github.com/owncloud/mirall.git

   #  mkdir ocsync-build

   #  mkdir mirall-build

   #  cd ocsync

   #  git checkout dav

   #  cd ocsync-build

   #  mingw32-cmake -DCMAKE_BUILD_TYPE="Debug" ../ocsync

   #  mingw32-make

   #  cd ../mirall-build

   #  cmake -DCMAKE_BUILD_TYPE="Debug" ../mirall \

      -DCSYNC_BUILD_PATH=/home/speed/owncloud-client/ocsync-build \

      -DCSYNC_INCLUDE_PATH=/home/speed/owncloud-client/ocsync/src \

      -DCMAKE_TOOLCHAIN_FILE=../mirall/admin/win/Toolchain-mingw32-openSUSE.cmake

   #  mingw32-make

   #  sudo mingw32-make package

  </code>

 

3. 最后看到 owncloud-1.2.2-setup.exe generated  这个字样就可以了,说明 windows 客户端编译完成了。

 

参考文章:owncloud 官方文档: https://github.com/owncloud/mirall/blob/master/doc/building.rst

          另外一篇文档     https://gist.github.com/Noxwizard/4011094

 

定制自己的 linux 发行版

首先援引一条官方新闻

 

"日前工信部软件与集成电路促进中心正式宣布与 Canonical 达成协议,双方未来将合力打造专为中国市场而设的 Ubuntu 麒麟(Ubuntu Kylin)操作系统基准架构,为中国的硬件、软件开发者提供参考。据悉在四月的时候基于 Ubuntu 13.04Raring Ringtail)的版本就会上线,其中会加入具有中国特色的农历、输入法、音乐服务等,未来百度地图、交通资讯、淘宝购物、照片编辑、WPS 等功能也均会被整合到系统之中。" ( 以上文字来自 瘾科技 Engadget )

 

 

看了这条新闻之后还是有些欣慰,毕竟光明正大的和开源社区合作要比银河麒麟涉嫌抄袭 FreeBSD 要好。 好吧转入正题吧,说一下定制自己的 Ubuntu 发行版。

 

为什么要定制呢,可能每个人的原因都不一样,比如说我很不喜欢 Ubuntu unity,系统经常动不动就报错。 如果你只是想换其他的桌面环境的话,你可以直接到 Ubuntu 官方下载包含不同桌面环境的光盘镜像,目前我知道的有, kubuntuKED),xubuntu xfce), lubuntu lxde),其他的还有很多, 如果你不满足以上官方给出的镜像, 你还可以尝试一下定制自己的  Ubuntu 发行版。 链接给出:  http://code.google.com/p/ubuntu-builder/   也就是 Ubuntu build   不过这里还是要吐槽一下, 这个和 http://susestudio.com   相比还是逊色不少。 如果你对 suse 或者 opensuse 感兴趣的话, 可以尝试一下 susestudio.com 功能真的很赞。

2013年3月23日星期六

linux 终端下漂亮的字体

自己有一台奔4, 512m 的老爷本,安装的 debian 7 + lxde 图形界面环境; 因为自己的台式机上一直使用的是  ubntu , ubuntu 默认的 teminal  的字体就比较漂亮; 今天使用  lxde  上  lx 终端, 字体默认是  Monospace ,而且还不是等宽字体, 感觉真的好丑,连写代码的欲望都没有; 随即 google 了一下, 发现 linux 迷 推荐的linux 终端下最漂亮的字体,于是就安装了 Droid Sans Mono 这款字体。

安装方法很简单: sudo apt-get install ttf-droid

瞬间感觉棒及了!   mark 一下

2013年3月8日星期五

搭建 ipv6 测试环境 (一)

因为最近要做了一个 ipv6 cdn 加速项目,所以开始着手准备 ipv6 相关的测试环境,从网上搜出来不少相关的文章:有一篇介绍是通过 DynamipsGUI vmware 来搭建ipv6 测试网络; 照着做了下,发现比较复杂,仅仅是 DynamipsGUI 的设置就比较麻烦; 后来看到老外的一篇文章,在 he.net 申请 ipv6 隧道,会获得一个 /64 ipv6 子网, 但因为 he.net 隧道要就客户端这边的 endpoint 要有独立的 ip 才行, 所以我就绕了个弯子; 在自己的美国的 vps 有独立的 ipv4 地址 建立了一个 ipv6 隧道,然后再搭建给予 TAP openvpn 服务器,并安装  radvd 服务进行 ipv6 地址的路由; 这样的话,我处于内网的电脑,通过 openvpn 连接到我的  vps 上面,组建一个网络;这样,我处于内网的 电脑就可以获得公网 ipv6 地址了。  这个方案总体满足了测试的需求,并且可以从公网访问。 但是这个方案也有很多的不足,首先就是 openvpn 协议收到  gfw 的影响,很难连的上,第二就是网络延迟比较大,不适合进行测试。 对于 openvpn 协议受到干扰的问题,有好几种方法,整体思路就是修改报文的指纹,使得 gfw 无法认出 openvpn 协议,所以就无法干扰了。 但是对于网络的高延迟这块,就没有办法解决了。 后来因为项目搁浅的原因,我也去忙其他的了。

 

今天因为这个项目又有点消息了,我就又从网上查了一些资料,其中看到 https://wiki.ubuntu.com/IPv6  ubuntu 的关于 ipv6 的相关文档。 有看了一篇 ibm 的一篇关于搭建 ipv6 测试环境的文章 http://www.ibm.com/developerworks/cn/linux/l-cn-ipv6env/ 我就尝试了在我的 vmware 局域网中的一台 Ubuntu 服务器上 安装  radvd  服务,并配置了 ipv6 子网; 我发现处于局域网内的其他设备默认就配置好了 ipv6 地址了。 通过测试,发现完全满足自己的 ipv6 需求。

 

下面简单总结一下安装和设置的步骤:

1.       开启 ipv6 的转发功能, 修改 /etc/sysctl.conf  文件,开启 ipv6 的转发功能 去掉对 net.ipv6.conf.all.forwarding=1 的注释),并 sudo sysctl �p  使生效。

 

2.       安装 radvd 服务 (基于  Ubuntu 12.04): sudo apt-get install  radvd

 

3.       配置 ipv6 静态 ip地址; /etc/network/interfaces  中添加下面配置

 

iface eth1 inet6 static

        address 2002:9ba:b4e:6::1

            netmask 64

4.       编辑 /etc/radvd.conf 文件

 

interface eth1

{

   AdvSendAdvert on;

   prefix 2002:9ba:b4e:6::/64

   {

        AdvOnLink on;

        AdvAutonomous on;

   };

};

5 重启 radvd 服务, /etc/init.d/radvd restart

 

现在看下你局域网里的其他设备是不是已经设置好了 ipv6 的地址了