有关Raspberry Pi 32位framebuffer的问题

本文同步自(最佳显示效果请点击):https://zohead.com/archives/raspberry-pi-32bit-fb-color/ 之前写过一篇 Raspberry Pi(以下简称 RPI) 下使用 fbpdf 即 framebuffer 模式下的 PDF 阅读器的文章(详情请点击 [这里]),文中提到需要修改 config.txt 开启 RPI 的 32 位 framebuffer 支持,但需要注意的是 RPI 的 32 位 framebuffer 并不是真正的 32 位的,其实只有 20120615 种颜色,而且实际上还需要忽略 alpha 位,这在使用 fbpdf 软件看 PDF 时似乎没有太大的问题。 但今天用看图的软件看一张 32 位的桌面截图时,有点傻眼了,效果如下: 大家也能看出来,其实这就是 Windows 7 默认的浅蓝色桌面壁纸图片,但实际的显示颜色完全不对了,而去掉 config.txt 中的 32 位 framebuffer 支持则没问题。 另外据 RPI 上 XBMC 媒体中心软件 Raspbmc 的开发人员介绍,32 位的 framebuffer 下 XBMC 软件也会存在问题,由此看来 RPI 默认将 framebuffer 的颜色深度设置为 16 位是有其道理的。 上面的 fbpdf 文章中的 fbpdf 程序已经更新为 16 位 framebuffer 的版本,如果对此有不同见解的欢迎提出指正哦。 ^_^

使用Linux kernel dm-mirror实现设备间同步

本文同步自(最佳显示效果请点击):https://zohead.com/archives/dm-mirror-sync-device/ 在某些场合下,用户需要在 Linux 系统中实现直接的块设备同步方式,需要将一个裸设备中的内容完全同步到另一个裸设备,有时甚至需要能自定义位移和大小进行同步,这时 Linux 自带的 dm-mirror 模块很可能是比较好的实现方案。 dm-mirror 是 Linux kernel 中 device-mapper(DM)模块(device-mapper 内部称为 target)中的一个,可以实现多个块设备间的数据同步,并支持通过 dm-log 模块保存同步时的元数据信息,方便在关机和重启之后能够继续之前的进度进行同步,而且 dm-mirror 的元数据可以选择保存在内存中或者固定的块设备中。LVM 逻辑卷管理中的 pvmove 命令可以在卷组中替换物理卷,pvmove 命令正是基于 dm-mirror 模块实现的。Linux kernel 中还包含了其它的一些 device-mapper target 模块,例如 dm-linear(用于实现 LVM 逻辑卷管理)、dm-crypt(加密数据)、dm-snapshot(用于实现即时快照)等。 dm-mirror 的主要实现代码在 Linux kernel 代码树的 drivers/md/dm-raid1.c 中,dm-mirror 的日志元数据记录功能通过 dm-log 模块实现,同步的区块划分由 dm-region-hash 模块实现,底层的同步实现则由 kcopyd 来实现。kcopyd 的功能就是从一个块设备拷贝一定扇区的数据到另一个或多个块设备,kcopyd 支持异步的完成通知功能,目前主要被 dm-snapshot 和 dm-mirror 模块使用。有关 Linux kernel 中 kcopyd 的说明请参考这里:http://www.kernel.org/doc/Documentation/device-mapper/kcopyd.txt。 dm-mirror 设备的装载通过 dmsetup 命令来实现,以下说明的地址都是以扇区为单位(固定为 512 个字节),先看看 dm-mirror target 的 table 格式: start length mirror log_type #logargs logarg1 … logargN #devs device1 offset1 … deviceN offsetN [#features <features>] 对每个值分别说明如下: start 为虚拟设备起始扇区地址,一般固定为 0 length 为 dm-mirror 设备的大小,也就是同步的总扇区大小 mirror 值固定,表示这是一个 dm-mirror 设备 log_type 指定日志元数据类型,常用的是 core 和 disk 两种类型 #logargs 表示后面的 logarg1 … logargN 一共有多少个 #devs 表示需要同步的设备个数,每个设备都有一个 device 值和一个 offset 值 deviceN offsetN 为每个需要同步的设备的设备路径(或者设备号)和偏移地址 #features 和 features 为可选的值,#features 表示可选项个数 如果指定了 #features,则必须为 1,且 features 必须为 handle_errors(表示 dm-mirror 会自动进行错误处理,即同步出错时自动停止同步并删除 dm-mirror 虚拟设备) 然后是 core 和 disk 两种日志元数据类型的介绍(另外有 clustered_core 和 clustered_disk 两种适用于集群的日志类型,有兴趣可以自己去了解下哦): core 类型(内存): 日志保存在内存中,关机或者重启之后会丢失,因此安全性较差,但由于元数据存放在内存中,性能相对 disk 类型来说是非常好的。#logargs 个数为 1-2 个,日志参数格式为: regionsize [[no]sync]regionsize 为日志区块的大小(512 个字节的扇区为单位),可选的 sync 和 nosync 用于指定 dm-mirror 是否已经同步过。 disk 类型(磁盘): 日志保存在磁盘(块设备)中,因此可以在关机或重启之后继续之前的同步进度,当然性能比 core 类型肯定是要差一些的。#logargs 个数为 2-3 个,日志参数格式为: logdevice regionsize [[no]sync]logdevice 指定日志元数据存放在哪个块设备上,可以使用设备路径或者主从设备号形式,其它参数与 core 类型相同。 Linux 系统中 dm-mirror 具体使用步骤举例如下: 首先加载 dm-mirror 模块: modprobe dm-mirror  准备好需要同步的设备,假设是实际应用中的一种常见需求:Linux 系统盘为 /dev/sda,系统中另外有个数据盘 /dev/sdb。但由于磁盘 /dev/sdb 寿命快到了,需要将 /dev/sdb 磁盘上的数据同步到 /dev/sdc 上,/dev/sdc 的容量比 /dev/sdb 要大。先得到 /dev/sdb 和 /dev/sdc 的容量大小(以 512 个字节的扇区为单位): blockdev --getsz /dev/sdb blockdev --getsz /dev/sdc假设分别为 209715200(100G) 和 314572800(150G)。 在系统中通过文件方式产生 loop 设备用作 dm-mirror 同步存放日志元数据的设备,防止关机或重启之后同步进度丢失,1MB 的文件已完全足够保存日志元数据:dd if=/dev/zero of=meta.dat bs=1024k count=1运行完成将产生一个 1MB 大小的 meta.dat 文件。 准备 loop 设备:losetup -f 得到空闲的 loop 设备名,假设为 /dev/loop0;losetup /dev/loop0 meta.dat 装载 loop 设备。 运行 dmsetup create 命令创建 dm-mirror 设备进行同步:echo “0 209715200 mirror disk 2 /dev/loop0 16384 2 /dev/sdb 0 /dev/sdc 0 1 handle_errors” | dmsetup create mirror0运行成功之后将产生名称为 mirror0 的虚拟 dm-mirror 设备。echo 中间的字符串即为 dm-mirror 的 table 格式:209715200 为同步的大小,disk 指定元数据保存在磁盘中,/dev/loop0 为元数据设备,16384 为区块大小(这里指定为 8MB 为提高同步性能),后面的参数指定将 /dev/sdb(源设备,起始地址为 0)的数据同步到 /dev/sdc(目标设备,起始地址为 0),1 和 handle_errors 表示不忽略同步错误。 查询同步状态和进度:dmsetup status mirror0输出类似下面:mirror0: 0 209715200 mirror 2 8:16 8:32 417/12800 1 AA 3 disk 7:0 A8:16 […]

