Ubuntu配置、编译、安装自定义内核笔记

在VirtualBox虚拟机下 Ubuntu 12.04 环境编译自己的 Linux 内核,版本是3.2.28。

参考资料:

  1. http://zhyu.me/linux/compile-your-own-ubuntu-kernel.html
  2. http://www.howtogeek.com/howto/ubuntu/how-to-customize-your-ubuntu-kernel/
  3. http://bodhizazen.net/Tutorials/kernel

UPDATE: (2012.10.30)
1. 由于 kernel-package 中的 make-kpkg 有各种各样的问题,而 Linux 内核自带的 make 又比较完善,所以本笔记更新为使用 make 安装而非 deb 包。取消 deb 包的坏处在于,删除内核时需要手动删除内核文件及模块。
2. 教育网用户可以在中科大的镜像下载内核源代码,地址为: http://mirrors.ustc.edu.cn/linux-kernel/v3.0/ 。
3. 本教程适合各种版本的 Linux 内核(最好是3.x版本)。

教程前提是已经安装好虚拟机,下载解压了Linux 3.2.28内核。

首先要安装依赖包,包括:build-essential、kernel-package、fakeroot和libncurses5-dev(用于menuconfig):

sudo apt-get install build-essential fakeroot libncurses5-dev

切换到内核源代码目录下,首先将Ubuntu自带的内核配置拷贝过来作为基础:

make mrproper #相当于clean
cp /boot/config-`uname -r` ./.config #复制当前系统内核
make oldconfig

然后,按照当前虚拟机的实际硬件环境,清理一些不必要的模块:

make localmodconfig

在以上两步中,会问一些关于配置的问题(缺少一些配置项之类的),建议直接按住回车使用默认值。

接下来如果有特殊需要(例如VirtualBox的VGA驱动它检测不到,或者ftrace中的一个检测器默认关闭需要打开),可以进行自己的配置:

make menuconfig

在menuconfig环境中,按y表示编译进内核,n表示不编译,m表示编译成模块,h获得帮助。如果不是很明白,建议直接使用默认配置编译,不要menuconfig。

配置完成后保存,并开始编译、安装内核,这里使用Ubuntu自己的kernel-package脚本编译,而不直接make 使用自带的 Makefile 方式进行编译和安装。

make all #编译内核及模块
sudo make modules_install
sudo make install

安装完成后重启,就会自动用新内核启动了。如果启动不了,就按住Shift返回原内核,然后:

cat /var/log/dmesg.0 | less

查看上次启动的内核错误,相应的修改配置后重新编译即可。

使用MacType美化系统字体步骤

MacType是一个能美化系统字体的工具,比Windows自带的ClearType工具渲染效果更好,可以达到类似苹果Mac OS的效果。

口说无凭,先上图为证。这是使用MacType+热替换字体的效果,系统为Win7 x64。可以看到,默认的雅黑字体和宋体都被替换了,而且有华丽的渲染效果。

MacType的前身是另一个美化软件——GDI++,关于它的介绍可以查询 WikiPedia gdi++ 词条。以下内容截取自Wikipedia:

gdi++是一个替代Windows自身核心部件GDI+进行字体渲染的开源软件。

gdi++通过向所有进程注入自己的动态链接库截取Windows GDI+(gdi32.dll)的工作,转由自己执行以进行字体渲染。

gdi++允许用户通过配置文件对字体渲染进行详细的定制,让用户可以根据自身需求得到更清晰、舒适的字体渲染效果。

以下是使用MacType进行渲染和(可选)字体替换的详细步骤。仅供参考,请注意操作前对系统进行备份。

1. 访问MacType的论坛下载最新版:极限社区MacType论坛

2. 安装MacType程序,并启动桌面上的MacType用户向导。

3. 向导第一步为“MacType加载方式”,这里建议选择“服务加载”,一方面可以方便的开关MacType(注册表方式需要重启才能切换开关),另一方面不会出现托盘图标(相对托盘加载方式)。选择完成后进入“下一步”。

4. 第二步需要选择一个“配置”,选择完成后点击“完成”,之后确定修改即可。

前面8个配置主要用来渲染系统自带的字体,CRT是普通的纯平显示器,LCD是液晶显示器,可以根据自己电脑显示的预览图,选择一个看起来最清楚或最喜欢的。

最后3个配置,需要用到第5步的字体“XHei”和“XSong”进行热替换(HotShift),如果没有安装字体会显示的非常模糊。

5. (可选) 安装XHei字体和XSong字体,用来替换系统自带字体。

