双葉幼稚園 A Layman's Repository

GPUImage

(翻译自 NSHispter,原文链接:http://nshipster.com/gpuimage/

在 NSHipster,我们一直在研究 Objective-C 不为人知的一面来了解我们每天面对的系统。一般来说,这意味着仔细研究 Apple 的框架和语言特性(毕竟每天要用 Obective-C 工作)。不过,有些时候,看看成堆的第三方库和框架也蛮好的(而且里面有些真的很好),还可以看一下 Cupertino 外面有什么新东西。

本周我们来看一下你能找到的最厉害的一个开源项目:GPUImage。系好安全带,NSHipster 们,一不小心你读完这篇文章就造出一个相机 app 了。


GPUImage 作者是 Brad Larson,以 BSD 协议放出,能够在图像、实时摄像头影像和视频上使用 GPU 加速的滤镜和其他效果。

GPU vs. CPU

每只 iPhone 都有两个处理器:一个 CPU,也就是中央处理器,和一个 GPU,也就是图形处理器。每个处理器都有它自己的优势,现代芯片架构(例如 Apple A4)把 CPU 和 GPU 集成在一个物理封装里。

在 Xcode 里面写 C 和 Objective-C 的时候,产生的指令绝大部分会被 CPU 执行。相对地,GPU 是一枚专用芯片,专门用来做独立的小操作,例如图形渲染。GPU 执行的指令和 CPU 是有很大区别的,因此用特殊的语言来编写:OpenGL(特别地,在 iPhone 和 iPad 上使用 OpenGL ES

如果想学习 OpenGL ES 和渲染管线相关的知识,可以参考 Jeff LaMarche's GLProgram OpenGL ES 2.0 book

比较一下 GPU 渲染和 CPU 渲染的性能,区别还是蛮大的:

CPU vs. GPU 帧率对比 (FPS 越高越好)
Calculation GPU FPS CPU FPS Δ
Thresholding ⨉ 1 60.00 4.21 14.3⨉
Thresholding ⨉ 2 33.63 2.36 14.3⨉
Thresholding ⨉ 100 1.45 0.05 28.7⨉

"哦,这货是 Instagram?"

好吧,我们这么说:

Instagram : GPUImage :: 拍立得 : NASA 空间光学制造中心

换种说法,用 GPUImage 的 API 可以做出数千种相机 app,只需要把滤镜正确地组合起来,外加一小点想象力。

这张表包含了 GPUImage 内置的 125 种滤镜:(译者:你想翻译死我吗?)

Color Adjustments Image Processing Blending Modes Visual Effects
  • Brightness Filter
  • Exposure Filter
  • Contrast Filter
  • Saturation Filter
  • Gamma Filter
  • Levels Filter
  • Color Matrix Filter
  • RGB Filter
  • Hue Filter
  • Tone Curve Filter
  • Highlight Shadow Filter
  • Lookup Filter
  • Amatorka Filter
  • Miss Etikate Filter
  • Soft Elegance Filter
  • Color Invert Filter
  • Grayscale Filter
  • Monochrome Filter
  • False Color Filter
  • Haze Filter
  • Sepia Filter
  • Opacity Filter
  • Solid Color Generator
  • Luminance Threshold Filter
  • Adaptive Threshold Filter
  • Average Luminance Threshold Filter
  • Histogram Filter
  • Histogram Generator
  • Average Color
  • Luminosity
  • Chroma Key Filter
  • Transform Filter
  • Crop Filter
  • Lanczos Resampling Filter
  • Sharpen Filter
  • Unsharp Mask Filter
  • Fast Blur Filter
  • Single Component Fast Blur Filter
  • Gaussian Blur Filter
  • Single Component Gaussian Blur Filter
  • Gaussian Selective Blur Filter
  • Gaussian Blur Position Filter
  • Median Filter
  • Bilateral Filter
  • Tilt Shift Filter
  • Box Blur Filter
  • 3x3 Convolution Filter
  • Sobel Edge Detection Filter
  • Threshold Edge Detection Filter
  • Canny Edge Detection Filter
  • Harris Corner Detection Filter
  • Noble Corner Detection Filter
  • Shi-Tomasi Corner Detection Filter
  • Non Maximum Suppression Filter
  • X/Y Derivative Filter
  • Crosshair Generator
  • Dilation Filter
  • RGB Dilation Filter
  • Erosion Filter
  • RGB Erosion Filter
  • Opening Filter
  • RGB Opening Filter
  • Closing Filter
  • RGB Closing Filter
  • Local Binary Pattern Filter
  • Low Pass Filter
  • High Pass Filter
  • Motion Detector
  • Hough Transform Line Detector
  • Line Generator
  • Motion Blur Filter
  • Zoom Blur Filter
  • Chroma Key Blend Filter
  • Dissolve Blend Filter
  • Multiply Blend Filter
  • Add Blend Filter
  • Subtract Blend Filter
  • Divide Blend Filter
  • Overlay Blend Filter
  • Darken Blend Filter
  • Lighten Blend Filter
  • Color Burn Blend Filter
  • Color Dodge Blend Filter
  • Screen Blend Filter
  • Exclusion Blend Filter
  • Difference Blend Filter
  • Hard Light Blend Filter
  • Soft Light Blend Filter
  • Alpha Blend Filter
  • Source Over Blend Filter
  • Color Burn Blend Filter
  • Color Dodge Blend Filter
  • Normal Blend Filter
  • Color Blend Filter
  • Hue Blend Filter
  • Saturation Blend Filter
  • Luminosity Blend Filter
  • Linear Burn Blend Filter
  • Poisson Blend Filter
  • Mask Filter
  • Pixellate Filter
  • Polar Pixellate Filter
  • Polka Dot Filter
  • Halftone Filter
  • Crosshatch Filter
  • Sketch Filter
  • Threshold Sketch Filter
  • Toon Filter
  • Smooth Toon Filter
  • Emboss Filter
  • Posterize Filter
  • Swirl Filter
  • Bulge Distortion Filter
  • Pinch Distortion Filter
  • Stretch Distortion Filter
  • Sphere Refraction Filter
  • Glass Sphere Filter
  • Vignette Filter
  • Kuwahara Filter
  • Kuwahara Radius 3 Filter
  • Perlin Noise Filter
  • CGAColorspace Filter
  • Mosaic Filter
  • JFAVoronoi Filter
  • Voronoi Consumer Filter

认真说,GPUImage 代码里带的这个 滤镜展示示例 app 能在 AppStore 卖 3.99 刀。要是再加上 twitter 集成和一些声音效果,卖个 6.99 刀不成问题。

渲染管线

GPUImage 从本质上来说是一个渲染管线的 Objective-C 抽象。从相机、网络或者磁盘上加载的源图像,在经过一系列滤镜处理后,最终输出到了 view、graphics context 或是数据流中。

例如说,摄像头中的图像可以应用一个 Color Levels 滤镜,来模拟各种色盲效果,然后实时显示在一个 view 中。

GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc]
    initWithSessionPreset:AVCaptureSessionPreset640x480
           cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageFilter *filter = [[GPUImageLevelsFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
[filter setRedMin:0.299 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0];
[filter setGreenMin:0.587 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0];
[filter setBlueMin:0.114 gamma:1.0 max:1.0 minOut:0.0 maxOut:1.0];
[videoCamera addTarget:filter];

GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:self.view.bounds)];
[filter addTarget:filteredVideoView];
[self.view addSubView:filteredVideoView];

[videoCamera startCameraCapture];

或者,结合不同的颜色混合模式,图像效果和一些调整,你可以把静止图像转变成可以分享给你时髦的朋友们看看的精美图像(例子来自基于 GPUImage 的 FilterKit)。

GPUImageFilterGroup *filter = [[FKGPUFilterGroup alloc] init];

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init];
[saturationFilter setSaturation:0.5];

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init];
[monochromeFilter setColor:(GPUVector4){0.0f, 0.0f, 1.0f, 1.0f}];
[monochromeFilter setIntensity:0.2];