Raspberry Pi framebuffer PDF阅读器 - fbpdf

本文同步自(最佳显示效果请点击):https://zohead.com/archives/raspberry-pi-fbpdf/ 最近拷了几个 PDF 电子书到 Raspberry Pi 树莓派小主板系统上,准备小充下电,结果在 Debian Wheezy Raspbian 的 Linux X11 系统下用以前用的 xpdf 软件看 PDF 的不爽:由于 Raspberry Pi 的 CPU 是 ARMv6 700MHz 的,性能一般,而且内存只有 256MB,所以跑 Linux X11 虽然没什么问题,但老感觉看大一点的 PDF 有点拖顿。 后来装了比较小巧的 mupdf 软件(Raspbian 系统的话直接用 apt-get install mupdf 命令就可以安装)之后在 X11 环境下看 PDF 电子书似乎情况好了很多,mupdf 功能很简单,甚至都没有独立的启动方式,直接双击 PDF 文件运行,或者通过命令行方式运行,主界面也没有工具栏之类的多余东西,操作全部键盘来完成,浏览 PDF 的速度也很快,对中文支持也很好。关于 mupdf 的介绍请参考其官网:http://www.mupdf.com/。 后来想到平时用 Raspberry Pi 主要还是用命令行模式,我对 Linux X11 一向比较反感 ^_^,感觉是不是可以直接用 framebuffer 的形式看 PDF,结果还真找到一个 fbpdf 软件。 fbpdf 是基于 mupdf 的代码基础上实现的纯 framebuffer 下的 PDF 阅读器,和 mupdf 的功能基本相当,用这个可以省去 X11 和 GTK+ 等一堆臃肿的玩意,在 framebuffer 上看不仅速度快而且占用内存也小,并且可以充分利用 Raspberry Pi 上 framebuffer 的硬件加速。但不幸的是 Raspberry Pi 的 Raspbian 源中没有 fbpdf 包,看来只能自己编译了。 fbpdf 的 Git 版本库地址(可以直接用 git clone 命令弄下来哦): http://repo.or.cz/w/fbpdf.git 首先到 mupdf 官网下载 mupdf 源代码和 mupdf-thirdparty 第三方程序的源代码: http://www.mupdf.com/download/mupdf-1.1-source.tar.gz http://www.mupdf.com/download/mupdf-thirdparty.zip 需要说明的是我的编译环境是 armhf 的 Raspbian 默认开发环境。编译 mupdf 之前需要先安装 libfreetype6-dev、libjbig2dec0-dev、libjpeg8-dev 等开发软件包。mupdf 编译安装好之后会产生 fitz 库的头文件和静态库文件 libfitz.a,libfitz.a 在编译 fbpdf 时需要用到。 特别需要注意的是 mupdf 和 fbpdf 使用的是修改过的 openjpeg-1.5.0 版本的 openjpeg 库,不能直接使用 Raspbian 系统中的 libopenjpeg2 库,因此需要先编译 mupdf-thirdparty 中的 openjpeg-1.5.0 库,为了防止和 Raspbian 默认的 openjpeg 库冲突,建议将 openjpeg-1.5.0 库安装到自定义的目录(非 /usr/lib、/usr/local/lib 等系统默认使用的目录),然后编译 fbpdf 时直接使用 openjpeg-1.5.0 产生的静态库文件 libopenjpeg.a。 在 Raspberry Pi 编译 fbpdf 时会有一些小报错,需要修改下代码和 Makefile,编译 fbpdf 时由于要使用 libfitz.a 静态库,因此生成的 fbpdf 可执行文件也会比较大(我编译产生的将近 6MB)。 在 Raspbian 系统的默认 framebuffer 文本终端下运行 fbpdf /home/xxx.pdf (/home/xxx.pdf 为 PDF 文件的路径)就可以查看 PDF 文件了,你的 Raspberry Pi 在用 fbpdf 打开 PDF 时很可能会遇到这个错误直接退出:fbpdf: fbval_t doesn’t match fb depth。 简单说明下这个错误的原因: fbpdf 程序中默认使用的 framebuffer 颜色数(BPP)是 32 位的,但 Raspberry Pi 默认的 framebuffer 只使用 16 位颜色(也就是下面的 framebuffer_depth 默认为 16),这样 fbpdf 程序运行时检查 framebuffer 参数发现不匹配就会报上面的错误,我尝试过跳过这项检查可以不报错,但 PDF 文件的显示渲染效果相当差。 解决方法也是必须要有的: 注意:不建议使用此方法,建议直接使用最下面的 16 位 framebuffer 版本。 打开启动分区下的 config.txt 配置文件(路径为:/boot/config.txt),加入下面两行然后重启系统就可以解决: framebuffer_depth=32 framebuffer_ignore_alpha=1 第一行 framebuffer_depth=32 指定 Raspberry Pi 的 framebuffer 使用 32 位颜色,第二行 framebuffer_ignore_alpha=1 是在使用 32 位颜色时才需要指定的,表示忽略 ARGB 颜色中的 alpha 通道。需要说明的是即使 config.txt 配置文件中指定了使用 32 位实际上也只有 20120615 种颜色的哦,不过对使用上没有影响的。 有关 Raspberry Pi 的 config.txt 配置文件的详细说明请参考这里:http://elinux.org/RPi_config.txt。 把上面的配置文件修改好重启之后,下面是用我编译好的 fbpdf 程序查看一个 5MB 的 PDF 电子书的截图,在 Raspberry Pi 这样的微型板上速度是相当之快的: 从截图中可以看到图片和中文都是可以正常显示的哦。 framebuffer 模式下的 fbpdf 也是全部通过键盘操作,不过快捷键和 mupdf 是不同的,将常用的快捷键简单介绍如下(注意是 J、K 等单按键是区分大小写的哦),大多数快捷键都可以在前面加数字指定次数之类的(深得 VI 的精髓啊,哈哈)。具体请参考 fbpdf 代码中的 README 说明文档: 快捷键 操作 Ctrl + F 或 J 下一页(5J 跳至下面第 5 页,6J 类推) Ctrl + B 或 K […]

Raspberry Pi十六进制编辑器wxHexEditor

本文同步自(最佳显示效果请点击):https://zohead.com/archives/raspberry-pi-wxhexeditor/ 最近在 Raspberry Pi 编程时需要对文件进行十六进制编辑,原来一直用的 vim 配合 xxd 来实现的,但用起来还是各种不方便,在切换到 X11 界面时,想着能不能直接装个图形的编辑器来方便操作。 简单搜索之后发现 Linux 环境下好用的十六进制编辑器确实太少了,原来用的 Ghex 软件由于必须要 GNOME 环境支持果断放弃,UltraEdit 软件已经移植到 Linux 下,但由于是闭源的只有 X86 下的版本。装了这个 Bless Hex Editor 软件,是基于 Mono 实现的,但发现有一些非正常退出的 bug,还是弃用之。 最后发现的 wxHexEditor 看起来很不错,基于 wxWidgets 实现,因此实现了 Windows、Linux、Mac OS X 跨平台,而且速度也挺好,不会一下装载整个文件,这对编辑大文件非常有用,填补了 Linux 上缺少好的十六进制编辑器的空白,看看 Linux 上的运行截图: 想直接在线安装 wxHexEditor 发现有问题了,Raspberry Pi 的默认 Debian Wheezy 发行版中没有这个软件,需要自己来编译了,首先到其官网下载源代码包:http://www.wxhexeditor.org/。 首先 Raspberry Pi 需要相对完整点的开发环境,gcc、make、g++、autoconf、libtool 等一些开发工具包都是需要安装的。准备好之后使用 apt-get install libwxgtk2.8-dev 命令先在 Raspberry Pi 系统中安装 wxWidgets 的最新版本的库文件(自动依赖并安装)和开发包。然后进入解压缩出来的 wxHexEditor 源代码目录,运行 make OPTFLAGS=”-fopenmp” 命令就可以进行编译,粗略估计编译需耗时 15 分钟左右(有点汗…)。 不想自己的编译的童鞋欢迎使用我编译好的版本哦,解压缩把 wxHexEditor 文件拷到 /usr/bin 之类的路径即可,要运行此程序最少要安装 wxWidgets 运行库哦(apt-get install libwxgtk2.8-0),需要注意此文件只在 Raspberry Pi 的 Debian Wheezy hardhf 版本系统中可用: http://miseal.googlecode.com/files/wxHexEditor-v0.20.7z

修改XBMC LiveStreams Python插件以支持中文