(1) 首先去论坛下载这两个字体(为了获取最新版请去论坛查看和下载)。

(2) 下载后解压缩(注意是7z格式,请用7-Zip,或者WinRAR 3.93以上解压),找到你喜欢的XHei和XSong两个字体,注意请使用“XHei.TTC”和“XSong.TTC”版本,不要使用“SimSun.TTC”或者文件名较长的版本,以免加载失败。在两个字体上分别右键安装,或者拷贝到%WinDir%Fonts文件夹中,即可完成安装。

(3) 如果使用的不是XSong Sharp字体(因为还有一个XSong Harmony),或者没有使用XHei而是换用其他字体,请打开 %ProgramFiles(x86)%MacTypeiniXMac 中你想要的配置(建议备份),打开后找到 [FontSubstitutes] 和 [FontSubstitutes@Office] 这两段,将等号右侧的字体修改为你使用的对应名称即可。

(4) 在第4步的向导中,选择修改之后的后三个配置文件之一,保存后即可。

注意:并不是所有程序都可以用MacType渲染字体。例如IE9使用硬件加速,网页内容无法渲染;某些软件会与MacType加载或字体热替换冲突。具体软件请参见论坛上的“MacType渲染不正常软件名录”,并自行确定解决方法。

最后提醒一下,这篇博文绝大部分均为小杜博客原创内容,使用“Creative Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆”协议授权。转载时,请按照协议要求署名、使用和共享。

手动设置Chrome或Chromium的Google搜索域名

这里记录的是,如何手动设置Chrome(或Chromium)中自带的Google搜索功能所用的域名。

在Chrome中使用Ctrl+E或者“?”进行Google搜索时,有时候会在www.google.com下搜索,有时候会转到com.hk或者com.tw之类的本地化网站。如果我们在一个域名上设置好了搜索选项,一旦更改了域名又要重新设置。而且这个域名并没有办法在Chrome的“管理搜索引擎”中设置,因为里面使用的是“{google:baseURL}”并且没办法修改,即使直接修改也会丢失地址栏的“自动完成”功能。

下面是手动设置这个“{google:baseURL}”选项的方法,参考自 Chromium Issue 1521

1. 关闭Chrome(或Chromium)浏览器的所有窗口、进程。

2. 打开浏览器用户数据文件夹中的“Local State”文件,具体文件夹路径如下:

Windows — “%LocalAppData%GoogleChromeUser Data” 或 “%LocalAppData%ChromiumUser Data”

Linux/Unix — “~/.config/google-chrome/” 或 “~/.config/chromium/”

Mac OS — “~/Library/Application Support/Google/Chrome/” 或 “~/Library/Application Support/Chromium/”

3. 用文本编辑工具修改“Local State”文件中的以下两个属性:

“last_known_google_url”: “http://www.google.com/”,

“last_prompted_google_url”: “http://www.google.com/”,

将后两个引号中的网址,替换成你需要的Google域名,保持原有格式保存即可。此时打开浏览器搜索,就会使用上面设置的域名了。

将Drupal博客迁移到emlog平台

今天终于完成了这个蛋疼的任务,因为实在受不了Drupal的复杂和缓慢了。顺便为了测试一下新浪SAE的效果,就干脆搬到了这个平台上。

下面说一下转换数据、跳转地址的方法。首先,Drupal版本为6.22(就是说版本5和7我都不保证能行),emlog是4.1.0的最新版。要求有一个安装好的emlog,以及Drupal数据库的完整备份,还需要一个支持phpMyAdmin的MySQL数据库做数据中转(我是在本地架设的)。

1. 将Drupal数据库导出,并导入到本地数据库中。假设Drupal的表前缀为drblog_。

2. 安装好emlog,进入后台的“数据”,选择备份到本地。然后将备份也导入本地同一个数据库。假设emlog的表前缀为emlog_。

3. 在本地数据库中执行下面的SQL语句:(我SQL学的很渣,不要吐槽我- -)

