Posts Tagged linux

mount小tricks


1. 我今天才知道原来同一个device (比如/dev/sdb1)可以被重复mount到几个不同的mount points(比如/home和/mnt/debug).

2. 一个mount point上重复mount两个devices会发生什么情况?比如说在/dev/sda1已经被mount到/home的情况下,你不小心又mount /dev/sdb1到/home. 这个我很早以前就知道了,效果基本上相当于直接mount了后面那个device. 你可以读写到/dev/sdb1。当你执行了一次umount /home之后,Kernel会自动恢复到mount /dev/sda1到/home的状况。

3. 一般情况下当然只有root才能mount。要想让某个device可以让用户mount,可以在/etc/fstab里相关的那一行加参数user. 比如:

/dev/cdrom /cd iso9660 ro,user,noauto,unhide

4. mount好了的一个分区想改变属性,比如说从可读写改成只读,可以这样:mount -o remount,ro /home

,

留下评论

Ubuntu 12.04安装笔记


又到了需要升级我的Ubuntu系统的时候,以下是我的笔记,写出来主要是为了给自己看,但如果能给别人一些帮助也挺好。

基本系统安装

CD
烧了一张Ubuntu 12.04 Alternative AMD64 安装CD. 没有用标准的图形化界面一是因为这年头Gnome/Unity已经没法用了,得选其它的桌面;二是因为Alternative disk有更多的控制选项(boot的时候按F4, 选定制安装)。本来也可以用USB jumpdrive的,但我以前试过,读取数据有时候远远不如从CD上读。
分区
之前的电脑上本来就分好了,一个28G的分区给系统(/), 56G的给/home,145G的放在/mnt/data,用来存所有的音乐,照片等等。这次重装系统,我只需要把/格式化掉即可。现在的Ubuntu default文件系统好像是ext4, 速度谈不上最快但很稳定。我觉得没必要折腾btrfs之类的东西了。
安装
现在基本上很智能了。记得选附近(RIT)的mirror,还有就是从网上直接下载最新的package. Desktop我选了Lubuntu和Xubuntu。

安装更多的软件

装完基本系统,重启看看没什么问题之后就装自己常用的软件。

  • 第一步,打开universe和multiverse source,再加上Ubuntu partners. Optional: 可以再加上一些PPA. 比如说下面是最新版本emacs的源
    sudo add-apt-repository ppa:cassou/emacs
  • 第二步,update system.
    sudo aptitude update && sudo aptitude safe-upgrade
  • 第三步,去网上下载安装ubuntu-tweak. 用它可以方便的管理一些第三方软件源,比如说skype。
  • 第四步,用自己的script装(几乎)所有的软件。

系统配置

  • sudo免密码
    用这个命令修改sudo的设置

    sudo visudo

    加上这么一句:

    yourusername ALL=(ALL) NOPASSWD: ALL
  • 网卡问题
    装好之后我这个老革命也碰到了一个从来没见过的新问题。无线网卡不能上网,只能有线上。用ifconfig看,只有lo和eth0,没有wlan0. ifup wlan0也不行。开始我以为是kernel module的问题(3.2系列kernel我以前没用过,而且驱动模块从iwlagn变成了iwl4965)瞎折腾了半天,后来才发现最神奇的是一旦插上网线,eth0和wlan0就同时出来了,然后拔掉网线也可以用无线上网。这样的话就肯定不是内核或者硬件的问题。折腾了半天,最后的解决方法是删掉/etc/network/interfaces里头的这一段看似无比正确的语句

    auto eth0
    iface eth0 inet dhcp

    然后一切都正常了。至今不明原理。

  • 声音问题
    这个也是好久好久没碰到过的问题了:没有声音。根据以前的经验,多半不是什么高深的驱动问题,而是最最简单的mute/unmute问题。浪费了不少时间调alsamixer一点用都没有,突然想起来这些年来Linux又换了一个声音后端,现在多半不用alsa而是用pulse audio了。赶紧查一下什么程序可以调pulse, 发现系统自带一个程序叫做pulse volume control(包的名字:pavucontrol)就是干这个的。unmute即可。
  • 生成中文locales
    现在其实需要中文locales的地方已经很少很少了。但telnet上BBS还是需要的。 cd /var/lib/locales/supported.d 编辑一个文件:zh zhHK.UTF-8 UTF-8 zhTW.UTF-8 UTF-8 zhCN.UTF-8 UTF-8 zhCN.GB2312 GB2312 zhCN.GBK GBK zhCN.GB18030 GB18030 zhTW.Big5 Big5Optional: 你可以从那个en文件当中删掉一些不想要的locales, 只保留一个enUS.UTF-8 UTF-8即可。然后sudo dpkg-reconfigure locales
  • Keyboard shortcuts
    • xmodmap
      Xfce自动会读=~/.Xmodmap=.
    • GTK apps Emacs keybindings
      如果想要让GTK程序(绝大多数程序)都用上类似于emacs的keybindings, 可以这样: gconf-editor ==> desktop ==> gnome ==> interface ==> gtkkeytheme, replace ‘Default’ to ‘Emacs’
    • Make use of “Win” key
      [GUI] ==> System ==> Keyboard ==> Layout Options ==> Alt/Win key behavior ==> Hyper is mapped to the Win-keys
    • Use Alt-F6 to max vert
      gconf-editor ==> apps ==> metacity ==> globalkeybindings, disable <Alt>F6, then windowkeybindings, define A-F6
  • xrdb
    Xfce会自动读=~/.Xdefaults=. 如有另外配置需读,可以放到=.xsessionrc=里。

XFCE或者LXDE桌面相关配置

和gnome相比,这两个桌面都比较轻量。相对而言,需要手动配置的地方也多一些。

  • 让XFCE/LXDE启动时source一些个人配置
    这两个桌面(还包括一些更简单的“桌面”,比如说openbox)默认都不会去source你的~/.bashrc. 这样可能会造成很多不方便的地方,因为所有通过GUI启动的程序都不会遵守你自己写的配置。 查了好久,发现正确的配置文件为=~/.xsessionrc=. 通过这个就可以改比如说PATH之类的环境变量了。 另外一个相关但不一样的问题:如何让LXDE/XFCE启动桌面的时候自动启动一些程序?最佳的方式是把一些=.desktop=文件拖拽到=~/.config/autostart=这个目录下。

,

留下评论

Linux下Access Control List (ACL) 的简单设置


Linux下标准的文件权限管理大致基于这么一个比较简单的模式:

  • 任何一个文件都有三个权限:可读,可写,可执行,记号分别是r, w, x。
  • 文件属性有三个级别:用户,群,全体;每个级别分别可以有不同的上述权限。

用=ls -l=命令可以看一个文件的这些权限,比如说:

-rwxrwxr-x 1 qiuxing compbio  556 Mar 30  2010 README.TXT

这说明=README.TXT=这个文件的创建用户为=qiuxing=, 群为=compbio=; 最前面的 rwxrwxr-x 说明用户 qiuxing (头三个字母)和群 compbio 都对这个文件拥有读写执行权限,但其他用户(最后三个字母)只拥有读和执行权限,不能写它。

现在假设我要和别人共享文件(比如说通过FTP server),那么标准的做法是这样子的:

  1. 新建一个群,比如说 ftpuser. 然后把所有要和我共享文件的用户都加入这个群。这个现在都可以通过图形化界面来干了。
  2. 把共享目录(比如说 /var/data )的所有文件的群都设成 ftpuser, 权限都设置成比如说群可读写。另外还要注意一点,所有的目录都得设置成群 可执行, 否则别人没法 cd 进去。
    sudo chgrp -R ftpuser /var/data
    sudo chmod -R 775 ftpuser /var/data
    

但这样做还有一点点问题。每次任何一个用户在 /var/data 下新生成的文件缺省属性都是这样的: 文件的群属性为该用户的主要群(在大部分Linux上这个群要么叫做users, 要么干脆就和用户名一样),权限为用户本人可读写,所有别人可读。这样每次生成一个文件都要改属性,很不方便。

所以我们应该让 /var/data 下的新生成文件缺省群属性为 ftpuser, 权限为群可读可写可执行。方法是 1. set group ID; 2. acl.

用root身份执行

find /var/data -type d -exec chmod g+s '{}' \;

这行命令把 /var/data 下所有的目录均 setgid 成 ftpuser, 这样在它们里面生成的任何文件缺省群为 ftpuser.

关于acl.

  1. Ubuntu下access control tool 可以如下安装:
    sudo apt-get install acl
    
  2. ACL是在文件系统级别上实现的。所以装上了之后得要让文件系统知道有这么回事。改你的 /etc/fstab, 在mount选项上加上acl这个参数:
    # <file system>  <mount point>     <type>  <options>   <dump>  <pass>
    /dev/sdb1        /var              ext3    defaults,acl   0       0
    

    然后重新mount一下:

    sudo mount -o remount,acl /var
    
  3. setfacl 来改属性
    sudo setfacl -d -m g:ftpuser:rwx /var/data
    

    这行命令具体什么意思,还有 setfacl 别的用法,请参看 BeginLinux.com 的文章。

高级问题:为什么不用 umask? 如果你去google, 会发现很多老一点的设置缺省权限的方法都基于 umask. 但是在shell 的配置文件里改 umask 值的后果是该用户创建的 所有 文件都变成这个属性了,这往往不是我们想要的效果。

, ,

留下评论

X 下有用的小工具


今天学了一个以前不知道的 X 小工具: xgamma. 它的用处是调整显示器输出的 gamma correction value. 这个gamma值的具体意义很难一下用浅显的语言来准确描述,它大体上相当于调整黑白对比度。你做一个实验大概就明白我说的意思了。首先打开一个有几种字体的文件或者网页。确切一点,我希望你用一些使用了antialias技术的字体。

  • 显示当前显示器的gamma value:
    xgamma
  • 降低对比度:
    xgamma -gamma 1.5

    看出来什么变化没有?是不是字体“发虚”了?

  • 现在增加对比度:
    xgamma -gamma 0.5

    是不是字体变得“沉”了许多?

Linux桌面一个很大的问题就是字体渲染不尽人意。这里面有很多因素,有些是不可控的(因为有些字体渲染技术有专利限制不能自由分发),有些纯粹就是X团队自己应该实现但却没去实现。就拿刚刚说的gamma value这个例子,一般用户不会也不应该去调 全局 gamma value, 99%的用户(比如说我自己)需要调的是 字体 antialiasing 里头的黑白对比,自行决定究竟是用比较淡一点但比较光滑美观的方案(接近Windows的cleartype, 或者mac),还是比较粗一点但比较清晰的方案(接近bitmap字体)。 这种局部调整gamma value的方法并不难实现,其实X server 已经提供了这么一个机制,在 xdvi 里头也有一个这样的实现。不信你用xdvi打开一个文件,多按几下 Ctrl Alt - (变淡) 或者 Ctrl Alt + (变黑)就明白我说的意思了。

Xft/fontconfig 实现了一大堆正常人一辈子都不会用到的功能,但就是没有实现这个。一般说来欧美人喜欢光滑一点的方案,亚洲人则正好相反。我想可能是因为亚洲字体远比拉丁字母复杂,过度光滑看起来特别累眼睛。而X 团队的开发者大部分为欧美人,可能就不会太在乎这些需求。

当然话说回来,workaround也是有的。目前我的解决方案就是挑合适的字体。英文用 Ubuntu 字体,本身比较“肥”,所以淡一点的antialiasing后看起来正好;中文用文泉驿字体,小字号它内嵌了bitmap字体,符合我们的习惯。

最后说一下别的几个有用的小工具:

xkill
强行杀掉某个程序;
xmodmap
键盘调整,比如说能把control和enter互换;
xev
让你知道某个键的名称;
xlsfonts
显示X core fonts;
xdpyinfo
显示一些关于X server的信息,比如说分辨率等等;
xprop
显示一个client的一些信息,比如说它的icon, class, 等等。这些信息在使用openbox之类的window manager时比较有用。举例而言,我可以写一条rule, 让所有class 为XTerm的窗口全部竖向最大化,所有class为Emacs的窗口全部无边,等等。

, , ,

留下评论

Linux下怎么管理,升级R的libraries


  1. 能用APT之类的发行版自带工具升级就用这个工具好了。目前Ubuntu里面大约 有150个包,大部分时候就可以满足需求了。
  2. 如果要自己装一些包,最好设置一个固定的path. 方法是设置一个叫做 R_LIBS_USER 的环境变量。比如说我的 .bash_profile 里头有这么一句:
    export R_LIBS_USER="${HOME}/local/lib/R"

    这样 R 就会把包装到这个目录下,第一不用root权限,第二你以后管理起来也方便。

  3. 每次用 install.packages("foo") 的时候R都会问你选 CRAN mirror对吧? 要想让它用一个固定的也不难,在你自己的用户根目录下创建一个文件叫做 .Rprofile, 在里面写上:
    r <- getOption("repos")       
    r["CRAN"] <- "http://website/cran/"
    options(repos = r)
    rm(r)

    顺便说一下,每次你启动R, 它第一件事就是去读这个文件的内容。所以比如 说你自己写了一个顺手的小函数什么的都可以放在这里,用不着专门去打一个 包了。

  4. R的升级命令是 update.packages(). 但这个命令会试图升级你所有的包, 包括系统安装你没有权限也不想改动的。所以我都用这个命令升级:
    update.packages(lib.loc="/path/to/my/lib/R", checkBuilt=TRUE)

    “checkBuilt=TRUE” 的意思是即使某个包的版本号为最新,但如果它是在一个 老版本的 R 环境下编译的那就重新编译; lib.loc 变量,顾名思义,就是 说只升级这个目录下的包。

  5. 删除一个包。你可以直接去其目录裸删,也可以用 remove.packages(c("pkg1", "pkg2"))
  6. 偶尔有在CRAN 上找不到的包,只有一个zip或者tarball的形式。用以下命令安装:
    R CMD INSTALL --library=/path/to/my/R/lib foo_0.76.tar.gz

, ,

留下评论

org2blog用法简介


org2blog是一个让你用emacs org-mode来写博客的转换器。支持wordpress和一些别的网站。

org-mode是emacs下的一个记文件的软件,如果你用emacs而没有用过org-mode, 我强烈建议你学学看。

这里讲的都是org2blog的基本用法。其它高级用法可以在它的网站org2blog上找到。

安装

这个不用讲,直接去它网站上抓那几个el文件下来即可。愿意用git也行。注意得要有xml-rpc.el, 没有可以自己去google一下。

装了以后写新博客

命令是 org2blog/wp-new-entry. 最好自己绑定在一个热键上。

  • Tags/Categories可以用逗号或者空格分开写多个, 自动补齐的热键是=C-c t=.
  • org文件里的 #+DESCRIPTION 会被转换成blog里头的短介绍(excerption).

发表的快捷键

这些热键都得先用 M-x org2blog/wp-mode 激活org2blog mode才能用。而且,还得先登录才行:

  • M-x org2blog/wp-login 登录;
  • M-x org2blog/wp-logout 登出。
    发布为草稿 C-c d M-x org2blog/wp-post-buffer
    发布到博客 C-c p C-u M-x org2blog/wp-post-buffer
    发布为页面草稿 C-c D M-x org2blog/wp-post-buffer-as-page
    发布为页面 C-c P C-u M-x org2blog/wp-post-buffer-as-page

发布已有的org文件

我个人还是喜欢先在本地写好一个org文档,最后再用org2blog发表。这样本地会有一个备份。再说,我也习惯了随时写随时存盘。

  • 虽然不是必须,但最好加上这些关键词: #+TITLE, #+TAGS, #+CATEGORY, #+DESCRIPTION, #+DATE
  • 还可以手动加一个 #+POSTID。
  • 然后用 M-x org2blog/wp-mode 激活org2blog mode,
  • M-x org2blog/wp-login 登录;
  • 再用上面说的热键发表。

别的一些功能

  1. 管理老帖。只能删不能改(因为从org变成html容易,从html变成org就难了)。
    M-x org2blog/wp-delete-entry

, , , ,

一条评论

微软要出ARM版的Windows了 — Linux阵营的重大利好消息


如果微软没撒谎的话,Windows 8会有一个ARM port,而这个玩意和现在的Windows CE不一样,它的内核和绝大部分code base会和它的big brother, 正常桌面版本的Windows一样。

从Redmond的角度来讲,这个举动非常正常。毕竟,移动和嵌入式装置才是未来的增长点,普通的PC市场已经“成熟“了。而且,苹果搞一个操作系统,多个硬件平台ports也有好多年了,效果很好(好到黑莓的整个决策层彻底被骗,陷入空前被动),也等于为它作了一番市场调查。

