2012年10月14日星期日

Turing机、人工智能以及我们的世界

转自:matrix67.com

 Turing机、人工智能以及我们的世界

 

    昨天终于读完了《The Annotated Turing》一书,第一次完整地阅读了 Turing 最经典的那篇论文,理解了 Turing 机提出的动机和由此带来的一系列结论。不过,这本书的最大价值,则是让我开始重新认识和思考这个世界。在这里,我想把我以前积累的哲学观点和最近一些新的 思考记下来,与大家一同分享。《The Annotated Turing》一书中的一些学术内容,留待以后几篇日志与大家分享。今年是 Alan Turing 诞辰 100 周年,图灵公司将推出这本书的中译本《图灵的秘密》,现在正在紧张的编辑排版中,不久之后就能和大家见面。
    1928 年, David Hilbert 提出了一个著名的问题:是否存在一系列有限的步骤,它能判定任意一个给定的数学命题的真假?这个问题就叫做 Entscheidungsproblem ,德语“判定性问题”的意思。大家普遍认为,这样的一套步骤是不存在的,也就是说我们没有一种判断一个数学命题是否为真的通用方法。为了证明这一点,真正 的难题是将问题形式化:什么叫做“一系列有限的步骤”?当然,现在大家知道,这里所说的“有限的步骤”指的就是由条件语句、循环语句等元素搭建而成的一个 机械过程,也就是我们常说的“算法”。不过,在没有计算机的时代,人们只能模模糊糊地体会“一个机械过程”的意思。 1936 年,Alan Turing 在著名的论文《On computable numbers, with an application to the Entscheidungsproblem》中提出了一种假想的机器,第一次给了“机械过程”一个确凿的含义。

    Turing 提出的机器非常简单。假设有一张无穷向右延伸的纸条,从左至右分成一个一个的小格子。每一个小格子里都可以填写一个字符(通常是单个数字或者字母)。纸条 下方有一个用来标识“当前格子”的箭头,在机器运行过程中,箭头的位置会不断移动,颜色也会不断变化。不妨假设初始时所有格子都是空白,箭头的颜色是红 色,并且指向左起第一个格子。为了让机器实现不同的功能,我们需要给它制定一大堆指令。每条指令都是由五个参数构成,格式非常单一,只能形如“如果当前箭 头是红色,箭头所在格子写的是字符 A ,则把这个格子里的字符改为 B ,箭头变为绿色并且向右移动一格”,其中最后箭头的移动只能是“左移一格”、“右移一格”、“不动”中的一个。
    精心设计不同的指令集合,我们就能得到功能不同的 Turing 机。你可以设计一个生成自然数序列的 Turing 机,或者是计算根号 2 的 Turing 机,甚至是打印圆周率的 Turing 机。 Turing 本人甚至在论文中实现了这么一种特殊的 Turing 机叫做通用 Turing 机,它可以模拟别的 Turing 机的运行。具体地说,如果把任意一个 Turing 机的指令集用 Turing 自己提出的一种规范方式编码并预存在纸条上,那么通用 Turing 机就能够根据纸条上已有的信息,在纸条的空白处模拟那台 Turing 机的运作,输出那台 Turing 机应该输出的东西。
    但是, Turing 机并不是无所不能的。 Turing 证明了一个看似有些惊人的事实:不存在这样的一个 Turing 机,它能读取任意一个 Turing 机的指令集,并判断该 Turing 机是否将会在纸条上打印出至少一个 0 。注意,简单地用通用 Turing 机做模拟并不是一个可行的方案,因为模拟到现在还没有打出 0 ,不意味着今后也就永远不会打出 0 。这个定理有一个更深刻的含义,即没有一种通用的方法可以预测一台 Turing 机无穷远后的将来(后人把这个结论简化为了著名的停机问题)。正如《The Annotated Turing》封底上的一段文字所说:在没有计算机的时代, Turing 不但探索了计算机能做的事,还指出了计算机永远不能做到的事。
    在论文的最后一章, Turing 给出了一种 Turing 机指令集和一阶逻辑表达式的转换规则,使得这个 Turing 机将会打出 0 来,当且仅当对应的一阶逻辑表达式为真。然而,我们没有一种判断 Turing 机是否会输出 0 的算法,因此我们也就没有一种判断数学命题是否为真的通用办法。于是, Entscheidungsproblem 有了一个完美的解答。
    有趣的是,Turing 机本身的提出比 Entscheidungsproblem 的解决意义更大。计算机诞生以后,出现了五花八门的高级编程语言,一个比一个帅气,但它们的表达能力实际上都没有超过 Turing 机。事实上,再庞大的流程图,再复杂的数学关系,再怪异的语法规则,最终都可以用 Turing 机来描述。 Turing 机似乎是一个终极工具,它似乎能够表达一切形式的计算方法,可以描述一切事物背后的规律。在同一时代,美国数学家 Alonzo Church 创立了 λ 算子(λ-calculus),用数学的方法去阐释“机械过程”的含义。后来人们发现, Turing 机和 λ 算子是等价的,它们具有相同的表达能力,是描述“可计算性”的两种不同的模型。 Turing 机和 λ 算子真的能够描述所有直观意义上的“可计算数”、“可计算数列”、“可计算函数”吗?有没有什么东西超出了它们的表达能力?这个深刻的哲学问题就叫做 Church–Turing thesis 。当然,我们没法用形式化的方法对其进行论证,不过大家普遍认为, Turing 机和 λ 算子确实已经具有描述世间一切复杂关系的能力了。人们曾经提出过一些 hypercomputer ,即超出 Turing 机范围的假想机器,比如能在有限时间里运行无穷多步的机器,能真正处理实数的机器,等等。不过这在理论上都是不可能实现的。
    事实上, Turing 在他的论文中就已经指出,人的思维也没有跳出 Turing 机的范围。对此, Turing 有一段非常漂亮的论证:人在思考过程中,总能在任意时刻停下来,把当前进度记录在一张纸上,然后彻底走开并把它完全抛之脑后,过一会儿再回来,并完全凭借 纸上的内容拾起记忆,读取进度,继续演算。也就是说,人的每一帧思维,都可以完全由上一帧思维推过来,不依赖于历史的思维过程。而 Turing 机所做的,也就是把人的思维步骤拆分到最细罢了。
    没错,这意味着,或许一个人的语言、计算甚至学习能力,完全等价于一个 Turing 机,只不过这个 Turing 机的指令集可能异常庞大。1950 年, Turing 的另 一篇经典论文《Computing Machinery and Intelligence》中正式把人和机器放到了相同的高度:让一个真 人 C 先后与一台计算机 A 和另一个真人 B 进行聊天,但事先不告诉他 A 和 B 哪个是机器哪个是人;如果 C 无法通过聊天内容分辨出谁是机器谁是人,我们就认为计算机 A 具有了所谓的人工智能。这就是 Turing 测试。
    计算机拥有智能?这岂不意味着计算机也能学习,也能思考,也拥有喜怒哀乐?人类似乎瞬间失去了不少优越感,于是不少科学家都旗帜鲜明地提出 了反对意见。其中最为经典的恐怕要数美国哲学家 John Searle 在 1980 年提出的“中文屋子”思想实验了。把一个不懂汉语的老外关在一个屋子里,屋子里放有足够多的草稿纸和铅笔,以及一本汉语机器聊天程序的源代码。屋子外面则 坐着一个地地道道的中国人。屋里屋外只能通过纸条传递信息。老外可以用人工模拟程序运行的方式,与屋外的人进行文字聊天,但这能说明老外就懂中文了吗?显 然不能。每次讲到中文屋子时,我往往会换一种更具戏剧效果的说法。一群微软研究员在小屋子里研究代码研究了半天,最后某人指着草稿纸一角的某个数字一拍大 腿说,哦,原来屋外的人传进来的是一段笑话!于是,研究员们派一个代表到屋子外面捧腹大笑——但是,显然这个研究员是在装笑,他完全不懂笑点在哪儿。这个 例子非常有力地说明了,机器虽然能通过 Turing 测试,但它并不具有真正的智能。
    当然,有反方必有正方。另一派观点则认为,计算机拥有智能是一件理所当然的事。这涉及到一个更为根本的问题:究竟什么是智能?
    记得我曾经看过一本科幻小说,书名不记得了,情节内容也完全不记得了,只记得当我看完小说第一页时的那种震撼。在小说的开头,作者发问,什么是自 我意识?作者继续写到,草履虫、蚯蚓之类的小动物,通常是谈不上自我意识的。猫猫狗狗之类的动物,或许会有一些自我意识吧。至于人呢,其实我只敢保证我自 己有自我意识,其他人有没有自我意识我就不知道了。看到这里我被吓得毛骨悚然:完全有可能整个世界就只有我一个人有自我意识,其他所有人都是装出一副有意 识的样子的无生命物!
    有一次做汉语语义识别的演讲时,讲到利用语义角色模型结合内置的知识库,计算机就能区别出“我吃完了”和“苹果吃完了”的不同,可以推出“孩子吃 完了”多半指的是什么。一位听众举手说,难道计算机真的“理解”句子的意思了?我的回答是,没有冒犯的意思,你认为你能理解一个汉语句子的意思对吧,那你 怎样证明这一点呢?听众朋友立即明白了。你怎样证明,你真的懂了某一句话?你或许会说,我能对其进行扩句缩句啊,我能换一种句型表达同样的意思啊,我能顺 着这句话讲下去,讲出与这句话有关的故事、笑话或者典故,我甚至还能在纸上画出句子里的场景来呢!那好,现在某台电脑也能做到这样的事情了,怎么办?
    这就是所谓的“功能主义”:只要它的输入输出表现得和人一样,不管它是什么,不管它是怎么工作的,哪怕它只是一块石头,我们也认为它是有智能的。 永远不要觉得规则化、机械化的东西就没有智能。你觉得你能一拍脑袋想一个随机数,并且嘲笑计算机永远无法生成真正的随机数。但是,你凭什么认为你想的数真 的就是随机的呢?事实上,你想的数究竟是什么,这也是由你的大脑机器一步一步产生的。你的大脑逃不出 Turing 机。
    事实上,整个世界也逃不出 Turing 机的范围。 Newton 系统地总结了物体运动规律后,人类豁然开朗,原来世界万事万物都是由“力”来支配的,扔出一个东西后,这个东西将以怎样的路线做怎样的运动,会撞击到哪些 其他的物体,它们分别又会受到怎样的影响,这都是可以算出来的。这便是所谓的机械唯物主义:我们的世界是一个简单的、确定的、线性的、无生的世界。 1814 年,法国数学家 Laplace 给出一个更加漂亮的诠释:如果有一个妖精,它知道宇宙某个时刻所有基本粒子的位置和动量,那么它就能够根据物理规律,计算出今后每一时刻整个宇宙的状态, 从而预测未来。刘慈欣在科幻小说《镜子》中更加极端地把初始状态取到宇宙大爆炸的时刻,因为宇宙诞生之初的状态极其简单,调整到正确的参数就可以生成我们 所处的这个宇宙。这就是所谓的决定论。
    我特别相信这些说法。我的拖延症有一个非常怪异的缘由,那就是我会告诉自己,截止的那一天总会到来的,这堆破事儿总会被我做完的。遇上纠结的问 题,我不会做过多的思考,而会让一切顺其自然。其实,结果已经是确定的了,我真正需要做的不过是亲自把这个过程经历一遍。就仿佛我没有自由意志了一样。
    不过,现代物理学的观念,尤其是量子理论的诞生,开始质疑上帝究竟会不会掷骰子了。然而,上帝会不会掷骰子,对于我们来说其实并不重要。 Turing 的结论告诉我们,即使未来是注定的,我们也没有一种算法去预测它,除非模拟它运行一遍。但是,要想模拟这个宇宙的运行,需要的计算量必然超出了这个宇宙自 身的所有资源。运行这个宇宙的唯一方式,就是运行这个宇宙本身。 Seth Lloyd 在《Programming the Universe》里说到,“我们体会到的自由意志很像 Turing 的停机问题:一旦把某个想法付诸实践,我们完全不知道它会通向一个怎样的结局,除非我们亲身经历这一切,目睹结局的到来。”
    未来很可能是既定的,但是谁也不知道未来究竟是什么样。每个人的将来依旧充满了未知数,依旧充满了不确定性。所以,努力吧,未来仍然是属于你的。