本文同步自(最佳显示效果请点击):https://zohead.com/archives/xbmc-livestreams-cn-patch/ 最近在闲时捣鼓下 Raspberry Pi 微型电脑板上的开源 XBMC 应用准备看看 HTPC 媒体中心的效果,发现 Raspberry Pi 在安装了 XBian 系统之后可以比较好的实现 XBMC 的基本功能,虽然由于 Raspberry Pi 没有购买一些视频格式的软件解码授权而导致 WMV 或者 MMS 之类的格式无法播放,但对于常用的一些 H264 的高清视频已经足以应付,接上网线之后看高清在线视频点播和直播的效果都还可以。 有关 Raspberry Pi 请参考 [之前] 的文章,有关 XBian 之一专门为 Raspberry Pi 优化的 XBMC 系统可以访问其官网:http://xbian.org/。 注:Raspberry Pi 上除了 XBian 之外,还有 Raspbmc、Openelec 等其它合适的 XBMC 系统可供选择的。而且这些都是基于标准 XBMC 程序修改的,标准插件之类的基本可以通用。 前两天找到一个不错的在线电视直播的 XBMC 插件:LiveStreams,此插件可以由用户自己修改 XML 配置文件增加在线直播的地址,根据实际硬件配置不同,可支持 MMS、RTSP、RTMP 等各种不同的流媒体协议。有关 LiveStreams 的介绍和配置请参考这些链接(特别第二个链接中有详细的截图介绍): http://forum.xbmc.org/showthread.php?tid=97116 http://www.xbmchub.com/blog/2012/04/26/adding-custom-xml-files-to-the-live-streams-addon/ 最新版本的 LiveStreams 插件可以到这里下载:http://code.google.com/p/divingmules-repo/。 在实际使用过程中发现由于 LiveStreams 由于是老外写的,不由自主的就碰到对中文的支持问题,如果添加的 XML 配置文件中节目名称或者节目目录名称包含中文,XBMC 系统中LiveStreams 插件将不能正常工作,直接会出现脚本错误。 简单看了下 LiveStreams 插件的代码,是用 Python 写的,凭着一些简单的 Python 基础,然后集合 Python 的 logging 模块来调试,终于发现 LiveStreams 插件对中文支持不佳的原因,作者在使用 BeautifulSoup(参考 [这里]) 这一个非常知名的 HTML/XML 等解析的库时未考虑非英文环境下的问题,简单做了下修改之后,中文的直播节目和目录名称都可以正常显示了。 顺便再简单说明一下 LiveStreams XML 配置文件嵌套节目目录的方式,这是一个实例 XML 节目配置文件: 第一个节目目录 Channel 1 下面没有子目录,只有 TV1 和 TV2 这两个节目,因此 XML 层次是 channel/items/item。第二个节目目录 Channel 2 下有名为 Sub1 的子目录,Sub1 下又有 Sub TV1 和 Sub TV2 两个节目,这种的 XML 层次则是:channel/subchannels/subchannel/subitems/subitem。 需要注意的是 LiveStreams 的 XML 配置文件必须以 UTF-8 编码格式保存,否则非英文字符将无法正常显示。另外由于 XML 本身格式的原因,XML 内容中的这些字符需要转换(全部为纯英文字符,包括结束的分号): & 转换为 &amp; < 转换为 &lt; > 转换为 &gt; ‘ 转换为 &apos; ” 转换为 &quot; 最后附上我修改过的最新 LiveStreams 1.0.6 版本 XBMC 插件的下载地址: http://miseal.googlecode.com/files/plugin.video.live.streams-1.0.6.zip 由于这插件只是随便修改的,有任何问题欢迎指正哦。 ^_^

Symantec备份软件独立磁带驱动集

本文同步自(最佳显示效果请点击):https://zohead.com/archives/symantec-tape-driver/ 最近需要使用 Symantec Backup Exec、NetBackup 等备份软件测试磁带库,而且 Backup Exec 中已经自带了很多的磁带和磁带库的驱动,但是这些驱动没法独立出来用。特别是在新的 Windows 系统上,如果 Backup Exec 备份软件无法安装,而又找不到磁带驱动,这时就需要专门的 Symantec 的磁带驱动集了。 Symantec 官方网站上有最新版本的 Tape Device Drivers 更新程序,例如: http://www.symantec.com/business/support/index?page=content&id=TECH173790 这个是 Symantec Backup Exec 2010 R3 版本的最新磁带驱动集。 下载之后,你会发现这个更新程序必须在安装了其对应版本的备份软件之后才能运行,不同远程安装到别的机器上,这多少显得非常不便。为此我从 Symantec 官网最新版本的 Tape Device Drivers 程序中导出了所有的驱动和安装程序并打包,此包可以在没有安装 Symantec 软件的情况下,通过设备管理器直接找到解压缩的目录进行磁带驱动安装。如果安装了 Symantec 备份软件,你也可以直接用包中的 tapeinst.exe 程序自动安装更新磁带的驱动。 做这个驱动集合包的步骤也很简单,解压缩 Symantec 安装程序,然后从中得到 Data.cab 之类的压缩包并解压缩(新版本的安装程序中可能是 msp 类型的数据文件,可以用 Universal Extractor 之类的软件进行解压)。解压缩之后会看到一堆文件名很长的文件,例如:F1078_testfile.sy_.1B15BB01_8E2D_4A12_A3E6_175864F3EF67。 实际上这种长的文件是压缩过的驱动程序(原文件名:testfile.sys),只不过文件名上加了点处理,为此我写了个非常简单的脚本进行自动遍历文件并解压缩: 这个脚本用到了 Windows 下的命令,因此需要在 Windows 下通过 Mingw 或者 Cygwin 之类的类 Linux shell 环境来运行。此脚本已在 Symantec 几个不同版本的 Backup Exec、NetBackup 备份软件的 Tape Device Drivers 包下验证过。 脚本会自动判断遍历到的文件是否是压缩的(压缩的文件扩展名名是以下划线结尾的,例如 test.exe 压缩后变为 test.ex_),如果是压缩的,则尝试自动修改后缀名,并通过 Windows 自带的 expand 命令将压缩的文件解压缩到指定的目录中(压缩的文件名 [test.ex_] 变换为正常的文件名 [test.exe]),如果没有识别到压缩文件类型,脚本会将压缩文件名和上面的完整文件名打印输出方便用户手工处理。如果遍历到的文件不是压缩的,那直接拷贝到指定的目录中(文件名也变换为正常的文件名)。 我已经打包好的 Symantec 磁带驱动集可以在这里下载: http://miseal.googlecode.com/files/symantec-tape-drv-v1.0.7z PS: 如果有的磁带未找到驱动,但确认 Symantec 可以支持,你可以自己修改解压缩出来的 vrtstape.inf 配置文件将自己的磁带设备信息加进入。另外 extract-symantec-driver 脚本也已经在压缩包中。这个驱动集主要是方便自己测试使用的,如果有任何问题欢迎指正哦。

Raspberry Pi初步上手

本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/raspberry-pi-start/ 前段时间听到 Raspberry Pi 微型电脑板(中文名称:树莓派)出来的消息,这是一个只有信用卡大小的售价 35 美元的 ARM 板,运行 Linux 系统,支持高清输出和高清视频播放,适合做各种省电的小应用方案,国外现在研究这个的人也很多,不过当时都需要直接从英国订购,发货时间长而且还要扣掉有点“可观”的税费,故没有很快买。 有关 Raspberry Pi 的详细介绍参考这里: http://en.wikipedia.org/wiki/Raspberry_pi 前两天看到 e络盟 网站上已经有了中国区的 Raspberry Pi 直接网上订购服务,在 e络盟 网站上注册账户并忍受其相当不人性化的支付和下订单方式之后,昨天终于收到寄过来的 Raspberry Pi B型板(售价 + 增值税 + 运费一共 300 天朝币多一点)。包装非常简单,只有裸板。 e络盟 上的 Raspberry Pi 订购链接在此,有兴趣的朋友也可以买来折腾试试:http://cn.element14.com/raspberry-pi/raspbrry-pcba/sbc-raspberry-pi-model-b/dp/2081185 从图上也可以看到 Raspberry Pi 算是麻雀虽小五脏俱全滴,板子中间有树莓派的 LOGO。整板使用 Broadcom BCM2835 SoC(集成 CPU、GPU、DSP、SDRAM),处理器为 ARM1176JZF-S 700 MHz,内存 256 MB,有 HDMI 输出(标准接口)、两个 USB 2.0 接口(支持 USB HUB)、一个 SD 卡插槽、一个百兆以太网卡、音频输出、GPIO 调试接口等,而且整个板子的功率只有 3.5W,可通过 MicroUSB 或者 GPIO 供电,一般的 5V 700mA 或以上的充电器就可以给 Raspberry Pi 供电。 由于 Raspberry Pi 只提供裸板,不提供其它一切配件,这些都要自己来弄了。我这没有支持 HDMI 或者 DVI 的高清显示器,只有老式 VGA,故先在网上淘了一个 HDMI 转 VGA 的转接头(需要注意的是 HDMI 转 DVI 再转 VGA 的方式是行不通的哦)。HDMI 转 VGA 是由数字信号转为模拟型号,必须使用数模转换芯片,因此这种转接头经常会有兼容性问题,购买时需要注意是否兼容。我买的是淘宝上的 鑫魔王 HDMI 转 VGA 线,并且特别买了支持音频输出的转接线(免广告之嫌,不给出链接 ^_^)。 Raspberry Pi 只支持从 SD 卡启动,不支持从 USB 启动,但可以启动好之后将 rootfs 放到 U盘上,为最好地兼容和优化考虑,建议使用 Raspberry Pi 官方网站上的 Raspbian “wheezy” 系统(点击 [这里] 进入下载),为此需要 SD 卡最小得有 2G。从官方网站下载系统后可以直接拷贝到 SD 卡中(dd 或直接对拷,不需要分区)。 由于我使用了 HDMI 转 VGA 装置,为了能正确完美的显示,需要先修改 SD 卡启动分区(FAT16 格式)中的 config.txt 配置文件: hdmi_force_hotplug=1 hdmi_drive=2 hdmi_group=2 hdmi_mode=47 disable_overscan=1 hdmi_force_hotplug、hdmi_drive、hdmi_group 都是为了使 HDMI 转 VGA 能正常工作,hdmi_mode 设置显示输出的分辨率(47 为我的显示器用的 1440 x 900 的分辨率,具体请参考 Raspberry Pi 上的帮助),disable_overscan 则是为了去掉显示画面四周的黑色边框。 有关 Raspberry Pi 配置文件的介绍请参考这里:http://elinux.org/RPi_config.txt 把 Raspberry Pi 的 HDMI 通过转接线接到 VGA 显示器,接上 USB 鼠标和键盘,插上网线,安装 SD 卡,然后供电(我实际使用的就是 5V 700mA 的手机充电器,完全没有压力 ^_^),正常的话就可以看到显示器上的启动输出画面咯: 具体的接线方式见下图(比较凌乱,哈哈): 稍等片刻,就会出现终端的登录界面。 直接敲回车登录,默认就是 raspi-config 配置界面,建议先做基本的配置,特别是语言、时区、键盘布局之类的,这些比较重要,而且从 Raspberry Pi 官方下的系统里的配置全都是适合英国的配置,我分别将语言设置和时区为中文、键盘改为美式键盘。 Raspbian “wheezy” 系统是基于 Debian 系统修改的,默认使用的是 DHCP 方式获得 IP,如果没有获得 IP 请手工配置。系统中的 apt 源也已经默认设置为 Raspbian 网站上的源,直接运行 apt-get 命令就可以安装需要的软件包。 在开启图形界面前,建议先使用 apt-get 命令在线安装下面的这些软件包,这对中文显示和输出比较重要: sudo apt-get install ttf-wqy-zenhei sudo apt-get install ttf-wqy-microhei sudo apt-get install fcitx 前两个是安装中文字体(不建议安装 simsun 字体),第三个安装中文输入法。 全部配置好之后就可以运行 startx 命令进入图形界面(图中即为 1440 x 900 的分辨率): 桌面中间又是大大的树莓派 LOGO。Raspbian “wheezy” 系统没有使用 GNOME 或者 KDE 之类的桌面环境,而是使用的 LXDE 轻量级桌面,这样也比较适合 Raspberry Pi 这种小的系统环境。 Raspbian “wheezy” 系统默认也自带了一些编程环境、网络浏览器之类的。下面是浏览中文网页的效果,看起来还是比较完美的(不支持 Flash 之类的就无所谓了 ^_^): 从初步上手使用的效果来看,Raspberry Pi 还是比较令人满意,高清视频播放还没机会测试。下面有机会再来继续折腾了,网上用 Raspberry Pi 做的比较多的是下载机之类的,还有另类的牛人加上了温度传感器之类的东东。 PS:Raspberry Pi 由于只有 256 MB 的内存,因此运行大的程序还是有点卡,而且系统整体的响应速度也和使用的 SD 卡有些关系,未避免影响系统系统,建议使用 class 4 或更高速度的存储卡。