从长远来看,我认为这一举措要么会是微软白砸钱以完全失败而高中,要么就是中短期成功,但长期来讲很可能会给整个Linux社区带来巨大的利益。原因如下。

  1. 和Apple当年从PPC转向x86平台不同,ARM没有x86芯片的计算速度快(ARM的优势在于简单,便宜,省电),所以单搞一个类似Rosetta那样的模拟器是不行的,效率上跟不上。任何一个像样的大型软件都必须重新编译。另外一点苹果比微软牛的地方在于他们比微软还要恶霸,软件硬件通吃不说,而且苹果当时也包括现在都牢牢掌握其生态系统的核心决策权力,再加上船小好掉头,他们要让所有(其实也没多少)写苹果软件的公司重新编译,它们再不满意最后也都从了;他们还决定要让人编译成双二进制代码(同时能在PPC和x86上跑的fat binary),马上这个就成为行业标准;至于苹果的“上帝“,用户们–苹果今天说PowerPC是人类文明最高的体现这帮人就会说是啊x86简直就是一坨屎,明天说其实还是Intel的x86好同样的一帮人马上又给自己找原因找寄托证明其实自己一直都觉得x86才代表了先进的生产力。微软可没有这么忠心耿耿的客户群和俯首帖耳的第三方软件供应商。所以微软的这种转型要比苹果困难的多。
  2. 再来讲一个更加根本的问题。一个普通用户为什么要选Windows? 答案多半是因为几乎所有的软件都是为Windows写的,而不是说Windows那个界面本身有多了不起。现在张三买了一台ARM+Win8的最新最酷的平板电脑回家,发现他从电驴上当下来的盗版Office没法装了;他一上网,又发现播放一个视频要插件,这个插件当然也是x86才能用的;最后他说老子不上网不用Office了,老子接个摄像头打印机照相机什么的当家庭娱乐机用好了,结果发现所有的硬件驱动也都不能用。这样的Windows有什么用?还不如Linux或者Android,至少你知道那是个不同的东西有不同的装软件的模式。销售这种硬件的厂家也会很头疼,要不停的接客服电话跟他们讲“桌面Windows“和“移动Windows”的区别,要解释很多东西你就是装不了—-不是微软的责任而是第三方供应商不肯“重新编译一下“。但从Linux论坛上用户的提问来看,用户们可不会买这个帐,他们宁愿相信不能跑某个应用程序一定是操作系统的错。
  3. 我们现在假设前面的问题都得到了解决,作为行业老大的微软又一次赢了,ARM+Win8最终取得了成功。那时几乎所有的软件包括中国的网银们都开始写portable的程序,并且会搞cross compilation了。我认为这个前景对所有的用户,当然也包括Linux用户们来讲是非常有利的。因为很多厂家不愿意为Linux写程序的原因是porting成本太高。很少有人和钱包(公司的或者是个人的)过不去,即使Linux只有1%的市场份额那也是几千万人的市场,比很多国家都大了。如果一个软件的源程序本来就写得比较好,易于port,只要很小的改动就能在另外一个操作系统上跑,我相信大部分厂家都会愿意开发Linux, OSX, 等等的程序。而这是一个良性循环,因为应用程序多了,用非主流操作系统的人也会多。这里多说一句,从portability的角度来讲,其实微软自己的代码还真不算差。如果我没记错的话,最早的Windows NT就是同时在x86和MISC上开发的,后来的Alpha,Itanium ports也都还不错。关键是第三方Windows程序员的水平太烂了,这里又以中国当时随着盗版Windows和计算机考级成长起来的一代人为甚。
  4. 还是假设ARM+Win8成功了。但这个成功来自另外一种(说不定更大的)可能,就是基于网络的应用终于成了主流了,Java/.Net/JavaScript/。。。等等不需要cross compilation的程序最终赢得了胜利,那么当然底层你用什么CPU也就无所谓了。这件事情对于所有非主流操作系统用户来说是一个更大的利好消息:因为模拟一个.net解释器的成本比模拟一个Windows要小太多了。如果当真有一天应用程序都在云端了那谁还会在乎本地操作系统是Win8还是Android还是Haiku?

