本文首先研究在Debian-6.07系统上编译安装新的内核版本,并讨论在安装的过程中出现的问题以及解决方法;接着讨论将Linux内核输出信息重定向到串口,使得开发者可以从串口登录并操作Linux系统。
第一部分 Debian-6.07系统编译安装Linux-2.6.38内核
Debian-6.07预装的是Linux-2.6.32-6-686内核版本,示意图如下:
下载linux-2.6.38.tar.bz2:
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/
解压内核:
$cd
/home/tom
$tar xvf
linux-2.6.38.tar.bz2
$cd
linux-2.6.38
配置内核:
$make
menuconfig
备注:进入配置界面后,直接退出,选择保存新的配置文件。目的是使用生成的配置文件.config。
示意图如下:
生成内核压缩镜像:
$make
bzImage
编译模块并安装模块:
$make
modules
$sudo make modules_install
备注:这一步需要把编译好的模块安装在/lib/modules/2.6.38目录下,所以需要用sudo获取root权限。由于在我的系统中已经在/etc/suders文件中为tom授予了root权限,所有用sudo命令可以暂时获取root权限。示意图如下:
安装Linux内核到/boot目录
$sudo make
install
备注:这一步需要把编译产生的内核安装在/boot/目录下,所以也需要暂时获取管理员root权限。示意图如下:
通过观察上图,再和Debian默认的2.6.32-5-686版本的内核相比较,我们可以看出如果想让Linux-2.6.38内核顺利替换Debian默认内核,还需要一个initrd.img-2.6.38文件。我们用下面的命令生成initrd.img-2.6.38
$sudo
/usr/sbin/update-initramfs –c –k 2.6.38
示意图如下:
更新Debian Grub启动配置文件grub.cfg:
$sudo
/usr/sbin/update-grub
示意图如下:
理论上到目前为止,Linux-2.6.38内核已经运行了,事实也正是如下,示意图如下:
备注:但是原来的Linux-2.6.32-6却无法启动,症状:grub启动显示到“loading
ramdisk…”就卡住了。经过测试发现Debian-6.07默认的Linux-2.6.32-6内核不支持:
“load_video
set_gfxpagload=keep”
属性,因此在grup-update生成的grub.cfg配置文件中,要将Linux-2.6.32-6对应的启动项的上述两行注掉,示意图如下。而对我们编译生成的Linux-2.6.38版本的内核则不存在这样的问题。
至此,Debian编译安装新内核的过程就介绍完了。Debian-6.07和其早期版本最大的不同是使用了grub-1.98版本作为系统的引导工具,这个版本的grub的一个亮点是可以使用/usr/sbin/update-grub
自动捕捉编译生成的操作系统内核和initramfs,自动生成/boot/grub/grub.cfg文件,这是传统的GRUB所做不到的。
第二部分 串口管理Debian Linux系统
2.1 将Linux kernal输出信息重定向串口
修改/boot/grub/grub.cfg的"linux
/boot/vmlinuz-2.6.38"行,在该行后添加:
console=ttyS0,
115200n8 console=tty0
kernel会将输出信息同时输出到串口和终端. 我的/boot/grub/grub.cfg文件修改过记录如下:
menuentry
'GNU/Linux, with Linux 2.6.38' --class gnu-linux --class gnu
--class os {
#
load_video
# set
gfxpayload=keep
insmod
gzio
insmod
part_msdos
insmod
ext2
set
root='(hd0,msdos1)'
search
--no-floppy --fs-uuid --set=root
96fc63dc-caf6-453d-a94e-60c1dc9741bf
echo 'Loading
Linux 2.6.38 ...'
linux
/boot/vmlinuz-2.6.38 root=UUID=96fc63dc-caf6-453d-a94e-60c1dc9741bf
roconsole=ttyS0, 9600n8 console=tty0
echo 'Loading
initial ramdisk ...'
initrd
/boot/initrd.img-2.6.38
}
在上面的例子中, 服务启动的信息会显示在终端上(tty0), 如果进入单用户模式,
也只会在终端(tty0)上提示输入tom密码, 如果需要将服务启动的信息也输出到串口上, 可修改两个console参数的顺序,
既修改为
console=tty0
console=ttyS0,9600n8
2.2 允许从串口登陆Linux系统
修改/etc/inittab文件,增加如下内容
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
示意图如下:
2.3 允许Debian/Linux用户通过串口登陆
通过阅读/etc/securetty配置文件,我们发现:
Debian-6.07允许用户通过串口0,1,2,3,4,5操作Linux系统,示意图如下:
至此,我们就可以通过串口终端操作Linux系统了。
参考资料: