Build your own linux system by yourself

Build Your Own Linux System By Yourself
Jimsu,shanghai,10/14/2005

1,#cd /usr/src/linux-2.4;
2,#make mrproper;
3,#make menuconfig;
4,修改Makefile中的版本信息;
5,#make dep;
6,#make clean;
7,#make bzImage;
8,#make modules;
9,#make modules_install;
10,#make install;

分步解释各个命令含义和作用:
make menuconfig:配置内核。
make dep:编译相关的文件。
make clean:清除上次编译的目标文件。
make bzImage:编译一个压缩的内核,开始编译。
make modules:编译modules。
make modules_install:将modules等拷贝到/lib/modules下面。
make install:将bzImage,initrd等拷贝到/boot下,并更新lilo、grub。
不过,完成之后还必须将/etc/lilo.conf或者/etc/grub.conf中的root=/修改成对应的物理磁盘位置,比如:root=/dev/sda2 或者root=/dev/ram

vmware下的Scsi磁盘是BusLogic的,不过,建议编译成module,不然容易和/etc/modules.conf中的冲突。
vmware里面的设备基本上都是虚拟设备,网卡用的是AMD PCNET32网卡。
lib/modules/2.4.21/build/drivers/net,里面的pcnet32.c便是。
生成/lib/moduels/2.4.xxxx/下的驱动,modules和modules.dep文件。
当然modules.dep文件也可以执行#depmod 2.4.xx

当前kernel的编译config文件:一般位于/boot下,比如/boot/config-2.4.xxxxx;,我们使用make bzImage的时候都是使用的当前配置文件,比如:/usr/src/linux-2.4xx/.config

redhat主要组件:
kernel: vmlinuz-2.4.x.img.gz
root_fs:initrd-2.4.x.img.gz

linux启动步骤:
...;
bootloader;
kernel;
initrd.img->init进程->run /linuxrc script->mount real root device;
root_fs: maybe in real disk device or RAMDisk;
/etc/inittab->rc.S->fork mingetty;
login(PAM);
bash shell;
...;

root fs与root device:
root fs是最终运行程序的起点.
root device是只最终运行的root fs所在的设备,比如是/dev/ram,或者/dev/sda2,甚至是通过tftp,nfs等网络启动设备。

loadbooter: lilo与grub
linux常用的就是lilo和grub,在服务器平台和嵌入式平台上还有类似的miniboot,uboot,ppcboot等。
Firmware:服务器一般都有自己的firmware来加强服务器的安全功能,比如监视系统硬件故障,维护RAID磁盘阵列等。
lilo用在早期的linux发行版本中,一般使用/etc/lilo.conf来配置,然后执行#lilo即可让当前的配置生效。
grub使用/etc/grub.conf文件,执行#grub-install /dev/sda命令让当前设置生效,当然也可以直接用grub的命令来设置grub.


RAMDisk制作:
ramdisk是将磁盘中常使用的一些文件放在内存中,这样可以提高系统运行的性能,不过如果你系统的物理内存不是很多就不要考虑了;
这里假设制作一个initrd的RAMDISK镜像文件,过程如下:
#dd if=/dev/zero of=/tmp/myram bs=1k count=16000
#mke2fs /tmp/myram
#mount -o loop  /tmp/myram /mnt
#cd /mnt;
然后进行制作initrd.img RAMDISK的内容,制作结束后#cd /;
#sync
#umount /mnt
#cd /tmp/myram
#gzip -9 /tmp/myram ####生成myram.gz文件
#cp /tmp/myram.gz /boot/initrd-2.4.x-y.img
#修改/etc/lilo.conf
#lilo
#reboot