几年前Firefox刚刚兴起(出1.0版左右)的时候我在MITBBS Linux版曾经说过假如Firefox真的成了一个让人不可忽略的浏览器,那么事后看当年netscape决定开源恶心一下微软就是Linux一个起死回生的重大事件,搞笑一点的说就是自从发明了烤面包机以来最好的事件。

为什么?浅显一点的说是因为有了一个好使的主流浏览器Linux才有了可用性(想像一下如果你现在用Linux但只有lynx上网,你还能用Linux当桌面吗),才能够保住现在的1~2%的市场份额;深刻一点的说是因为计算机的未来属于网络,而一个开源,跨平台的浏览器参与竞争能保证网络相关的标准不会被一家垄断,从而让因特网继续成为创新,开放的平台,才会有google, facebook, twitter在微软垄断了桌面系统,击溃了网景之后仍能成长起来,改变我们这些现代人社交,分享信息的方式,甚至改变我们对什么是社交本身的认识。

 

, ,

留下评论

关于MPI的另外一些笔记


openmpi似乎比mpich2更加易用(不用通过mpdboot起一大堆daemons,当然也就不用mpdallexit来清理),而且也是Ubuntu下MPI的首选。有不少人说它的计算效率比另外几个实现更高,目前的Top 500有很多都用openmpi.  最后一个好处就是它的插件架构使得它可以更灵活,比如说同时支持infiniband, tcp, 还有shared memory等等。目前我手上的这个project要求用mpich2, 等弄完了我再仔细研究一下怎么用openmpi —- 看起来和装mpich2差不多(甚至更简单)。

, , ,

留下评论

在Ubuntu system上安装MPI的笔记


基本介绍:这个笔记并不全面(全面的满街都是),我假定你懂Linux基本的配置,会编译程序等等。

配置:两部电脑,一部叫做node1有4核,另外一部叫做node2双核。系统都是Ubuntu 10.04, x86_64. 目前mpich2还不支持在不同架构的电脑上并行运算,所以系统相同,mpich2的版本号一致等等是一个前提条件。

1. 安装

sudo aptitude install mpich2 libmpich2-dev mpich2-doc

其中mpich2是MPI的一个比较新的implementation, 如果你只需要跑别人编译好的mpi程序只装这个包就够了。这个包提供了这些工具:mpd, mpdboot, mpdcheck, mpdcleanup, mpdexit, mpdhelp, mpdrun, mpdtrace, mpiexec等等。
mpich2-doc,顾名思义,是它的一些文档(装在/usr/share/doc/mpich2-doc/下),但更重要的是这个包还包括了一些examples, 通过它们第一可以检查你安装的对不对,第二可以学习一下简单的MPI编程。

libmpich2-dev提供了编译MPI程序所必须的libraries(比如/usr/lib/libmpich.so),header文件(比如/usr/include/mpich2/mpicxx.h),还有gcc的一些wrapper(比如/usr/bin/mpicc)。

2. 网络设置
这一步非常重要:改/etc/hosts, 让所有的机器的hostname都解析成对方能连上的IP:

127.0.0.1     localhost
192.168.1.101 node1
192.168.1.102 node2

讲一下道理。mpd之间是这样通讯的,每个mpd都能记住自己机器的hostname(比如说node1)和在/etc/hosts里对应的IP,并且把这个IP报告给别的机器。在Ubuntu系统上,缺省设置你的hostname对应的是一个内部IP,比如说127.0.1.1。你如果不改的话,从node1上连node2就会连node2报上来的这个假IP(127.0.1.1),结果是连回自己了。这是新手极其容易犯的一个错误,而且很不好debug。

一个相关的事情是你得想办法让两部机器的文件同步。标准的办法是通过某种网络文件系统(比如说NFS或者SSHFS),这里我就不介绍了。但其实很多人不知道,如果你的MPI程序不要求多个nodes同时读写,NFS并不是必要的。理论上讲,只要你编译的程序本身在两部机器上都在一个路径下即可。

最后,使用MPI的一个前提就是在所有nodes之间可以用ssh无密码登录。这个的实现不难,google一下passwordless ssh即可。
3. 调试MPI编译环境
把/usr/share/doc/mpich2-doc/examples/拷贝到某个目录下。随便找一个例子(比如说examples_graphics/cpi.c)编译一下试试看