2012年10月12日星期五

CRUX中Samba的安装和配置

CRUX中Samba的安装和配置

此教程适用于在VMware中安装的CRUX2.7
  •  安装samba

首先下载samba:
   # cd /home
   # mkdir samba
   # cd samba
   # wget http://www.samba.org/samba/ftp/stable/samba-3.6.8.tar.gz

然后解压缩:

   # tar zxvf samba-3.6.8.tar.gz

配置编译:

   # cd samba-3.6.8.tar.gz
   # cd source3
   # ./autogen.sh
   # ./configure
   # make
   # make install

samba就安装好了

  • 配置samba

复制配置文件到samba目录下:
   # cp /home/samba/samba-3.6.8/examples/smb.conf.default/usr/local/samba/lib/smb.conf

验证参数:
  # /usr/local/samba/bin/testparm

出现错误:
testparm: error while loading shared libraries: libtalloc.so.2: cannot open shared object file: No such file or directory

在源代码路径下的./bin/路径下找到该文件,复制到系统库文件夹中:
  # cp /home/samba/samba-3.6.8/source3/bin/libtalloc.so.2 /usr/lib/libtalloc.so.2

用相同的方法解决libtdb.so.1文件的问题
  # cp /home/samba/samba-3.6.8/source3/bin/libtdb.so.1 /usr/lib/libtdb.so.1

配置smb.conf:
  # vi /usr/local/samba/lib/smb.conf

找到[global],在其下面增加以下三行:
   display charset=cp936
   dos charset=cp936
   unix charset=cp936

这三行设置的目的是在win 机上使用“网络邻居“共享到linux 上的文件夹和文件时,显示汉字。
找到[home],在其下加入:
   path=/usr

这样Samba 用户在windows 机器中登录Samba 服务器后就可以看到/usr 下的所有文件
创建一个新用户:
  # useradd user1 -p 123456

复制一个库文件:
  # cp /home/samba/samba-3.6.8/source3/bin/libwbclient.so.0 /usr/lib/libwbclient.so.0

否则smbpasswd提示缺少库文件。
为samba添加用户:
  # /usr/local/samba/bin/smbpasswd -a user1

输入密码(可以与linux密码不同,这里为了方便设置为相同值):123456
再次输入后确认。

  • 启动samba服务

在启动服务前,首先需要创建一个空的打印机文件:
  # touch /etc/printcap

否则服务会报错:
Unable to open printcap file /etc/printcap for read!

然后启动samba服务:
  # /usr/local/samba/sbin/nmbd -D
  # /usr/local/samba/sbin/smbd –D

此时,在同网络的其他机器上访问\\[name or ip]\user1即可访问其共享文件夹。

  • 设置samba在系统启动时自动运行:

首先在/etc/rc.d/中建立符号链接:
  # ln -s /etc/rc.local /etc/rc.d

然后编辑配置文件
  # vim /etc/rc.d/rc.local

添加:
   echo “Samba Server is started!”
   /usr/local/samba/sbin/nmbd –D
   /usr/local/samba/sbin/smbd –D

保存退出。

转:Linux find 用法示例

转自:http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html

Linux中find常见用法示例

·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
#-print 将查找到的文件输出到标准输出
#-exec   command   {} \;      —–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
例:find . -name .svn | xargs rm -rf
====================================================
-name   filename             #查找名为filename的文件
-perm                        #按执行权限来查找
-user    username             #按文件属主来查找
-group groupname            #按组来查找
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n               #按文件访问时间来查GIN: 0px">
-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前
-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2               #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                        #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                       #忽略某个目录
=====================================================
$find   ~   -name   "*.txt"   -print    #在$HOME中查.txt文件并显示
$find   .    -name   "*.txt"   -print
$find   .    -name   "[A-Z]*"   -print   #查以大写字母开头的文件
$find   /etc   -name   "host*"   -print #查以host开头的文件
$find   .   -name   "[a-z][a-z][0–9][0–9].txt"    -print   #查以两个小写字母和两个数字开头的txt文件
$find .   -perm   755   -print
$find   .   -perm -007   -exec ls -l {} \;   #查所有用户都可读写执行的文件同-perm 777
$find   . -type d   -print
$find   .   !   -type   d   -print
$find   .   -type l   -print
$find   .   -size   +1000000c   -print        #查长度大于1Mb的文件
$find   .   -size   100c         -print       # 查长度为100c的文件
$find   .   -size   +10   -print              #查长度超过期作废10块的文件(1块=512字节)
$cd /
$find   etc   home   apps    -depth   -print   | cpio   -ivcdC65536   -o   /dev/rmt0
$find   /etc -name "passwd*"   -exec grep   "cnscn"   {}   \;   #看是否存在cnscn用户
$find . -name "yao*"   | xargs file
$find   . -name "yao*"   |   xargs   echo    "" > /tmp/core.log
$find   . -name "yao*"   | xargs   chmod   o-w