initrd.img.gz介绍:
这是linux init初始化的镜像文件。你可以通过#gzip -d initrd.img.gz; mount -o loop initrd.img mnt来查看到底里面有哪些文件。
里面的文件内容与你要作什么有关系,我们可以进行定制。
linuxrc:这个是最先被执行的脚本,一般驱动可在此加载。
/initrd
/etc/
/lib/
/bin,/sbin
/dev
举个/linuxrc的例子:
#!/bin/ash
/bin/mount -t proc /proc /proc
/bin/insmod /lib/ext3.o
/bin/insmod /lib/scsi_mod.o
/bin/echo 0x0100 > /proc/sys/kernel/real-root-dev  ##不改变root fs,如果是磁盘上的root fs,则还需要修改root fs位置,继续执行#/bin/pivot_root / /initrd;

终端说明:
虚拟控制台:6 tty
串口console:

shell说明:
bash,ash,csh

重要文件说明:
/etc/modules.conf
/etc/lilo.conf
/etc/grub.conf
/etc/issue;
/etc/pam.d/...
/etc/rc.S
/etc/inittab
/etc/fstab
/etc/passwd,shadow
/etc/termcap(vi需要的)

troubleshooting:
can’t mount root fs:
insmod failed:
PAM:

如何跳过login过程:
在嵌入式系统中,有时候需要跳过登录过程,只要在/etc/inittab里面直接调用bash,而不去启动虚拟终端程序mingetty和login即可。(不过这样是不太友好!!!!)
/etc/inittab做如下修改:
id:3:initdefault:
si::sysinit:/etc/rc.S
1:2345:respawn:/bin/bash  #直接启动shell,tty1是第一个虚拟终端;
###格式:终端id:运行等级:动作:命令及其参数###

----------------------------------------
对于2.4.x升级到2.6.x,则麻烦一些。
2.6的内核比2.4要强大,这是不争的事实。在make menuconfig时可选中如下项:
处理器:建议使用Intel xeon,关于"Processor type and features"选项, 选上"Preemptible Kernel"选项, 这是2.6.x抢占式内核优于2.4.x内核的重要原因之一。
网卡:建议使用intel e1000,选中NAPI。
建议给2.6打上RTIRQ补丁,对设备性能有所提升。

升级2.6内核,你必须将ext3编译到内核,而不能是module,而且grub/lilo中的root=lable=/也必须修改成真实的设备。

在编译之前,必须下载module-init-tools,因为2.6与2.4的modules处理方式不一样,2.6中所有驱动都是.ko。
如果不安装module-init-tools,在升级2.6内核,make modules_install时会提示depmod不对,必须先安装module-init-tools,建议安装module-init-tools-3.1-0.pre5.3.i386.rpm,不过一定要注意备份原来modutils,必须也下载一个modutils的rpm包,我的系统是redhat EL3,其对应的modutils是modutils-2.4.25-9.EL,这可以通过rpm -qa|grep modutils看到当前2.4.x下安装的modutils版本到底是多少。
#rpm -e --nodeps modutils
#rpm -ivh module-init-tools
如果下次要使用2.4,则必须在2.6下面删除module-init-tools重新安装modutils-2.4.25。

在make install时,有可能出现:
"all of your loopback devices in use"
则需要加载loop.o模块,执行:
#insmod /lib/modules/old-kernel-version/fs/blocks/loop.o
old-kernel-version是指当前运行的kernel版本,如果是在2.4下面编译的,则表示是2.4.x。

关于:SOCKET filter option
有人提到2.4里面有"CONFIG_FILTER"而2.6.x里面没有"CONFIG_FILTER",其实2.6.X内核里面此项设置默认就是=yes的。

从2.4升级到2.6后,原来的2.4可能就启动不来了(我的服务器启不来),但是我在vmware倒是启来了。
启动后的/boot/System.map会自动链接到对应内核版本的System.map。

*********举例**********************

------------------/linuxrc--------------------
#!/bin/ash
/bin/mount -t proc /proc /proc
/bin/echo 0x0100 > /proc/sys/kernel/real-root-dev

-----------------etc/rc.S---------------------
#!/bin/bash
/bin/mount -a
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.0.211

-----------------etc/inittab--------------------
id:3:initdefault:
si::sysinit:/etc/rc.S
1:2345:respawn:/bin/bash 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值