Linux下查看与使用ISO文件

Linux下iso镜像文件可以直接用mount命令挂载到某个目录下,然后进行浏览操作,不需要专门的虚拟软件。

假设你的iso文件保存在 /data5/CentOS-5.6-i386-LiveCD.iso
  
1.创建一个目录作为挂载点(这个目录的位置随意,也可以直接使用根目录下的/mnt目录,这里我用/home/daniel/mnt为例)
$mkdir /home/junjie2/iso

2. 挂载iso文件
$sudo mount -o loop /data5/CentOS-5.6-i386-LiveCD.iso /home/junjie2/iso

3. 现在iso镜像里的文件都挂载到了/home/junjie2/iso目录下了,你到这个目录下看看就知道了
$ls
/home/junjie2/iso

linux中为何没有网卡设备文件

这个问题其实没有什么意思,知道了问题的答案能表明一个人技术水平有多高吗?不能!这个问题有答案以及有意义吗?答案都是没有!那我还为何一直对这 个问题死死揪住不放?这类问题可以提高一个人的素质以及了解一段关于网络和unix的历史,正是因为这些都很有趣,才如此值得关注。

在 unix中,一切io相关的实体都被抽象成了文件,之所以抽象成文件第一是为了接口统一,第二是为了操作统一,第三是为了策略隐藏,比如这样可以向用户屏 蔽掉具体设备的细节或者具体文件系统的细节,文件抽象有块抽象和字符抽象,对于块文件,你只需要知道它可以随机读写就可以完成大部分的工作而不用关注底层 具体的文件系统,比如ext3,ntfs,jfs之类,对于字符设备文件,你只需要知道他们是串行读写就可以了,而不必关心鼠标的电路安排,打印机的内部 机制等等,但是对于网卡,我们看看它是字符设备还是块设备。如果它是块设备,那么它能随机读写吗?看看网卡的特性,它的另一端是另一个世界,它更像是一个 管道,它更像是一个字符设备,因为对一个管道进行随机读写是没有意义的,那么它是一个字符设备吗?要知道网络协议多种多样,计算机仅仅负责按照协议加工数 据而不对协议本身做任何限制,因此如果将网卡作为字符设备,那么为了支持众多协议以及为了在传输之前绑定一个协议,就必须频繁调用ioctl之类的系统调 用,这样用户就必须知道网卡这个设备的更多的细节,否则用户怎么去ioctl这块网卡,这显然违背了unix文件抽象的初衷,另外怎么去同步这个设备,比 如多个进程同时需要打开这个设备传输网络数据,怎么能保证它们可以用最高的效率复用这个网卡,这个同步工作应该由谁来做,系统还是用户,如果由系统来做, 传统的文件同步接口将在网卡设备文件失效,如果由用户来完成,那么用户必须对网卡像驱动工程师一样熟悉,一个用户弄坏网卡的一个寄存器就会导致整个网卡 down掉…第三,如何支持网络协议,难道让用户自己进行协议封装然后write到网卡吗?协议栈在这种情况下必须在用户空间实现,如此一来,效率和 健壮性呢?安全性呢?协议栈显然受不到操作系统的内核空间特权级别的保护待遇,这违背了安全原则。综上,网卡不能被抽象成设备文件,因为将之抽象之后得不 到任何好处。

bsd套接字解决上文件抽象问题,为了使用文件接口,bsd套接字仍然使用文件接口,下层直接和内核空间的协议栈接口,所 有的同步以及协议规程都在协议栈完成,设备复用由协议栈和设备驱动共同完成,这个bsd套接字抽象简直就是一件艺术品,人们又回到了一切皆文件的美丽又和 谐的世界,bsd套接字通过一个新的系统调用socket来代替open从而可以实现诸如协议绑定之类的和open语义不相关的操作,另外connect 和accept也实现了自己的语义。当初为何不将网络设备作为文件抽象呢?实际上有一个本质的原因,那就是unix根本就不把网络通信作为IO,而是作为 IPC,实际上unix从一开始就将网络当成了计算机,否则它也不会将网络通信作为IPC,进程间通信可以在同一台机器,也可以在不同的机器,实际上机器 并不是界限。unix将网络通信当成了像共享内存,信号量之类的IPC机制了,只不过后者是同一台机器内部的机制,不需要硬件,而网络通过需要硬件实现, 硬件就是网卡之类的设备,unix仅仅将网络设别作为了实现IPC的手段罢了。