GPUImageVignetteFilter *vignetteFilter = [[GPUImageVignetteFilter alloc] init];
[vignetteFilter setVignetteEnd:0.7];

GPUImageExposureFilter *exposureFilter = [[GPUImageExposureFilter alloc] init];
[exposureFilter setExposure:0.3];

[filter addGPUFilter:exposureFilter];
[filter addGPUFilter:monochromeFilter];
[filter addGPUFilter:saturationFilter];
[filter addGPUFilter:vignetteFilter];

看完了 GPUImage 的功能,一定很兴奋吧。GPUImage 非常简单,可以马上开始使用(不需要了解 OpenGL),性能上也足够完成你想要的一切。不止是这样,它还自带了非常多的积木一样的部件 -- 色彩调整,混合模式,你能想到的想不到的一切视觉效果。

GPUImage 是开源社区少有的好东西,我们 Mac 和 iOS 开发者非常幸运的能拥有它。用 GPUImage 做些牛逼的东西,向其他人展示一个崭新的世界。


译者吐槽时间

我自己也用过一点 GPUImage,方便是很方便,不光是省掉了 AVFoundation 的许多烦人的 setup 代码,还内置了许多滤镜效果。不过它也有不少坑,我遇到的一个就是占用太多内存,一段时间后就 crash 掉了,毕竟是处理视频,需要不少内存,iPhone 的内存又不太多,就要更加注意。我当时是加了一个 @autoreleasepool 就好多了。