《The Alchemist》阅读摘录(2)

本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/the-alchemist-snippet2/ 1、朝圣 - 水晶店主的梦想: “Two days ago, you said that I had never dreamed of travel,” the merchant answered. “The fifth obligation of every Muslim is a pilgrimage. We are obliged, at least once in our lives, to visit the holy city of Mecca.” “Mecca is a lot farther away than the Pyramids. When I was young, all I wanted to do was put together enough money to start this shop. I thought that someday I’d be rich, and could go to Mecca. began to make some money, but I could never bring myself to leave someone in charge of the shop; the crystals are delicate things. At the same time, people were passing my shop all the time, heading for Mecca. Some of them were rich pilgrims, traveling in caravans with servants and camels, but most of the people making the pilgrimage were poorer than I.” “All who went there were happy at having done so. They placed the symbols of the pilgrimage on the doors of their houses. One of them, a cobbler who made his living mending boots, said that he had traveled for almost a year through the desert, but that he got more tired when he had to walk through the streets of Tangier buying his leather.” “Well, why don’t you go to Mecca now?” asked the boy. “Because it’s the thought of Mecca that keeps me alive. That’s what helps me face these days that are all the same, these mute crystals on the shelves, and lunch and dinner at that same horrible café. I’m afraid that if my dream is realized, I’ll have no reason to go on living.” “You dream about your sheep and the Pyramids, but you’re different from me, because you want to realize your dreams. I just want to […]

SMB 3.0 over RDMA 性能测试