转自: http://blog.csdn.net/dog250/archive/2010/02/09/5303699.aspx

一个关于foxmail不能收取yahoo邮件的问题

我的foxmail有一个月不能收取yahoo邮件了,一直很忙,也没查是为什么,只以为是yahoo的问题。
今天抓包一下,发现欲连接的IP是: 192.168.100.210; 感觉奇怪; 更奇怪的是这个IP不是dns解析出来的,我更没有设置host,yahoo的pop3主机域名地址为: pop.mail.yahoo.com.cn ,dns解析为:
——————————————
>nslookup pop.mail.yahoo.com.cn
DNS request timed out.
    timeout was 2 seconds.
服务器:  UnKnown
Address:  219.239.26.42

非权威应答:
名称:    pop1.mail.vip.cnb.yahoo.com
Address:  203.209.228.241
——————————————-
当我设置host:
203.209.228.241        pop.mail.yahoo.com.cn

foxmail依然连接地址: 192.168.100.210

解决办法: 直接将yahoo的pop3地址设置为: 203.209.228.241  ; all is OK

==========================
至于foxmail错误地解析了域名地址,大概是曾经的一次意外的错误的解析被foxmail 给cache了吧? 但是我没有找见相应的设置,不去管它了, 没有意义

另外: 在写本文之前,我不能访问我的blog: http://phpor.net/
当我得知我同学可以访问时,我重新拨号,然后就好了; 呃…,好了就好了吧
Aliases:  pop.mail.yahoo.com.cn

关于ttulmgr命令的几点说明

ttulmgr

The command ttulmgr' is the utility to export and import the update log.  It is useful to filter the update log with such text utilities as grep‘ and sed'.  This command is used in the following format.  upath‘ specifies the update log directory.

ttulmgr export [-ts num] [-sid num] upath
Export the update log as TSV text data to the standard output.
ttulmgr import upath
Import TSV text data from the standard input to the update log.

Options feature the following.

  • -ts num : specify the beginning time stamp.
  • -sid num : specify the self server ID.

This command returns 0 on success, another on failure.

 

注意

1. 指定 sid 的作用不是说只查看sid产生的日志,而是说不要查看sid产生的日志,源码(ttulmgr.c,procexport函数)中是这么写的:  

2. 通过上图的189行可以知道,输出只能是16进制的个数,不能是ascii码的

3. 输入格式说明:

   1306566730093092        3101:3101       put     C8 10 00 00 00 43 00 00 00 4E 54

   其中:

      1306566730093092 是微妙级时间戳

      3101:3101 分别是 sid:mid   即: serverid ,masterid; 如果masterid没有,则为0

      put: 是指令的文本描述

      c8…: 这些就是指令参数的16进制表示了

tokyotyrant的几种同步方式

tokyo tyrant采用的是从机向主机拉式的主从同步策略,并且有一个限制,一个从库只能从一个主库同步数据。另外tokyo tyrant在写操作的时候都会加锁。这样对同一个key的写操作就会被顺序执行,不会出现并发操作的情况。且主辅库均可进行读写操作。

下面是几种同步策略:

1.

2.

3.

关于tokyotrant的遍历

如下的遍历方式效率是比较低的:
1. 因为是用的迭代的方式,所以内存使用很少
2. 迭代的过程如下,效率是非常地的:
    sendto(3, "\310Q", 2, 0, NULL, 0)       = 2  (continue)
    recvfrom(3, "\0\0\0\0CTGT-MTI5NjI0OTk5MA==-130492"…, 65536, 0, NULL, NULL) = 72 (接收key)
    sendto(3, "\3100\0\0\0CTGT-MTI5NjI0OTk5MA==-13049"…, 73, 0, NULL, 0) = 73 (get key)
    recvfrom(3, "\0\0\0\0L{\"uid\":\"1296249990\",\"et\":13"…, 65536, 0, NULL, NULL) = 81  (接收value)

