linux裁减内核,裁减linux内核

工作目标:制作一个小的linux系统,使之体积尽可能地少,功能尽可能地简化,以在其上能够运行一个RedHat Linux下编译的可执行程序为限。

工作结果:制成一个U盘上的linux小系统,总共大小为30M左右。能够从U盘引导,完全脱离硬盘运行,提供全部的linux内核功能,以字符界面方式提供RedHat Linux常用功能包括帐户、文件管理和网络等常用服务等功能,并且可以扩展。

工作环境:PC机一台,U盘(至少64M为宜),网络

RedHat Linux 9.0(可以使用vmware虚拟)

工作流程:

每一阶段:配置和编译内核

第二阶段:移植内核到U盘上

第三阶段:裁减文件系统

一、配置和编译内核。

(1)准备linux内核源码,放于目录/usr/src下。这里使用的版本是:linux-2.4.20

(2)配置内核:在源码所在的目录下,使用命令make menuconfig对内核进行配置。在图形界面下可以使用make xconfig命令开始这项工作。对内核的配置涉及到很多软硬件的选项,网上资料很多,这里不一一累述。但是这里因为工作目标是要做成U盘启动,所以应该增加对USB设备的支持,而且linux把USB存储器当成SCSI设备处理,所以也应增加SCSI支持。编译的时候,必须的功能应该选择y编译进内核,部分功能可以选择M表示以模块加载的形式提供支持。非必要的尽量不要选,以减小目标内核的体积。

配置内核完成后,在退出的时候选择“保存”配置结果。

(3)编译内核:首先需要用make dep命令生成所配置的内核选项中的依赖关系,不过在2.6.*的版本中这一步骤已经不需要显式地进行。如果此前曾在这个源码目录里面进行过内核编译的工作,可以用make clean清除上次编译的结果,以免造成影响。生成内核映象的命令是make bzImage.这一过程用时较长,具体时间取决于所配置的内核选项和计算机的处理速度。结束的时候,会告知生成的内核映象是./arch/i386/boot/bzImage文件,这就是这一阶段主要的成果了.除此以外,在当前目录下会生成一个System.map的文件,这是内核中的符号表。

(4)生成模块。一般我们都会把或多或少的内核功能配置为模块支持。所以我们需要用命令make modules生成这些模块。接下来用make modules_install把模块拷贝到指定的目录,也就是/lib/modules/目录下以所编译的内核版本号为文件夹名为目录名的文件里。这里的目录是/lib/modules/2.4.20.如果编译的目标内核版本号与当前系统的版本号相同,最好先对同一目录的文件进行备份。

(5)生成initrd文件。RedHat Linux使用了一种称之为initrd的工作方式来阶段化系统的初始化过程。使用mkinitrd initrd-2.4.20.img 2.4.20来生成需要的initrd文件。该命令中中间的参数是生成的文件名,结尾的参数是所用的版本号,也就是/lib/modules/下的那个目录文件名。

(6)测试内核。利用现行系统进行测试,看看我们构造的内核是否可用。把上面生成的bzImage、System.map、initrd-2.4.20.img都拷贝到/boot目录下,并在引导选项上增加相应的选项。如果是用grub作引导器,则只须在/boot/grub/grub.conf中增加以下几行即可。

title usb Linux (2.4.20)

root (hd0,0)

kernel /bzImage ro root=LABEL=/

initrd /initrd-2.4.20.img

第一行是显示在引导画面上的操作系统名字,第二行是引导盘的标记。第三行指明了内核映象文件和根文件系统所在的设备。最后一行是initrd的文件映象。一般情况下都把bzImage重命名为更有意义的新名字,这里没有进行这一处理,使用原始文件名。

重新启动系统,选择新内核进入系统。如果前面的工作没有错误,则会成功地以新内核启动整个系统(包括文件系统)。可以使用命令uname –r查看内核版本号,以验证当前运行的系统内核是否为我们编译的系统。

二、把内核移植到U盘上。

(1)修改initrd。从U盘引导的时候,需要在initrd里面增加对U盘存储的支持。U盘的初始化比内核执行得慢,所以需要对initrd做如下修改:

mv /boot/initrd-2.4.20.img /tmp/initrd.gz

