手动裁剪制作小linux系统

 

 

不要被题目所吓到,其实裁剪或者说手动做一个小的linux并没有想象中的那么难,那么高大上。{本文都是基于虚拟机实现的}

想要制作或者裁剪一个小的linux,你所需要的是清楚的知道linux的启动过程,以及启动后会去哪些路径执行哪些程序,知道这些就相当的好办了,linux启动需要什么,我们就给他什么,这样就可以启动了。那么下来就先来看看linux的启动流程和需要执行的程序。

linux启动和windows启动方面还有有些类似的。

首先是①开机自检(POST,power on self test),接下来就是②BIOS中读取用户的硬件的相关设定,其中最重要的就是设置启动次序(我们这里肯定是从磁盘启动了),接下来③读取MBR中的分区信息了,当系统读取了到了bootloader,然后硬件工作就交给了操作系统,操作系统④根据GRUB(之前是LILO)引导/boot目录下根据grub.conf的配置信息从而加载内核信息到物理内存中去,当然/boot中不仅有内核文件,还有系统驱动模块,当读取内核后读入系统驱动模块,当一切加载完成后,⑤下来进去用户空间中,进去用户空间中执行的第一个程序就是/sbin/init,这个配置文件里面有系统自动运行的程序,如果你需要让系统开机自动运行什么程序的话,你就可以将命令或者程序写入到这个配置文件中。⑥init进程首先读取/etc/inittab(运行级别的设置文件)当我们打开/etc/inittab文件后,忽略上面的注释,看到的第一行的内容如下所示:

id:表示操作的id。

3:表示运行级别为3.

default:表示设置默认运行级别,无需定义级别。

当然系统运行级别除了3,还有0,1,2,4,5,6总共7个运行级别。

0级别:表示关机。

1级别:单用户模式,直接以root用户登录

2级别:多用户模式。

3级别:完全多用户模式,文本模式

4级别:预留级别

5级别:完全多用户模式,图形模式

6级别:重启

每种模式下都对应了很多当下模式所启动的服务或者程序,他们都位于/etc/rc.d/下。

其中打开当前处于3级别中的文件,如下:有很多在相应运行级别中运行的程序。

  •  这个话题先说到这里,我们去手动制作linux。

如上所说,我们都是基于 VMware虚拟机完成的。

首先手动为linux额外挂载一个SCSI硬盘,如图:

接下来就是给这个硬盘分区。

创建两个分区。一个用来做/boot,一个用来做/sysroot

格式化分区:mke2fs -t  ext4 /dev/sdb1

                   mke2fs -t  ext4 /dev/sdb2

完成后,建立两个目录用来挂载两个分区

创建目录:mkdir -pv /mnt/{boot,sysroot} 

挂载分区:mount  /dev/sdb1 /mnt/boot

                mount  /dev/sdb2 /mnt/sysroot

挂载完成之后就要给小linux安装GRUB引导程序了,具体命令如下:

    grub-install --root-directory=/mnt /dev/sdb -->意味着把GRUB安装进我们的小linux(sdb中)

安装成功后,就要给我们配置文件对应的/boot分区中放置配置文件要加载的系统内核和设备驱动程序了。我们为了方便,直接基于本机,直接讲本机的系统内核和设备驱动程序放置过去。本机的系统内核和设备驱动程序也在/boot目录中放置,我们可以直接复制进我们的小linux。

如图,上面两个为本linux下的内核和设备驱动程序。

现在就来复制这两个进我们的小linux下的/boot中。我们在复制的过程中,为其改下名字,方便一会我们写grub.conf的配置文件。

上面为复制和改名命令,下来查看下结果:

下来就要为GRUB写配置文件了,好让GRUB去引导和加载他,不是吗?配置文件要写在/grub目录下,名字为grub.conf,下面就让我们去编辑它。

 这样,GRUB的配置基本结束了。下来就要对/sysroot目录进行了。

首先,要为其创建应有的目录。

大家已经知道系统第一个执行的是:init,我们自己做小linux,那我们直接让他开机运行shell程序。那既然要这样,那么我们就需要把bash拷进我们的bin中了

我们写一个脚本,用来复制这些命令和其依赖的文件到我们刚建立的目录中去,在次这个脚本也贴出来:

#!/bin/bash
#
target=/mnt/sysroot

clearCmd() {
  if which $cmd &> /dev/null; then
        cmdPath=`which --skip-alias $cmd`
  else
        echo "No such command"
        return 5
  fi
}

cmdCopy() {
        cmdDir=`dirname $1`
        [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
        [ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}

libCopy() {
        for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
                libDir=`dirname $lib`
                [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
                [ -f ${target}${lib} ] || cp $lib ${target}${libDir}
        done
}

while true; do
  read -p "Enter a command: " cmd
  if [ "$cmd" == ‘quit‘ ] ;then
        echo "quit"
        exit 0
  fi
  clearCmd $cmd
  [ $? -eq 5 ] && continue

  cmdCopy $cmdPath
  libCopy $cmdPath
done

这个是脚本内容,我给这个脚本起名为:copy.sh,一会运行这个脚本把自己想要用到的命令一并都加进去。

bash在启动的时候,不是直接启动bash的,也是启动bash的链接文件,所以我们需要为bash创建一个链接文件,所以我们要进入到/bin/bash中为其添加一个链接文件。

当然不能忘记给grub.conf一个执行权限,所以 chmod +x /mnt/boot/grub/grub.conf

这些做完,一个简陋的linux就可以启动了,当然不要忘记同步磁盘,为刚写入的那些东西通通写入到磁盘中,使用命令 sync

启动成功画面。。。。。。。。。。。。。。。

当然这样的不算完,或者他可以更加的优化一点。刚开始不是说init启动用户进程吗,我们刚直接让他运行的bash,那此刻,我们可以给他运行更多的东西,让这个小系统看起来更像那么一回事岂不是更好,我们可以给他也开机加载。查看客户机有那些加载文件。使用mount查看:如下:

那此刻,我们就可以自己写init文件来让系统开机自动加载了。

我们在给/sbin/init中写入开机自己运行的程序的时候,可以自定义添加一些信息,好让我们知道系统启动的过程。我们可以在init中加入一句话:the system is running。

具体看脚本文件:

 

然后给执行权限:chmod +x /mnt/sysroot/sbin/init

当然,还需要将/grub/grub.conf中的init=/bin/bash改成init=/sbin/init.

将改过的系统再开启来试试效果。

当然这样的情况下,算是已经完成了。不过我们还可以更加完善点,我们可以给他加入网卡驱动的话,那不是我们就可以远程来访问他了。哈哈,不妨来试一试。

首先,我们需要的是网卡驱动,当然还需要装载网卡的命令,还有查看硬件信息的命令。网卡驱动就有本机模拟的网卡。

复制网卡到小LINUX上。

复制安装网卡和查看网卡类的命令进小linux中:如。ifocnfig modprobe。

    使用insmod安装: insmod /lib/modules/e1000.ko

好了,到此结束,以后会完善一些更好的功能的,目前就先这样。

 

 

 

 

 

 

 

 

本文出自 “linux运维” 博客,请务必保留此出处http://xz159065974.blog.51cto.com/8618592/1376401

手动裁剪制作小linux系统,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。