本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/smb3-over-rdma-performance/ Windows Server 2012 (之前的名字就是 Windows Server 8)即将到来,近日看到原来 Windows Server 8 中新增的 SMB 2.2 文件共享协议也有了新的官方名称:SMB 3.0,看看这个介绍说明: http://blogs.technet.com/b/windowsserver/archive/2012/04/19/smb-2-2-is-now-smb-3-0.aspx SMB 3.0 相对于 Windows Server 2003 以及以前的操作系统中的 SMB 1.0 协议增加了很多新的特性: 精简 SMB 1.0 中繁多的命令,减少 ACK 提高效率; 支持流水线机制,可以在上一个 SMB 命令未完成之前发新的命令; 支持符号链接,支持更大的文件块大小提高大块文件读写的性能; 更好的 oplock 机制; 更像真正的文件系统,原来不能安装在 SMB 共享中的程序(例如:SQL Server)也可以使用了; 支持通过 RDMA(Remote Direct Memory Access) 远程直接访问数据提高在 Infiniband 等环境下的性能; 多通道支持,通过多网络通道提高性能,而且支持错误容忍和集群。 刚好旁边有两张 Mellanox 的 Infiniband 卡,顺便就来看看 SMB 3.0 over RDMA 的实际读写性能怎么样咯。由于 SMB 3.0 只有 Windows Server 8 或者 Windows Server 2012 才支持,因此用 Windows Server 8 的测试 ISO 安装并拷贝了一份系统(服务器和客户端都必须支持 SMB 3.0)。 测试环境: 服务器: Intel S5500BC 服务器主板; Intel Xeon E5506 CPU * 1; Kingston DDR3 1066 4G 服务器内存 * 1; Mellanox MHQH29B ConnectX®-2 系列 32Gbps Infiniband 卡(PCI-E x 8 插槽); Adaptec RAID 51645 PCIe SAS RAID卡; WD WD10EVDS 1TB SATA 监控硬盘 * 16; Windows Server 8 Beta Datacenter Build 8250 64位中文版; IPoIP 网卡 IP 地址:192.168.3.196(MTU:4092) 客户端: TYAN S7002 服务器主板; Intel Xeon E5506 CPU * 1; Kingston DDR3 1066 2G 服务器内存 * 1; Mellanox MHQH19B ConnectX®-2 系列 32Gbps Infiniband 卡(PCI-E x 16 插槽); Windows Server 8 Beta Datacenter Build 8250 64位中文版; IPoIP 网卡 IP 地址:192.168.3.172(MTU:4092) 其它环境: 由于没有 Infiniband 交换机,故测试时服务器和客户端的 Infiniband 卡通过 Mellanox MCC4Q30C-003 QSFP 线缆直连,而且客户端的 Infiniband 卡只有一个接口,所以也只测试了单口的性能,没有测试 SMB 3.0 多通道下的性能。 测试软件: IBM Tivoli SANergy(测试大块文件连续读写); Iometer(测试大块文件并发读写); NetPIPE(测试 IPoIB (IP over Infiniband) 的纯粹网络性能); Mellanox 驱动程序中的 IB Tools(启动 SM 并测试纯粹 Infiniband 性能) 测试步骤及结果: 1、在服务器和客户端分别安装 Mellanox Infiniband 卡最新的驱动程序: 虽然 Windows Server 8 中已经自动 Mellanox Infiniband 的驱动,但为了更新 firmware 并能使用上软件 SM(没 Infiniband 交换机滴说 -_-#),必须更新官方的驱动,到下面的网址下载新驱动: http://www.mellanox.com/content/pages.php?pg=products_dyn&product_family=129&menu_section=34 安装 Mellanox OFED for Windows Server 2012,建议安装时按照下面的提示更新卡的 firmware 以免带来不必要的问题: 安装完成之后重启服务器和客户端,你会发现 “网络连接” 里已经有了 Mellanox 的 IPoIB 网卡,但是是 “未连接” 的状态,因为 Infiniband 网络里还没有配置 SM(Subnet Manager)。 先来简单了解下 Infiniband 的 Subnet Manager: Infiniband(IB) 网络中需要使用 Subnet Manager(SM)来初始化 IB 硬件并允许其在 IB 架构中通信。每个 IB 子网必须有至少一个 SM,并且每个 SM 在 IB 架构中要有清楚的 ID。IB 架构就包含已经定义好的子网。IB 交换机和 IB 卡一样有自己的 GUID,主机适配卡(HCA)的端口被称为 port GUID,当一个 HCA 或者它的端口需要与子网中的另一个进行通信就需要分配网络地址,这些网络地址被称为 LID,而 IB 中的 SM 就负责为子网中的成员分配 LID,LID 只是对子网而言的,而 GUID 则是对整个 IB 架构中所有子网相同的。 IB 交换机一般就可以充当 SM 的角色,对于我这没有 IB 交换机的环境,幸好咱们还是有穷人的方法的,使用免费的 OpenSM 软件可以让两个机器中的任意一台做软件 SM。 […]

Linux kernel学习-进程地址空间