cd /tmp

gunzip initrd.gz

mkdir /mnt/initrd

mount –o loop initrd /mnt/initrd

编辑/mnt/initrd/linuxrc文件,加入以下内容

echo  \'wait 3 seconds.....\'/bin/sleep 3

通过睡眠三秒的方式等待U盘完成初始化了再继续执行。但是这个时候还没有sleep这个程序可用,所以需要另外将这个程序引入。这里采用busybox来实现。下载busybox源代码,编译生成静态的可执行文件busybox.拷贝到/mnt/initrd/bin/下面,并做如下链接:

ln -s /mnt/initrd/bin/busybox /mnt/initrd/bin/sleep

此外,因为计划使用ext2文件系统而不是ext3文件系统来实现文件系统,所以需要把下面这句mount -o defaults --ro -t ext3 /dev/root /sysroot修改成为mount -o defaults --ro -t ext2 /dev/root /sysroot。

修改完成之后,恢复initrd。

cd /tmp

umount initrd

gzip -9 initrd

(2)格式化U盘。使用工具fdisk格式化U盘,这里假设只将U盘分成一个区,即sda1,并且设置该分区为可引导的。

(3)将该分区做成ext2文件格式,并且添加标签/。所用命令为:

mke2fs –m 0 /dev/sda1

e2label /dev/sda1 /

(4)挂载该分区:mkdir /mnt/usb

mount /dev/sda1 /mnt/usb

(5)拷贝内核及相关文件到U盘。

在/mnt/usb目录下新建一目录boot,把bzImage、System.map和修改过的initrd文件都拷贝进去。

cp /boot/bzImage /mnt/usb/boot/

cp /boot/System.map /mnt/usb/boot/

cp /tmp/initrd.gz /mnt/usb/boot/initrd.img

新建目录/mnt/usb/lib/modules,把/lib/modules/2.4.20整个文件夹都拷贝进去。

(6)安装grub.为了从U盘上引导操作系统,需要在该盘分区上安装grub。

先拷贝必要的文件。在/mnt/usb/boot目录下面,建目录grub,并把系统/boot/grub下的文件拷贝过去,最少需要五个文件:

grub.confmenu.lstsplash.xpm.gzstage1stage2

其中grub.conf是grub引导时的配置文件,需要进行修改。这里只列出修改部分:

default=0

timeout=3

splashimage=(hd0,0)/boot/grub/splash.xpm.gz

title usbLinux (2.4.20)

root (hd0,0)

kernel /boot/bzImage ro root=LABEL=/

initrd /boot/initrd.img

下面正式安装grub.

cd

umount /dev/sda1

grub

>>root (hd1,0)

>>setup (hd1)

>>quit

如果前面的工作都正确,grub的安装会成功完成。

(7)测试。重启计算机,设置为可从USB设备引导,插入已经制作好的USB盘,系统可以引导到内核完成,然后死机。三裁减文件系统

一个完整的RedHat Linux由内核部分和根文件系统组成,内核部分只提供操作系统所提供的软硬件管理的功能,根文件系统则来实现用户需要的功能。一个完整的根文件系统最少应包括如下文件夹:

bindevlibroottmpvar

bootetcinitrdlost+foundprocsbinusr

可以从无到有地手工制作每个需要的文件,也可以从现有系统中直接拷贝再进行修改。前一工作过于繁复,所以这里采用后一种方法。

为了制作一个完整的根文件系统,将环境恢复到原来的宿主系统,并且把U盘再次挂载到/mnt/usb下。以下依次说明根文件系统根目录下(也即/mnt/usb/)下要创建的文件夹。

(1)bin和sbin:这两个文件夹下都是可执行程序,拷贝现有的可执行文件即可,但是不必都拷贝,否则我们的空间吃不消,而且也没有这个必要。选择哪些取决于系统默认启动哪些服务以及你希望给你的系统提供哪些功能。因为我们打算在目标系统上运行一个在完整的RedHat Linux下的程序,所以使用了比较多的功能。

(2)dev:这个文件夹下是设备文件,可以从系统中拷贝过来,使用参数-dpRa.

consolehda2initrdptsram2sdasda3sdb2tty0tty3

