知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

自己动手创建最精简的、最具特色linux

发布时间:2014-09-05 17:05:48作者:知识屋

 

  linux一大亮点就是开源,相对于Windows我们可以在linux上发挥更大的想象力,来亲手打造拥有自己特色的linux系统,首先我们从打造最基本的微型的linux系统入手,通过整个打造过程的体验,你就可以将自己的完整的linux系统进行个性化设置,然自己用的linux系统散发着自己的气息,让其更具亲合力!!

       下面我们就来直接操作,关于原理,会在每步中说明:

       一、准备阶段:

       硬件设施:一台宿主机、一个空磁盘(或者数据不再使用的磁盘,1G就足够了,如果想对自己制作的linux 进行不断的完善,那么就选用大点的光盘,文中我们将其视为sdb,根据自己实际情况进行相应的调整)。

           1、分区、格式化我们准备的磁盘

            将我们准备的新磁盘进行分区(如果是数据不用的磁盘,使用dd if=/dev/zero of=/dev/sdb bc=512 count=1 将其磁盘引导区的数据全部进行0覆盖,这样这块磁盘也就编程了空磁盘)。

           fdisk /dev/sdb  将其分为两个区sdb1 100M 、sdb2 500M,类型为都为linux ,保存,退出

           格式化分区:根据自己属主机的文件系统类型,进行格式化我的为ext3,所以我格式化时加了个-j,如果自己的是ext2就不需要加-j了

            mke2fs -j /dev/sdb1 mke2fs -j /dev/sdb2 都将其格式化为ext3格式

            2、挂载磁盘(挂载点自己选择,但是挂载sdb1的挂载点名字必须为boot)

            创建挂载点:mkdir  -pv  /mnt/{boot,myroot}

            mount /dev/sdb1 /mnt/boot   将sdb1挂载至/mnt/boot

            mount /dev/sdb2 /mnt/myroot 将sdb2挂载至/mnt/myroot

           (注:当我们挂载的这两个分区的时候也许会出现分区不存在的错误提示,主要原因为系统没能自动获取刚刚创建的分区的信息,也就是/proc/partitions文件中没有新建分区的信息,我们只需要输入命令:partproble /dev/sdb 重读分区信息,新建的分区信息将被写入/proc/parttions文件,这样就OK了)

      二、打造阶段:

            1、准备我们linux的心脏(内核)

             查看我们宿主机中/boot目录中的内容,会发现有类似vmlinuz-2.6.18-164.el5  vmlinuz-2.6.28.10这样带有版本号的文件,这就是系统的内核文件,我们选择一个内核文件,将其拷贝到我们小linux的/boot目录中,这样我们的linux就有心脏了。命令:cp /boot/vmlinuz-2.6.18-164.e15 /mnt/boot/vmlinuxz 将内核改名为vlinuxz。

            (注:将内核进行改名,不仅有利于我们接下来操作的操作还可以避免因为此处内核名字和grub.conf文件中内核名字的不符而引起kernel panic(内核恐慌)问题,导致我们的小linux无法启动,此外我曾遇到过在虚拟机里用手打出的内核名字和用Tab键写出的内核名字不符的现象,至今不知为何!所以我们尽可能的将我们小linux的内核文件名字写的简短一点)

          2、准备我们的linux的善意欺骗文件initrd文件。

             关于initrd文件的作用,我在有一篇名为《Linux开机流程简述》的文章中详细说明多,建议大家去看看,对我们的小linux管理和维修是有很大帮助的。

             同样查看宿主机的/boot目录内的内容,会发现有类似initrd-2.6.18-164.el5.img  initrd-2.6.28.10.img 这样以initrd开头中间是版本号,以img结尾的文件,那么这就是initrd文件了,每个版本的内核文件,就会有一个与之版本号相对应的initrd文件,将与我们刚才选择的内核版本号相对应的initrd文件拷贝到一个新建的目录内改造(此处我们在/tmp目录中创建一个名为test的目录)

              cp /boot/initrd-2.6.18-164.el5.img /tmp/test/  

               我们用查看这个文件的类型会发现它是一个用cpio打包,由gzip压缩的文件,我们将其展开在当前目录下。

              zcat initrd-2.6.18-164.el5.img | cpio -id

              展开之后我们会发现一个init的脚本文件,将其用vim打开,将以mkrootdev -t ext3 -o defaults,ro开头行ro

            后面的内容改成sda2,保存退出,即可(sda2为我们小linux系统单独运行时根文件系统所在的分区,在此我们告诉init进程,真正的根文件系统在sda2上面,让内核去进行根文件系统的加载,需要注意的是ro和sda2之间有一个空格)

            修改 完成之后,我问就该对其进行封装复原了(封装复原前最好先将此目录中的initrd-2.6.18-164.el5.img文件删除,使用命令:rm -rf initrd-2.6.18-164.el5.img),使用命令:

             find . | cpio -H newc -o | gzip -9 > /mnt/boot/initrd.gz

                   (注:find . 为当前目录的所有内容

                               cpio -H news -o 将目录下的所有内容进行cpio打包

                               gzip -9 打包之后进行gzip压缩,因为这个文件必须是压缩的格式

                               > /mnt/boot/initrd.gz 将打包压缩好的文件放在/mnt/boot目录下,并命名为initrd.gz,重命名同样是为了方便使用  )

            3、向我们小linux磁盘安装grub引导程序。(关于grub的作用在我刚刚提到的文章里有介绍,此处不再说明)

            安装命令为:grub-install --root-directory =/mnt /dev/sda

                                                                            ^此处为boot目录的父目录 

            进入/mnt/boot目录查看是否有一个新的目录grub,没有的话则为安装失败,重新安装,有的话直接进入该目录。

            使用vim创建文件grub.conf并写入如下内容(注:#后为我的注释内容,不要写入)

             default=0

             timeout=10  #此处是我们系统启动是菜单选择时间的设置,我们设置为10秒。

          title MY LINUX  #title是在开机操作系统选择菜单中我们小linux所显示的名字,可任意填写

          root (hd0,0)  #告诉grub我们小linux系统的内核、根文件系统,initrd文件的所在磁盘

          kernel /vmlinuz ro root=/dev/sda2 rhgb quiet  #告诉grub内核的名字及根文件系统所在的分区

                 initrd /initrd.gz  #告诉grub initrd文件的名字                                      

                 保存退出即可。

            4、为我们的小linux系统创建简单的根文件系统

             进入/etc/myroot目录使用命令创建如下目录:

                      mkdir -p {boot,proc,sys,dev,home,root,etc/{rc.d,sysconfig,init.d},bin,sbin,lib,usr/{bin,sbin,lib,include},var/{log,run},tmp,mnt,opt,media}

             基本命令移植,将借助宿主机有关命令的库文件,为我们的小linux移植必须的命令(各命令的移植方法相同,在此以命令bash为例)

             使用which bash 查看bash命令的位置,并将其拷贝到我们小linux的相应位置即可

             cp /bin/bash /mnt/myroot/bin/bash 

             由于系统在启动时不是读取bash命令本身,而是sh,所以我们为bash命令创建一个sh链接(只有这个命令需要链接)

             进入/mnt/myroot/bin目录

              创建链接  ln -sv bash sh 然后查看该目录将会看见sh

              查看并拷贝bash命令所依赖的库文件(没有库文件,命令只是个摆设)

              使用命令ldd /bin/bash 将显示bash所依赖的所有库文件,如

                           linux-gate.so.1 =>  (0x0061c000)

                           libtermcap.so.2 => /lib/libtermcap.so.2 (0x00c8f000)

                           libdl.so.2 => /lib/libdl.so.2 (0x00c60000)

                           libc.so.6 => /lib/libc.so.6 (0x00b18000)

                           /lib/ld-linux.so.2 (0x00af5000)

              第一个库文件不必拷贝,下面的库文件需一一拷贝进小linux对应的目录,例如第二个库文件的拷贝为:cp /lib/libtermcap.so.2  /mnt/myroot/lib/libtermcap.so.2

              每个命令的移植过程都是如此,此外init命令也是必须要的,其它命令可以自行选择。

              4、创建我们小linux的/etc/inittab、/etc/rc.d/rc.sysinit文件(关于这两个文件的作用在我刚刚提到的文章里有介绍,此处不再说明)

              在/etc目录下创建inittab文件,内容如下:(同样#之后为注释内容)                   

               id:3:initdefault:       #设定系统默认启动级别为3

               si::sysinit:/etc/rc.d/rc.sysinit  #让系统执行/etc/rc.d/rc.sysinit脚本

               保存退出

               在/etc/rc.d目录下创建脚本rc.sysinit ,内容如下                    

               bin/bash  #运行bash命令

              保存退出,并给予脚本执行权限chmod +x rc.sysinit

       至此,最精简linux已经在被我们打造出来,赶紧将含有我们劳动成果的磁盘放在其他的裸机上运行一下吧,千万要记住,心急吃不了热豆腐,在取下磁盘之前一定要给宿主机足够多的时间,将缓存中的数据卸载我们的小linux磁盘上,不然后果可想而知!

      这是个能进行最基本的运行的linux,所以大家有很大的空间对其进行不断的完善,希望大家一步步的让我们的小linux“长大”!

本文出自 “redhat” 博客

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