本文同步自(如浏览不正常请点击跳转):https://zohead.com/archives/linux-kernel-learning-process-address-space/ 看完 Linux kernel block I/O 层之后来到进程地址空间管理部分,本文中的很多知识和之前的 [进程基本]、[进程调度]、[内存管理] 等章节的知识相关。 1、基础知识: Linux kernel 给每个进程提供的进程地址空间一般是 32 位或 64 位(硬件相关)的平坦地址空间,但进程是没有权限访问这段地址空间中的所有地址的,能访问的一般是很多的内存地址区间。这种内存地址区间被称为内存区域,进程可以动态添加和删除内存区域到它的地址空间中。内存区域可以有不同的权限,相关进程必须遵守这些权限,例如可读、可写、可执行等。如果进程访问的地址不在一个有效的内存区域中,或者访问时的权限不正确,kernel 将会杀掉进程并给出常见的 “Segmentation Fault” 段错误日志。 内存区域通常包括: 可执行文件的代码段,称为 text 段; 可执行文件的已初始化全局变量段,称为 data 段; 未初始化全局变量段(通常以 0 page 填充),称为 bss 段; 进程的用户空间栈(通常以 0 page 填充); 每个共享库文件的额外 text、data、bss 段,也被装入进程的地址空间; 内存映射文件; 共享内存区域; 匿名内存映射(新版本的 malloc 函数就除了 brk 之外也通过 mmap 实现); 应用程序中的堆 2、内存描述符: kernel 使用 mm_struct 内存描述符结构来表示进程的地址空间信息,它定义在 <linux/mm_types.h> 头文件中,这也是一个非常大的结构。 结构的注释中已经包含比较多的注解了哦。mmap 为地址空间的内存区域(用 vm_area_struct 结构来表示啦,也是上面的代码中)链表,mm_rb 则将其以红黑树的形式进行存储,链表形式方便遍历,红黑树形式方便查找。mm_users 为以原子变量形式保护的使用此地址空间的进程数量值(例如:如果有 4 个线程共享此地址空间,则 mm_users 值为 4),mm_count 为引用计数(所有 mm_users 等于一个引用计数),当 mm_count 值为 0 时表示没有再被使用,可以被释放。total_vm 成员表示所有内存区域的数量。 所有的 mm_struct 结构以链表的形式存在 mm_struct 的 mmlist 成员中,该链表的第一个成员就是 init 进程的 mm_struct :init_mm,该链表被 mmlist_lock 锁保护。 进程的内存描述符是在 task_struct 的 mm 成员中的。fork() 进行创建进程时调用 copy_mm 函数将父进程的内存描述符拷贝给子进程,调用 clone() 函数时如果指定 CLONE_VM 参数将使父进程和子进程地址空间共享(实际上将 mm_users 计数加 1),这种子进程就被称为线程。mm_struct 结构一般是通过 alloc_mm 宏从名为 mm_cachep 的 Slab cache 中分配。 进程退出时调用 exit_mm 函数,该函数再调用 mmput() 函数,此函数中减小地址空间的 mm_users 计数,如果 mm_users 变为 0,调用 mmdrop() 函数减小 mm_count 计数,如果 mm_count 变为 0,则最终调用 free_mm() 宏来释放内存描述符(回归到 Slab cache 中)。 另外需要说明的是 kernel 线程是没有地址空间,也就没有对应的 mm_struct(值为 NULL),kernel 线程使用之前运行的进程的内存描述符,有关 kernel 线程请参考之前的 [进程基本] 文章。 3、VMA 概念: vm_area_struct 结构即内存区域常被称为虚拟内存区域(简写为 VMA),表示的是在一个地址空间中的一个连续内存地址区间,每个内存区域是一个惟一的对象。vm_area_struct 中的 vm_mm 成员指向关联的内存描述符,vm_ops 成员为非常重要的关联的操作函数结构,vm_start 为起始地址,vm_end 为结束地址之后第一个字节的地址,即地址范围为:[vm_start, vm_end)。每个 VMA 对于它关联的内存描述符来说是惟一的,因此如果两个单独的进程映射相同的文件到各自的地址空间,它们的 VMA 也是不同的。 VMA 中的 vm_flags 表示内存区域中的页的行为状态,常见的状态有:VM_READ(页可读)、VM_WRITE(页可写)、VM_EXEC(页可被执行)、VM_SHARED(页被共享,被设置了称为共享映射,未设置称为私有映射)、VM_SHM(此区域被用作共享内存)、VM_LOCKED(页被锁)、VM_IO(此区域用于映射设备 I/O 空间)、VM_RESERVED(表示内存区域不可被交换出去)、VM_SEQ_READ(连续读,增强 readahead)、VM_RAND_READ(随机读,减弱 readahead)等。VM_SEQ_READ 和 VM_RAND_READ 标志可以通过 madvise() 系统调用来设置。 看看 vm_ops 操作函数结构的 vm_operations_struct 的定义,它在 <linux/mm.h> 头文件中: 当指定的内存区域被添加到地址空间时,open 函数被调用,反之移除时 close 函数被调用。如果一个不在内存中的页被访问,将触发缺页异常, fault 函数被缺页异常处理函数调用。当一个只读的页变为可写的时候,page_mkwrite 函数也被缺页异常处理函数调用。 mm_struct 中的 mmap 为内存区域链表,通过 VMA 的 vm_next 成员指向下一个内存区域,而且链表中的内存区域是按地址上升排序的,链表中最后一个 VMA 值为 NULL。而对于 mm_struct 的 mm_rb 红黑树,mm_rb 为红黑树的根,每个 VMA 通过其 vm_rb 红黑树节点类型链到红黑树中。 在应用层中可以通过 cat /proc/<pid>/maps 或者 pmap 程序等方法查看应用程序的内存区域列表。 操作 VMA: kernel 提供 find_vma() 函数用于查找指定的内存地址在哪个 VMA 上,它的实现在 mm/mmap.c 文件中,输入参数为内存描述符和内存地址: 如果找不到对应的 VMA 则返回 NULL。需要注意的是返回的 VMA 的开始地址可能比指定的内存地址大。find_vma() 函数返回的结果会被缓存到内存描述符的 mmap_cache 成员中用于提高之后的查找性能,因为后续的操作很可能还是在同样的 VMA 上。如果在 mmap_cache 中找不到则通过红黑树进行查找。 find_vma_prev() 函数与 find_vma() 函数类似,不过它也会返回指定地址之前的最后一个 VMA: struct vm_area_struct * find_vma_prev(struct mm_struct *mm, unsigned long addr, struct vm_area_struct **pprev) kernel 另外还提供了 find_vma_intersection() 函数返回符合 find_vma() 的条件并且其开始地址不在指定内存结束地址之后的 VMA。 4、mmap 和 munmap: kernel 提供 do_mmap() 函数创建新的线性地址区间,这是用户层 mmap() 函数的底层实现,它用于将一段地址区间添加到进程的地址空间中。 unsigned long do_mmap(struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flag, unsigned long offset) do_mmap 映射 file 参数指定的文件,并最终返回新创建的地址区间的初始地址。 offset 和 len 指定偏移量和长度。如果 file 为 […]