Speed up Octopress generation

image

Generating hundreds posts with Octopress is very slow... On my computer, it takes ~40 seconds to do a full site generation, unacceptable for tweaking post or live preview. But usually we are just modifying one post, a full site generation sounds ridiculous, these two commands may help:

  • rake isolate[filename] # Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much more quickly.
  • rake integrate # Move all stashed posts back into the posts directory, ready for site generation.

After creating a new post (like this), we isolate it from all others by using rake isolate["speed-up"], generate only the new post takes about 2 seconds, 20x boost. When all done, run rake integrate to get stashed posts back.

Reference: Tips for Speeding Up Octopress Site Generation

A NSFetchedResultsController Pitfall

image

I'm using Core Data and NSFetchedResultsController, and encountered mystery crashes related to them. Here's the solution.

The document from Apple mentions that if delegate is not nil, then NSFetchedResultsController will track changes to managed objects, by listening to notifications sent by managed object context and then call its delegate to modify corresponding UITableView. This implies if you don't set delegate to nil before it gets dealloced, then observation is still registered with NSFetchedResultsController and cause strange messages and crashes. We may see the following messages:

  1. -[SomeStrangeReciver controllerWillChangeContent:]: unrecognized selector sent to instance 0x8251dc0, the receiver is random, I've seen __NSCFType, UITapGestureRecognizer, etc.
  2. CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.
  3. Assertion failure in -[UITableView _endCellAnimationsWithContext:] …… Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).
  4. EXCBADACCESS

(These error messages are from Google, and may be slightly different from actual messages)

Though we see different messages, the reason is the same: The observation has not been cancelled after NSFetchedResultsController gets dealloced.

The solution is simple:

- (void)dealloc {
    if (_myFetchedResultsController != nil) {
        _myFetchedResultsController.delegate = nil;
    }

In SSDataKit, the author did the same thing in -dealloc (See SSManagedViewController.m).

So,

  1. Read document carefully, it may have some implication;
  2. Think how it will be implemented;
  3. Memory management in Objective-C is still a little painful;
  4. See how others do it.

GitHub is so FAST

image

pixiv id=15538951

Github surprised me in terms of the speed of support/development/review/deployment.

Yesterday when wandering around GitHub, I found a bug:

bug demo 1 bug demo 2

I haven't seen this bug in years of browsing GitHub, it has to be introduced by recent changes. I tweeted about it, and got confirmed by @zhengjiehan. Then I wrote a ticket to GitHub with screenshots and repo names attached. After that, I continued with my practice of Racket, since it usually take one business day or more[1] to get a reply (it is Saturday, right?).

But I got a reply (and a laughter) in ~70 minutes, at 2:40 AM, UTC+8:

Hi!

That's hilarious! Um, we just like being precise? Kidding. I'll write up an issue.

Thanks for letting us know!

OK, they replied quick, then I went on my work.

Less than 2 hours later, I got another mail (4:17 AM, UTC+8):

Hi!

We've fixed this bug and the repo numbers should be looking much nicer now.

I then opened the 2 repos with problem, it got fixed!

image

I couldn't believe that, from a ticket to deployment, GitHub uses less than 3 hours! Ticket sent, received, support guy file an issue, dev get that issue, figure out the reason, fix it, pass peer review, get merged, and finally deployed in 3 hours!

I don't know why it's extremely fast. Perhaps their support service is run by developers, many developers are full stack, developers have the permission to deploy a modification with a single click…

I don't know, but it's FAST.

<3

[1] Linode as a notable exception.

Signing Srun3000 iOS Client

学校的 Srun3000 客户端又是那种不越狱就不能装的……有 Apple 给发的证书,就自己签下名呗,谁知道一直不成功……

尝试了很多,比如说给可执行文件加上可执行权限,改这改那之类的,终于找到问题所在了:

把下载来的 .ipa 解压缩(zip 格式的哦),删掉 Payload/srun3_client_iphone.app 文件夹下面的 CodeResources 文件,重新压缩成 zip,改名成 .ipa 然后正常签名(比如 iModSign 之类)就可以了。

原因大概是因为,srun3000 自带的 CodeResources 是错误的,然后 iOS 会按固定顺序寻找签名信息(CodeResources),于是就在找到 iModSign 的签名(_CodeSignature/CodeResources)之前找到了错误的 CodeResources。所以估计 App Store 里的软件都不会有这个问题,只有这种必须越狱才能装的破 app 才可能有吧。

我们的数据库课

很久之前的一篇文章,怎么也是上上学期吧,写成草稿了,现在贴出来吧。

我并不是要批评我们的老师,我觉得我们的老师还是挺负责任的,能讲到的还是尽量讲到还是都讲到了。

其实最重要的是我并不知道这课到底是在讲什么,老师在某节课上说:“我们这门课主要是讲授数据库理论,这个内容就不讲了”(意思是这样的)。当时我就震惊了,我一直以为这门课讲的是数据库如何使用数据库的……老师上课的时候也经常说作为数据库的使用者如何如何,那我们的这门课到底是在讲理论还是使用呢……

作为大学的课程,我认为应该以理论为主,怎样使用只是顺带一提,以自学为主就好,就像传言中国外大学某些课程一样,一次课讲完一门语言,SQL 这种东西完全可以一次课讲完,剩下的靠大家自学或者直接实践,但是上半学期除了绪论,就一直在讲关系代数和 SQL,这个东西需要这么多时间来讲吗?我个人认为,4个课时就足够了(可能有点太激进了)。这门课上用了八周,也就是 22 个课时来讲这些东西。

我是一个理论比较弱的人,所以就想着靠学校里的数据库课补一下理论知识的。在我眼中,这门课讲的东西确实是必须的,但是内容太少了,深度也不够。这个 playlist 是印度一所大学的数据库课程,我只看了标题,来比较一下我们课程的内容。Lecture 1~9 我们是讲过的,10~16 没讲过,17~23 讲过,24~26 没讲过,27~29 讲过,30~42 没讲过,只有 19/42 的内容我们覆盖到了,也就是只有 45%。看看我们漏掉了什么东西,存储过程、索引、查询过程和优化、分布式数据库、数据挖掘、XML 和对象数据库还有很多 case study。我想要的是什么?我想学的就是数据库是怎么实现的,存储过程、索引、查询过程和优化为什么没有?这是本科教育对吗?不是职业教育,我们要知道原理才能更好地利用数据库,对吗?学校里学不到的指望我们在工作中学吗?大家都清楚,工作了就更没有机会去学理论了。怎样用 SQL 需要教吗?DBMS 就会告诉你你的 SQL 是对是错,你也能一眼看出来结果是否正确,尝试一下,总会正确的。但是如果你一句 SQL 执行了一分钟,DBMS 会告诉你为什么吗?会告诉你子查询的速度慢吗?会告诉你优化器做了什么吗?会告诉你中间创建了哪些临时表吗?不会的,起码不会一眼就看出来,你需要理论知识的支持,可是这门课给了我们什么?

要说这门课重视实践,那我又不明白了。现在起码在互联网方面,大家都只是把数据库当作一个存储数据的地方,很多高级的功能、很复杂的 SQL 都很少出现,那么我们写一堆长长的带着子查询,带着 ANY 带着 EXISTS 的东西有什么用呢?做教务系统吗?用非常复杂的 SQL 来实现一些应用语言很容易就能实现的功能有什么必要呢?SQL 不是过程化的,非得拿他来做一些过程化的事情不是强人所难吗?我在 QCon 会场抢了两本书——《SQL沉思录》《SQL解惑》里面写的内容就是用 SQL 做一些非常奇怪的问题,甚至于解决稳定婚姻问题(谜题67),这种东西真的有用吗?作者当时的时代还是 SQL 大行其道的时候,可能写这样的东西练习 SQL 还说的过去,但是现在 SQL 并没有那么热,各种 NoSQL 纷纷出现的现在,练习 SQL 而不是学习数据库本身的理论有什么价值呢?拿索引来说,就算某种数据库并不是利用 SQL 进行查询,那它为了性能也需要一个类似索引的东西,对吗?只要这种索引还是要用 B 树或者散列表,那我们学习索引的理论就还是有用的。就这两本书被随意赠送的可怜的处境来看,整页的 SQL 真的没有什么用。

说一个比较极端的例子,教大家使用数据库的时候并没有提到 LIMIT,可能很多人并不会知道 SELECT id FROM user ORDER BY id LIMIT 100000, 5 为什么总是慢的要死。

还有一个问题,这个希望老师改进一下,老师上课演示的所有 SQL 语句里面的关键字都是小写,SQL 是不区分大小写,但是我们都知道关键字推荐是全部大写的,希望以后不会看到我同学写出小写关键字的 SQL……我们都懒,但是老师需要教学生养成良好的习惯,不是吗?

发这么多牢骚,其实还是对数据库这么课抱了很大期望,希望能补一下数据库的知识,不幸让我失望了。还是自己学吧,印度人虽然英语非常差,但是讲数据库应该还可以。

好在期末考试没有非常坑,没有非常古怪的题目,算是真的考察水平吧,不过还是希望能多些理论知识,让同学多一些进步。我觉得现在所有的内容压缩到上半学期,下半学期讲些理论和 case study 会非常好。

iOS dev: 将 Xcode 中的 CODE SIGN IDENTITY 分离出 VCS

做 iOS 开发的时候每个人都有不同的开发者证书/私钥,只有通过这个私钥进行代码签名之后 app 才能在 iPhone 上运行起来。项目中用来确定使用哪个私钥签名的配置文件是 project.pbxproj,由于它也记录了项目地很多其它信息,所以它往往会出现在版本控制系统中,这样就造成只有一个人能够成功地签名。好在我们可以通过 .xcconfig 文件来将这个配置抽离出来。

首先新建一个文件(Cmd+N),在 Other 中选择 Configuration Settings File,新建一个配置文件 CodeSign.xcconfig。在这个文件中添加一行: CODE_SIGN_IDENTITY = iPhone Developer: 人甲 路 (XXXXXXXXXX),其中证书的名称可以在 Keychain Access 里面找到。

之后删除原来 project.pbxproj 里面的签名,直接在 build settings 里面删除就好,注意 project 和 target 的都要删掉(都选中之后 Cmd+delete)。

最后在 Project 的 info 中,看到 Configuration 一栏,在 Based on Configuration File,选择我们创建的文件 CodeSign。

最后在 build settings 里面应该是这个样子:(项目和目标那一栏都是空的)

最后注意不要把 CodeSign.xcconfig check in 进去。

参考:http://respectthecode.co/2011/06/11/xcode-4-and-xcconfig-files/

Lion 对加密卷的支持

今天想给硬盘数据做备份,毕竟硬盘已经用了两年了,不用查 SMART 信息也知道他已经老了,虽然诸如代码之类的都有很多备份,但是还是有些文档、照片需要备份。

又阴差阳错得到一块老旧移动硬盘,灰常好啊。开工吧。

拿来的时候是 NTFS,第一件事情就是改成 HFS+,拿 Disk Utility 格式化的时候发现多出了加密的选项,不用多说,先试试。不得不说这个 Lion 的 GM 版本还不够到正式版的水平,这个输入密码的输入框如果输入超过十位的密码就会 crash,这个完全不能忍受啊,尝试了半天发现先在别的地方输入好然后复制过来就可以了。(好吧,我不得不说我写文章想截图的时候这个 bug 又神秘的消失了)

这样格式化好了之后每次插入移动硬盘的时候都会提示你输入密码才能访问,像是做备份这种应用就会安全很多。

之后我就发现加密卷的密码无法修改,我猜测这种加密是用密码加密一个密钥,再用密钥加密数据的,应该可以修改密码,现在无法修改的原因应该是 Apple 还没想好在哪里放这个功能,也或许 Apple 不会给这个功能提供 GUI,那我们转战 CLI 吧,Disk Utility 对应的命令行工具是 diskutil,里面提供了很多 GUI 中没有的功能。鼓捣一会之后发现 diskutil 有个叫做 CoreStorage 的模块,进一步发现 diskutil coreStorage changeVolumePassphrase 可以修改 CoreStorage 卷的密码,其中所需的卷 UUID 可以通过 diskutil coreStorage list 获得。

可以看得出,CoreStorage 又是苹果推的一种新技术,看 diskutil 里面的用语(PV、LV)推测是类似 LVM 的东西,Mac 以前似乎没有类似 LVM 的技术(AFAIK),网上搜索也搜索不到 CoreStorage 的相关信息,Lion 的 Developer Library 里面也是没有,最后还是在手册(man diskutil)里找到了一些信息。看完之后的感觉就是 CoreStorage 就是一个 LVM,Apple 终于有了 LVM。 :-) 不过看起来许多功能还没有开发出来接口,比如 LVM 的一些最基本的功能⋯⋯ :-(

看来 Lion 不光是在界面上模仿 iOS(我对这点颇有不满),在底层也下了不少功夫,CoreStorage 就是在看不见的地方默默发挥作用的一个好同志啊。底层的 UNIX 配合 用户友好的界面,是 Mac 的制胜法宝,只有这样才能留住如此多的开发者和一些相当挑剔的用户(比如设计师)。底层的 BSD 也给苹果减少了许多开发的困难,可以到处抄来抄去,可以派几个人推动一下某个项目的开发(比如 LLVM),看被抄的人不爽了还过去帮助修改(比如各种 BSD)。相比之下,再大的微软也不能把所有事情做好,至少给自己增加了许多开发难度。

另外,苹果你抄个 ZFS 过来吧,ZFS 多适合你现在的各种用途啊,又没有 Linux 的许可证问题,抓紧啊,I want a better filesystem!

PS:最后贴上 diskutil 手册的一部分,如果你有兴趣的话。

VMWare Fusion 装 Gentoo⋯⋯

发现其它发行版真的没法胜任开发工作,而我又不喜欢自己编译,Ubuntu 里面的 nginx 缺少我需要用的模块,真伤心,本来想在虚拟机里弄一个不用编译的发行版来着,看样子还是得 Gentoo 出马。

VMWare Fusion 又傲娇了,又是驱动问题,偷懒用 genkernel 就好了,可谁让我这么勤奋呢?

lspci 告诉我们,VMWare 有个设备叫 00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01),查到对应的内核选项是 CONFIG_FUSION,记得选上。这样就解决了启动的时候找不到分区的问题⋯⋯