INSERT INTO `emlog_sort`(`sid`, `sortname`) 
SELECT `drblog_term_data`.`tid`, `drblog_term_data`.`name` FROM `drblog_term_data`
WHERE `drblog_term_data`.`vid` = (SELECT `drblog_vocabulary`.`vid` FROM `drblog_vocabulary` LIMIT 0,1);
INSERT INTO `emlog_blog` (`gid`, `title`, `date`, `content`, `excerpt`, `author`, `sortid`, `type`, `views`, `hide`)
SELECT `drblog_node`.`nid`, `drblog_node_revisions`.`title`, `drblog_node`.`created`, `drblog_node_revisions`.`body`, `drblog_node_revisions`.`teaser`, 1, `drblog_term_node`.`tid`, 'blog', `drblog_node_counter`.`totalcount`, IF(`drblog_node`.`status`=1, 'n', 'y')
FROM `drblog_node`, `drblog_node_revisions`, `drblog_term_node`, `drblog_node_counter`
WHERE `drblog_node_revisions`.`nid` = `drblog_node`.`nid` AND `drblog_term_node`.`nid` = `drblog_node`.`nid` AND `drblog_node_counter`.`nid` = `drblog_node`.`nid`;
UPDATE `emlog_blog` SET `emlog_blog`.`comnum` =
(SELECT COUNT(*) FROM `drblog_comments` WHERE `drblog_comments`.`nid` = `emlog_blog`.`gid`);
INSERT INTO `emlog_comment`(`cid`, `gid`, `pid`, `date`, `poster`, `comment`, `ip`)
SELECT `cid`, `nid`, `pid`, `timestamp`, `subject`, `comment`, `hostname` FROM `drblog_comments`;

注意:这里根据我的环境编写的,即只有一个用户ID=1,只有一个Taxomony(分类)ID=1,将日志最初发表时间作为日志时间,将评论标题作为emlog中的评论者名称。

4. 将执行完毕的库导出为SQL备份,并按照emlog备份的格式添加头尾、修改好之后,用emlog数据还原即可。

UPDATE: 更新一下用.htaccess将旧地址替换为新地址的代码,这里假设新博客地址就是本博客(t.du9l.com),替换的内容包括分页、文章、分类和作者页面。

  # Moving to SAE
  RewriteCond %{QUERY_STRING} page=([0-9]+)
  RewriteRule ^.*$ http://t.du9l.com/page/%1 [L,R=301]
  RewriteRule ^node/([0-9]+)$ http://t.du9l.com/post/$1 [L,R=301]
  RewriteRule ^blog/([0-9]+)$ http://t.du9l.com/author/$1 [L,R=301]
  RewriteRule ^taxonomy/term/([0-9]+)$ http://t.du9l.com/sort/$1 [L,R=301]
  RewriteRule ^.*$ http://t.du9l.com/ [L,R=301]
  # Moving to SAE

追求系统盘低写入 将数据文件夹迁移到其他盘

刚入手了一块SSD作系统盘,与机械盘一起装在我的本儿上,因为比较担心MLC的写入寿命,就把C盘的几个文件夹迁移到了机械盘上的分区里。

虽然好多人说,买来SSD就当普通硬盘用,不然没法发挥出SSD的性能之类的,但是我比较穷啊,还是很担心SSD很快的被写坏,于是就查了很多教程,把C盘的ProgramData和Users,以及Windows下的Prefetch、SoftwareDistribution和Installer这五个文件夹都迁移到了机械盘的盘符。

测试环境:Windows 7 x64 Ultimate,SSD是OCZ Agility 3 60G,C盘是SSD的系统分区,机械盘是希捷的500G,H盘是机械盘上的数据分区。

首先,我迁移ProgramData和Users的时候都是在刚安装好Win7,还没有输入用户名的时候,按Shift+F10会弹出System权限的命令提示符,在这里会方便的多。

然后这里以其中一个Users来演示,只要依次输入以下命令(#井号后面为注释,不要输入),就可以将一个文件夹迁移到其他盘了。

mkdir "H:Users"  #建立目标文件夹
robocopy "C:Users" "H:Users" /E /COPYALL /XJ  #复制数据 详见robocopy介绍
rmdir "C:Users" /S /Q  #删除源文件夹
ren "C:Users" Users_bak  #如果没有删除干净 先重命名
mklink /J "C:Users" "H:Users"  #建立NTFS的Junction链接(之前有误,已经改回来了) 要求C盘和H盘都是NTFS格式

第四行有一个ren的原因是我迁移过程中发现,ProgramData中有些文件并不是很容易删除(有的文件只有TrustedInstaller权限),暂时先改名的话,可以进入系统桌面之后用文件粉碎机之类的删除,也可以通过takeown和icacls来获取文件权限并删除。

Update: 修改完成之后最好顺便修改一下注册表,位于HKCU和HKLM中的SoftwareMicrosoftWindowsCurrentVersionExplorerShellFolders中,将所有修改过的文件夹盘符替换即可(可以导出为reg文件,替换然后导入回去)。