mpicc cpi.c -o cpi

注意:你暂时不可以用例子里自带的makefile自动编译,因为那个makefile调用了MPE。而由于MPE的软件许可和GPL不兼容,Ubuntu把所有和MPE有关的包都删了。但Ubuntu保留了一个mpe-source。我回头有时间写一下怎么通过这个包来安装MPE,装上了就可以直接make。就一般的MPI使用来讲这个东西也没什么必要。

4. 调试MPI运行环境
首先,在自己的home directory里生成一个mpd的控制文件~/.mpd.conf, 里头的内容是secretword=something。并且修改该文件属性只有本人可读(chmod 600 ~/.mpd.conf)。稍微解释一下,这个secretword其实没什么用,只是在一些比较特殊的情况下系统用来区分哪些process是你生成的哪些是别人的而已。所以,你完全可以随便生成一些随机字符串。对了,mpd是一个守护进程,负责分派管理MPI进程和它们的通讯的。

假设你没有这个文件,或者这个文件的属性不对,你就会得到如下的非常神秘的出错信息:

mpdboot_node1 (handle_mpd_output 420): from mpd on node1, invalid port info:
no_port

其次,在你的working directory(不一定非得是home directory)里生成一个文件叫做mpd.hosts, 里头内容如下:

node1
node2

解释一下,这个文件是给mpdboot用的。它告诉mpdboot(最多)有两部电脑可用。mpdboot本身只是一个很简单的wrapper, 它通过ssh在那两部电脑上同时跑mpd而已。你要愿意,也完全可以不用mpdboot,而是到两部机器上自己手动运行mpd,效果是一样的。

 

好了,现在可以开始开始做实验。第一步检查一下这两个nodes是否都能连上。

mpdcheck -f mpd.hosts -ssh

如果一切正常,我们就开始正式启动mpd

mpdboot -n 2 -f mpd.hosts
mpdtrace

第一个命令启动两个nodes上的mpd, 第二个命令检查是否两个nodes上的mpd都起来了。记住,这里的参数-n 2指的是两个nodes, 不是两个cpu!

最后就是用mpiexec执行一个测试程序(以开头编译的cpi为例)。因为mpdboot其实并不负责管每个node有几个CPU,而我们这个例子里的两个nodes的CPU数量不一样,所以我们还得写最后一个配置文件给mpiexec每个node最多能同时起多少个processes。这个文件可以就放在working directory下,比如说就叫做machine_file:

node1:4
node2:2

这个文件说明node1能同时跑四个进程,node2能跑两个。
最后的试验:

mpiexec -machinefile machine_file -n 6 /path/to/cpi

注意一下,这里面的-n说的不是nodes, 而是多少个进程了。另外重复一遍,/path/to/cpi在两部机器上必须一样。NFS倒是没有必要。

, , , ,

留下评论

局域网内快速传文件的一个方法


局域网内传文件的瓶颈往往不在网卡或者路由的速度,而在于文件传输方式(sftp, samba, etc)本身需要占用较高的CPU。

UNIX系统自带了一个非常简单的工具,叫做netcat. 你基本上可以说它就是一个socket()的最简单的命令行实现。使用这个命令可以建立一个非常简单的文件传输通道,几乎省却了所有的有关文件加密,处理的环节。在最快的局域网,用它有时能比基于SSH的sftp/rsync快一倍。

使用方法:1. 在传文件的电脑(SERVER)上跑:
tar -c filedir/subdir/ | nc -l 1234
2. 在收文件的电脑(client)上跑:
nc SERVER 1234 | tar x

解释一下。第一个命令在SERVER上建立了一个port number为1234的socket通道,通道里面是打包命令tar -c 从管道里传过来的filedir/subdir/下的所有文件。第二个命令在CLIENT上接受SERVER port 1234号socket,并把接收到的内容通过管道交给打包命令tar x来解包。这两条命令虽然不如直接用在CLIENT上rsync来得简单,但效率确实高了不少。

这个实例也算是一个最简单的UNIX socket编程吧?Windows下貌似没有socket这么方便的东西,想要网络编程似乎没有在UNIX下简洁方便。

, ,

留下评论