测试脚本:
 

 
  1. <?php
  2.         $tt = new TokyoTyrant();
  3.         $connected = $tt->connect($host$port);
  4.         $it = $tt->getIterator();
  5.         foreach ($it as $key=>$val) {
  6.         
  7.         } 

PHP异步并发connect

以前写过一个multi_http()的函数,就是异步地做http请求,后来再次看那段代码的时候,发现不少问题:
1. 我只在发送、接受数据的时候使用了异步,connect的时候还是同步的
2. 由于我发送数据的时候使用的是http1.0,所以接受数据的时候靠feof()判断结束就很方便了;如果使用http1.1,而且connection:keep-alive; 那么就不是那么简单了

如果需要异步并发,建议使用curl,今天看了一下,curl在异步并发请求的时候,connect、send、recv都是异步的。测试代码:

muti_curl.php
  1.     
    <?php

        

  2.     
    // 创建一对cURL资源

        

  3.     
    $ch1 = curl_init();

        

  4.     
    $ch2 = curl_init();

        

  5.     
     

        

  6.     
    // 设置URL和相应的选项

        

  7.     
    curl_setopt($ch1, CURLOPT_URL, "http://phpor.net/tools/whoami.php");

        

  8.     
    curl_setopt($ch1, CURLOPT_HEADER, 0);

        

  9.     
    curl_setopt($ch2, CURLOPT_URL, "http://phpor.net/tools/whoami.php");

        

  10.     
    curl_setopt($ch2, CURLOPT_HEADER, 0);

        

  11.     
     

        

  12.     
    // 创建批处理cURL句柄

        

  13.     
    $mh = curl_multi_init();

        

  14.     
     

        

  15.     
    // 增加2个句柄

        

  16.     
    curl_multi_add_handle($mh,$ch1);

        

  17.     
    curl_multi_add_handle($mh,$ch2);

        

  18.     
     

        

  19.     
    $active = null;

        

  20.     
    // 执行批处理句柄

        

  21.     
    do {

        

  22.     
            $mrc = curl_multi_exec($mh, $active);

        

  23.     
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        

  24.     
     

        

  25.     
    while ($active && $mrc == CURLM_OK) {

        

  26.     
            if (curl_multi_select($mh) != 1) {

        

  27.     
                    do {

        

  28.     
                            $mrc = curl_multi_exec($mh, $active);

        

  29.     
                    } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        

  30.     
            }

        

  31.     
    }

        

  32.     
     

        

  33.     
    // 关闭全部句柄

        

  34.     
    curl_multi_remove_handle($mh, $ch1);

        

  35.     
    curl_multi_remove_handle($mh, $ch2);

        

  36.     
    curl_multi_close($mh);

        

使用strace观察一下:
strace -tt php multi_curl.php

connect(3,{sa_family=AF_INET,sin_port=htons(80), sin_addr=inet_addr("66.147.244.189")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=3, events=POLLOUT}], 1, 0)    = 0

虽然是异步,这里还是立即检查了一下是否已经连接成功;但是这种检查也是非阻塞的(看poll的第三个参数)。如果connect连接的是本地端口,poll检查的时候连接就已经是成功的了。 如(10.55.38.14是本机):
connect(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("10.55.38.14")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=4, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1

——————————————
下面这篇文章写的并不好,仅作学习之用:

这里关键是socket_select的用法了;
另:
1. 当阻塞方式connect的时候,设置连接超时时间是通过设置SO_SNDTIMEO来实现的,如:
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array(‘sec’ => 3, ‘usec’ => 0));
设置超时时间为3s;
2. 对于非阻塞方式的connect,连接的超时时间不是在socket上设置的,而是自己控制循环的时间