2012年10月11日星期四

VMware中CRUX网络环境配置

VMware中CRUX网络环境配置


最近折腾CRUX花了不少时间,也走了不少弯路,把遇到的问题记录下来,希望能够给人以帮助。

在VMware中安装完成CRUX后,一般而言是上不了网的。这是因为我们没有配置好CRUX的网络环境,也可以说我们刚刚安装好的CRUX不能适应我们的VMware环境。因此需要通过修改网络配置文件来完成。

为了确保我们的网卡驱动没有问题,我们首先使用ifconfig命令检查一下网络接口,应该会有:

    # ifconfig
    eth0      Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
              inet addr:192.168.1.100   Bcast:192.168.1.255   Mask:255.255.255.0
     ......
    lo        Link encap:Local Loopback
     ......
这说明我们的网卡驱动已经成功安装了。如果没有eth0的选项,那么说明缺少网卡驱动,需要重新配置和编译CRUX内核以添加网卡驱动。网卡驱动的选项如下:
      Devices Drivers --->
        Network device support --->
          Ethernet (10 or 100Mbit) --->
            <*>AMD PCnet32 PCI SUPPORT

相应的步骤可以参考之前的blog

确认网卡驱动没有问题之后,就可以配置相应的设置了。首先要确保在VMware里:
      VM --> Settings... --> Network Adapter --> NAT:Used to share the host's IP 
是选中的,也就是说虚拟机通过NAT的方式连接到互联网。
首先停止网络服务:
      $ sh /etc/rc.d/net stop
然后,我们参照官网的配置教程来配置CRUX虚拟机中的/etc/rc.d/net文件:
      $ vi /etc/rc.d/net
修改为以下内容即可:
  #!/bin/sh
  #
  # /etc/rc.d/net: start/stop network
  #

  case $1 in
  start)
 # loopback
 /sbin/ip addr add 127.0.0.1/8 dev lo broadcast + scope host
 /sbin/ip link set lo up
 # ethernet
 /sbin/dhcpcd -t 10 -h $HOSTNAME eth0
 ;;
  stop)
 /usr/bin/killall -q /sbin/dhcpcd
 /sbin/ip link set lo down
 /sbin/ip addr del 127.0.0.1/8 dev lo
 ;;
  restart)
 $0 stop
 $0 start
 ;;
  *)
 echo "usage: $0 [start|stop|restart]"
 ;;
  esac

  # End of file
也就是说,以DHCP的方式连接到子网中。当然,你也可以按照教程配置为固定IP地址。
最后,执行start: 
      $ sh /etc/rc.d/net start 
以启动网络,等待DHCP服务启动完成,就可以连接到互联网了。你可以使用wget命令下载内容。
如果虚拟机仍然无法访问网络,则关闭VMware,尝试在系统服务中把VMware开头的所有服务重启一遍。
如果还不能够访问,可能问题出在其他地方,爱莫能助。

VM7中CRUX 2.7的安装

 VM7中CRUX 2.7的安装