hdahda3nullram0ram3sda1sdbsdb3tty1urandom

hda1initctlptmxram1rawsda2sdb1ttytty2zero

(3)etc:这个文件夹下是系统的配置文件,包括系统初始化时的配置和很多服务的配置。为了避免出错,可以把系统中的原文件都拷贝过来。有些文件需要修改:

fstab:

LABEL=//ext2defaults1 1

none/dev/ptsdevptsgid=5,mode=6200 0

none/procprocdefaults0 0

如果我们的系统以运行级别3运行(这是绝大多数情况),会运行rc.d/rc3.d/下面的每个脚本文件,其中每个代表一种服务。如果需要关闭某些服务,只须要在这里删除相应的文件即可。不用担心会对系统造成损害,因为这里只是一些链接文件,删除这些链接并不会对系统的完整性造成影响。值得注意的是,这里的每个服务都是用bash脚本实现的,需要用到可执行程序,也就是/bin,/sbin/,/usr/bin,/usr/sbin下的可执行程序。如果这里选取了某种服务,却没有把它所依赖的可执行程序载入,运行时就会出错。

此外,由于这个文件夹下的passwd、shadow、gshadow、gpasswd等文件管理着系统的帐户和组策略,拷贝后的目标系统会拥有和原系统同样的帐户和密码,以及完全一样的组配置。

(4)lib:这一文件夹下包括支持的模块(第二个阶段中已经完成)和运行程序依赖的动态链接库文件。使用ldd查看每个可执行程序依赖的库,从原系统中拷入即可。

(5)proc:这个文件夹用于存放系统运行时的内核信息,便于用户查看系统运行时信息,不需要添加任何文件。

(6)root:这个文件夹是超级用户登录时的默认根文件夹。只需要把原系统中的几个隐藏配置文件载入即可。

(7)usr:这里需要的文件也依赖于所选取的服务。

(8)var:这里使用了七个文件夹,有些是空的,但是必须。

emptyliblocklogrunspooltmp

empty:有文件夹sshd,为空。

lib:random-seed

lock:有文件夹subsys,为空

log:boot.logdmesg lastlogmessagessecurevboxcron maillogspoolerwtmp

spool:cron(空文件夹)

tmp:空文件夹

PS:时间仓促,只写了最重要的几点大概,等有时间了再写个详细点的教程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核裁减是指对Linux操作系统内核进行精简,去除一些不必要的组件和功能,以适应特定的应用场景和硬件环境。这样可以减小内核的体积,提高系统的启动速度和运行效率。 内核裁减通常从以下几个方面进行: 1. 移除不必要的驱动程序:Linux内核默认加载了许多硬件设备的驱动程序,但对于某些特定场景而言,可能只需要支持其中的一部分设备,因此可以移除其他不需要的驱动程序,从而减小内核体积。 2. 去除不必要的功能模块Linux内核中有许多功能模块是可选的,可以根据具体需求选择性地编译进内核或以模块的方式加载。通过去除一些对于特定场景不必要的功能模块,可以进一步缩小内核的体积。 3. 精简内核配置:Linux内核的配置文件(.config)中可以设置各种参数,通过仔细地配置这些参数,如关闭一些调试选项、去除冗余功能等,可以使内核更加精简高效。 4. 优化代码:通过对内核源代码的优化,如去除冗余代码、简化数据结构等,可以进一步减小内核的体积。 内核裁减的好处有: 1. 提升系统性能:精简的内核启动更快、运行更高效,可以提升系统的整体性能表现。 2. 减小内存占用:去除不必要的组件和功能可以减少内核占用的内存空间,从而释放更多的内存资源给其他应用程序使用。 3. 提高安全性:精简内核意味着减少潜在的漏洞和攻击面,提高系统的安全性。 4. 适应特定场景:通过裁减内核,可以针对特定的应用场景和硬件环境进行优化,提高系统的定制化能力和适应性。 然而,内核裁减也存在一些潜在的风险和难点,如可能影响系统兼容性、配置错误可能导致系统不稳定等。因此,在进行内核裁减时,需要谨慎评估并遵循相应的裁减指南和最佳实践,以确保系统的稳定和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值