multi_connect.php
  1.     
    <?php

        

  2.     

        

  3.     
    $arrTarget = array(

        

  4.     
        array("host"=>"10.55.38.61", "port"=>80),

        

  5.     
        array("host"=>"66.147.244.18", "port"=>80),

        

  6.     
        array("host"=>"10.55.38.63", "port"=>82),

        

  7.     
    );

        

  8.     
    $arrResult = multi_connect($arrTarget);

        

  9.     

        

  10.     
    print_r($arrResult);

        

  11.     
    exit;

        

  12.     

        

  13.     
    function multi_connect($arrTarget) {

        

  14.     
        $arrSocket = array();

        

  15.     
        foreach($arrTarget as $key=>$pair) {

        

  16.     
            $socket  = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

        

  17.     
            socket_set_nonblock($socket);

        

  18.     
            @socket_connect($socket, $pair["host"], $pair["port"]);

        

  19.     
            $arrSocket[$key] = $socket;

        

  20.     
        }

        

  21.     
        $arrLeft = $arrSocket;

        

  22.     
        $arrSocketWrite = $arrSocket;

        

  23.     
        $arrSocketRead = null;

        

  24.     
        $arrExcept = array();

        

  25.     
        $all = count($arrTarget);

        

  26.     
        $arrOk = array();

        

  27.     

        

  28.     
        $timeout = 5;

        

  29.     
        $oritimeout = $timeout;

        

  30.     

        

  31.     
        while($all > 0 && $timeout > 0) {

        

  32.     
            $time_start = time();

        

  33.     
            $done = socket_select($arrSocketRead, $arrSocketWrite,$arrExcept,$timeout);

        

  34.     
            $timeout -= (time() $time_start);

        

  35.     
            if ($done <= 0) {

        

  36.     
                //error or timeout

        

  37.     
                echo "Timeout $oritimeout(s)n";

        

  38.     
                break;

        

  39.     
            }

        

  40.     
            $all -= $done;

        

  41.     

        

  42.     
            foreach($arrSocketWrite as $key=>$val) {

        

  43.     
                $arrOk[$key] = $val;

        

  44.     
            }

        

  45.     
            $arrLeft = array_diff($arrLeft, $arrSocketWrite);

        

  46.     

        

  47.     
            echo "n—-connect ok:——————–n";

        

  48.     
            print_r($arrSocketWrite);

        

  49.     
            echo "n—-except:——————–n";

        

  50.     
            print_r($arrExcept);

        

  51.     
            echo "n–left:———————-n";

        

  52.     
            print_r($arrSocketWrite);

        

  53.     

        

  54.     
            echo "n====================================n";

        

  55.     

        

  56.     
            $arrSocketWrite = $arrLeft;

        

  57.     

        

  58.     
        }

        

  59.     
        return $arrOk;

        

  60.     
    }

        

善用配置

关键字: 配置文件、日志、默认值

我们总期望程序功能很强大,但是有些功能不是适合任何环境的、任何时候的,这时候我们就可以利用配置来使得灵活。
比如:
我想方便地看到线上程序的一些调试信息,但是一般情况下我并不需要这些信息,只有在调试线上bug的时候才需要,于是我们就可以在程序中添加这些调试信息的语句,然后通过开关来控制。
如果我们没有权限登录线上提供服务的机器,则调试信息就可能需要输出到自己可以登录的某远程server上了,然而,很多提供服务的机器都往一个机器上打log,如果没有控制,这个log server估计会吃不消了,于是我们就可能需要配置一些有百分之多少的请求是需要打log的,这里就又用到了配置。
另外,还有日志的级别也是可以配置的。

所以,写一套系统,一定要有:
1. 配置文件类
  什么配置信息都可以从通过配置文件类来获取;或许你不愿意配置这些东西,你们你设置默认值就行了
2. 日志类
  日志有级别,也有标签;我可以输出某种级别的日志,也可以只输出含有某标签的日志; 或许你不想输出这些东西,你们你默认不输出就行了