前言(废话):发现上一篇帖子还是去年11月的额,不知不觉有近一年的时间没有进行技术方面的学习了...果然搞科研的孩子伤不起啊喵~!最近又开始折腾各种配置,遇到了不少问题,尤其是在VMware中编译运行CRUX着实令人头疼...不是说过程很复杂,而是遇到了各种奇怪的问题难以解决,折腾了几个整天的时间终于有些眉目了。本文简要介绍在VM7安装CRUX以及前期配置中遇到的一些问题的解决方法。由于编译操作系统对于环境要求严格(不同环境下遇到的问题可能不同),因此不保证本文的方法能够适用于任意情况下的CRUX安装。

好吧,我们长话短说。首先VMware是必须的(我用的版本是VMware workstation7.0.0 build-203739,同学在8.0上貌似也可以),如果没有,没有...我也没有办法。CRUX选用的是2.7版,我用的是i686的版本,X86的版本也行,可以从http://crux.nu/Main/Download下载相应的iso。

先来看看俺是怎么失败的:
首先在VMware中创建虚拟机,选择自定义(custom),在系统安装选项(guest operating system installation)中选择从iso安装,并选择下载的CRUX的iso文件,系统选择Linux,Other Linux 2.6.x kernel,硬件选项除了硬盘类型改为IDE(默认是SCIS),其余全默认(虚拟机存储的路径自己决定吧),然后等待系统启动。
接下来的步骤我是按照这个教程进行的,貌似2.7的CRUX有个bug,不论你的硬盘类型是IDE还是SCSI,硬盘的设备路径都是/dev/sda(按理来说IDE的硬盘应该是/dev/hda),分区后的结果自然也不是hda1,hda2...而是sda1,sda2...自己注意一下就好。fdisk命令不懂可以自己找些教程,例如这个

另外,在fstab里面别忘了加入swap分区的内容(按照教程的内容应该加入/dev/hda2  swap swap default 0 0一行,自己根据情况修改)。lilo里面的append=quite注释掉有利于问题的发现。
经过漫长的编译和配置,总算到了激动人心的时候,reboot,系统启动,加载驱动,挂载硬盘,然后...就木有然后了...这里出现了致命错误:

   VFS: Cannot open root device 803 or unknown-block(8,3)
   Please append a corrent "root=" boot option
   kernel panic - not syncing: VFS: Unable to mount root fs on unknow-block(8,3) 


重启之后仍然不能解决问题,无解,只能咨询google了。

发现其他人也遇到了类似问题,尝试他们提供的解决方案,仍然不能解决问题...根据其他人的症状解决方法,想到可能是硬件驱动冲突问题(类似问题基本是修改硬件驱动配置解决的)。但是crux配置里面的硬件数量这么多,要怎么样找出究竟是哪个驱动有问题呢?

如果大部分驱动是没有用的,我们为什么不去除其他多余的所有驱动呢?按照这个思路,在以上提到的教程第6步
6、编译内核,安装内核文件及模块

$ cd /usr/src/linux-2.6.15.6
$ make menuconfig 
中的$ make menuconfig 命令之前,先输入以下命令:
$ make defconfig 
将编译选项恢复到默认配置,然后再按照以上提供的解决方案进行配置,其余步骤与教程相同。
终于得到了以下结果:
真是可喜可贺啊!

总结一下,需要注意的步骤如下:
  1. 在创建虚拟机时VMWare硬盘的SCSI方式选择busLogic
  2. 编译内核时一定要选上如下两个:
    Device Drivers --->
    Fusion MPT device support --->
    <*> Fusion MPT ScsiHost drivers for SPI [kernel 2.6.13] 


    SCSI low-level drivers --->
    <*>bus Logic SCSI support


    ext4文件系统默认没选上,一定要选择上,不然/boot不能mount

    将网卡编译入内核中

    Devices Drivers --->
    Network device support --->
    Ethernet (10 or 100Mbit) --->
    <*>AMD PCnet32 PCI SUPPORT 
  3. 在 $ make menuconfig 之前一定要 $ make defconfig ,否则驱动冲突
其余的按照教程操作就可以了。