还有一个问题是,启动到一半说 Freeing unused kernel memory,然后就死掉了,是新引入的 OpenRC 的问题,解决办法在这里

Happy coding!

Installing Gentoo Linux on DELL R710

公司买了一台 R710,第一次自己装服务器上的 Linux,虽说区别不是很大,但是还是很值得纪录一下的哦。

服务器跟 PC 最大的区别大概就是硬件了吧,涉及到驱动的基本上就只有 RAID 控制器了吧?编译内核的时候那个纠结啊……那个启动不起来啊……真是……

首先是得照着一个指南做,就是这个指南啦,比较适合以前装过 Gentoo 的人看。这个指南是装软件 RAID 和 LVM2,我们做的是硬件 RAID,所以里面软件 RAID 相关的东西就不用安装了,比如 dm-mod 之类的就不用装了。我还是习惯把 /boot 放在 LVM 里面,其实自己有的时候也觉得没啥必要,有点犯贱的意思……如果你也希望把 /boot 放在 LVM 里面,可以参考 Gentoo Wiki 的这篇文章,不过里面的内容略微有点过时了,比如内核参数 dolvm2,现在写成 dolvm 了。一开始安装的时候忘了做 initrd,查了半天才发现,还是不细心啊。

剩下的大概就是编译内核了,先随手把什么声卡驱动什么的去掉,然后重点是 RAID 驱动,一开始天真地以为 RAID 控制器的驱动是 LSI Logic MegaRAID SAS RAID Module 之类的,结果就是直接启动不起来了。后来认真起来,按照 lspci 的结果去网上找内核模块,发现应该是 CONFIG_FUSION 这个选项,之后就能顺利地启动了。

配置好一些基本的东西之后,还有一些硬件相关的小工具,最重要的还是 RAID 控制器的监控工具,网上找了很多,不过大多数都没法用,这一页有两个工具,都比较好用,HWRaid 这个站似乎也很强大。里面提到的 lsiutil 是 LSI 官方提供的,Gentoo 源里那个似乎年久失修了,LSI 的官网上能够找到,不过不是很好找,下载下来是二进制。还有些能改前面板 LCD 的小工具什么的,我觉得没多大用,就算了(想改的话 BIOS 里面就有)。

有点后悔买了一个比较弱的 RAID 控制器,不过一切还要等有了负载再说,哈哈。