1、前言linux

   linux操做系统至1991.10.5号诞生以来,就源其开源性和自由性获得了不少技术大牛的青睐,每一个linux爱好者都为其贡献了本身的一份力,不论是在linux内核仍是开源软件等方面,都为咱们后来人提供了一个良好的学习和研究环境。作为一个linuxer,感谢各位前辈们为咱们提供一个自由的空间,让咱们也可以在学习的同时去研究linux。vim

   本文主要经过裁剪现有linux系统,打造一个属于本身的linux小系统,让其可以装载网卡驱动,并配置IP地址,实现网络功能。bash

2、原理网络

 启动流程介绍
less

   制做linux小系统以前,咱们有必要再了解一下linux的启动流程:
ide

   一、首先linux要经过POST自检,检查硬件设备有没有故障
模块化

   二、若是有多块启动盘的话,须要在BIOS中选择启动磁盘
工具

   三、启动MBR中的bootloader引导程序
学习

   四、加载内核文件
测试

   五、执行全部进程的父进程、老祖宗init

   六、打印欢迎界面

   在linux的启动流程中,加载内核文件时还须要借助别外两个文件:

   1)initrd,是CentOS5上用内存模拟的磁盘设备

   2)initramfs,是CentOS6上用内存模拟的文件系统

   在启程的流程中,init主要是用来作哪些操做的呢?

   init经过调用/etc/inittab这个配置文件,而后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本

启发

   到linux打印欢迎界面后,就说明系统已经启动成功,若是咱们要制做一个linux小系统,咱们只须要把它在开机流程中用到的各文件都装载到一块儿,就能够点亮属于咱们本身的系统了,而linux是一个模块化的操做系统,好多功能组件都是经过模块化的工具来实现的,并且支持动态装载和卸载,咱们要是想实现某种功能,只需加载相应的模块便可,就能够实现咱们的linux操做系统大瘦身了。

3、操做步骤

一、目标磁盘分区

   在宿主机上挂一块新磁盘,命名为soft-linux,此块磁盘是宿主机上的第二块磁盘,因此这里是/dev/sdb,而到时候挂载到目标主机的时候,由于那里只有这一块磁盘,因此在目标主机上的名称应该是/dev/sda,这个不能搞混了。首先,咱们要在目标磁盘上分两个区,并进行格式化。第一个分区500M,用来装引导程序;第二个分区10G,用来装根文件系统。而后再进行挂载操做,将/dev/sdb1挂载到/mnt/boot下,将/dev/sdb2挂载到/mnt/sysroot下。

wKiom1MW2r3h9Ac-AABTTYsC2gk251.png

[root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot
mount: mount point /mnt/boot does not exist
[root@nmshuishui ~]# mkdir -p /mnt/boot /mnt/sysroot
[root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot
[root@nmshuishui ~]# mount /dev/sdb2 /mnt/sysroot/
[root@nmshuishui ~]#

二、安装grub至目标磁盘

   一个系统能启动,就须要引导,因此咱们首先要安装一个grub引导程序到咱们的新磁盘上,安装grub引导程序主要有两个命令,一个是grub-install,另外一个是setup,这里最好使用grub-install来安装。由于:

   ①grub-install会安装grub引导第二阶段的文件

   ②setup不会安装第二阶段的引导程序,是安装引导信息到MBR

   第二个须要注意的地方就是--root-directory=后面接的路径应该是boot目录所在的地方,而不是/mnt/boot,由于boot目录在mnt下;目标磁盘是/dev/sdb

[root@nmshuishui ~]# grub-install --root-directory=/mnt /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0)   /dev/fd0
(hd0)   /dev/sda
(hd1)   /dev/sdb
[root@nmshuishui ~]# cd /mnt/boot/
[root@nmshuishui boot]# ls
grub  lost+found
[root@nmshuishui boot]# cd grub/
[root@nmshuishui grub]# ls
device.map  e2fs_stage1_5  fat_stage1_5  ffs_stage1_5  iso9660_stage1_5  jfs_stage1_5  minix_stage1_5  reiserfs_stage1_5  stage1  stage2  ufs2_stage1_5  vstafs_stage1_5  xfs_stage1_5
[root@nmshuishui grub]#

   安装完grub后,进入grub目录,会发现没有grub.conf配置文件,这样就致使咱们的引导程序是不健全的,因此咱们须要手动写一个配置文件在里边,不过这得须要知道内核的版本,等移植完内核版本,再回过头来补充此步。

三、复制内核文件和initrd文件

   init是系统中用来产生其它全部进程的程序。它以守护进程的方式存在,其进程号为1,init是全部进程的父进程,老祖宗,因此不移植是不行的。它经过调用/etc/inittab这个配置文件,而后再去执行/etc/rc.d/rc.sysinit的系统初始化脚本。

   将内核文件和initrd文件复制到/dev/sdb下的boot目录中。

[root@nmshuishui grub]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz-soft
[root@nmshuishui grub]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs-soft.img
[root@nmshuishui grub]#

四、建立目标主机根文件系统

   ①使用命令行展开建立文件系统

[root@nmshuishui sysroot]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
mkdir: created directory `/mnt/sysroot/etc'
mkdir: created directory `/mnt/sysroot/etc/rc.d'
mkdir: created directory `/mnt/sysroot/usr'
mkdir: created directory `/mnt/sysroot/var'
mkdir: created directory `/mnt/sysroot/proc'
mkdir: created directory `/mnt/sysroot/sys'
mkdir: created directory `/mnt/sysroot/dev'
mkdir: created directory `/mnt/sysroot/lib'
mkdir: created directory `/mnt/sysroot/lib64'
mkdir: created directory `/mnt/sysroot/bin'
mkdir: created directory `/mnt/sysroot/sbin'
mkdir: created directory `/mnt/sysroot/boot'
mkdir: created directory `/mnt/sysroot/srv'
mkdir: created directory `/mnt/sysroot/mnt'
mkdir: created directory `/mnt/sysroot/media'
mkdir: created directory `/mnt/sysroot/home'
mkdir: created directory `/mnt/sysroot/root'
[root@nmshuishui sysroot]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  proc  root  sbin  srv  sys  usr  var
[root@nmshuishui sysroot]#

 ②移植bash命令和其库文件到根文件系统

[root@nmshuishui mnt]# sh ~/scripts/cporder.sh
Enter a command: bash
Enter a command: shutdown
Enter a command: reboot
Enter a command: vim
Enter a command: touch
Enter a command: mkdir
Enter a command: rm
Enter a command: ls
Enter a command: cat
Enter a command: less
Enter a command: ifconfig
Enter a command: ip
Enter a command: route
Enter a command: quit
quit
[root@nmshuishui mnt]# sync
[root@nmshuishui mnt]# sync
[root@nmshuishui mnt]# ls
boot  sysroot
[root@nmshuishui mnt]# cd sysroot/
[root@nmshuishui sysroot]# ls
bin  lib64  sbin  usr
[root@nmshuishui sysroot]# cd bin/
[root@nmshuishui bin]# ls
bash  cat  ls  mkdir  rm  touch
[root@nmshuishui bin]# ln -sv bash sh
`sh' -> `bash'
[root@nmshuishui bin]# sync
[root@nmshuishui 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

五、为grub提供配置文件

   上面移植了内核和initrd文件,咱们就能够根据内核版本和initrd版原本编写grub.conf配置文件了

[root@nmshuishui grub]# vim grub.conf
default=0
timeout=5
title   nmshuishui   soft-linux
        root (hd0,0)
        kernel /vmlinuz-soft ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
        initrd /initramfs-soft.img
~

  quiet是静默安装,再也不显示安装时的一大堆信息。后面要把selinux关掉,并且init要使用/bin/bash,告诉内核不要再去找init程序了。若是不指定这一步,在启动过程当中就会报kernel panic(内核恐慌),觉得系统就它一个了,没有init进程,恐慌的不行。

六、启动测试

wKiom1MXCoyRcPGEAAAffbLO5Tw465.png


wKioL1MXCqiiMgMpAAAx801vyus733.png

七、特别提醒

   若是在vmvare上作此实验,在新建虚拟机建立新磁盘的时候,必定要选“Store virtual disk as a single file”,不然,也会出现内核恐慌kennel panic。

wKiom1MXDPCSJRKsAACBEVw0vmI001.png

4、装载模块,实现网络功能

一、查看宿主机的网卡模块信息

[root@nmshuishui net]# lsmod | grep e1000
e1000                 170646  0
[root@nmshuishui net]#

二、查看网卡的详细信息

[root@nmshuishui net]# modinfo e1000
filename:       /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
version:        7.3.21-k8-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <linux.nics@intel.com>
srcversion:     1D4F1E82BB99EA36D320B1B
alias:          pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias:          pci:v00008086d000010B5sv*sd*bc*sc*i*
alias:          pci:v00008086d00001099sv*sd*bc*sc*i*
alias:          pci:v00008086d0000108Asv*sd*bc*sc*i*
alias:          pci:v00008086d0000107Csv*sd*bc*sc*i*

 这里查询到了网卡模块的路径,把它复制到/dev/sdb的库文件下

[root@nmshuishui net]# mkdir -pv /mnt/sysroot/lib64/modules
mkdir: created directory `/mnt/sysroot/lib64/modules'
[root@nmshuishui net]# cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/modules/e1000.ko

三、init程序

   如今虽然是模块复制过去了,可是还不能用,并且如今也不知足咱们的流程须要,由于连最起码的init程序都没有,若是咱们想要这个init,有两个选择,第一,移植宿主系统的,可是格式会复杂一些;因此咱们仍是先本身动手写脚本吧,把脚本看成init来用,可以让小系统跑起来。init通常在sbin目录下,因此咱们要在/dev/sdb2这个分区上编写一个init脚本。

[root@nmshuishui ~]# cd /mnt/sysroot/sbin/
[root@nmshuishui sbin]# vim init
#!/bin/bash
#print Welcome info
echo -e "Welcome to \033[34m nmshuishui soft-linux\033[0m"
#mount wei wenjian system when the system is running.
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
#mount ethernet driver autl when the system is start.
insmod /lib64/modules/e1000.ko
[ $? -eq 0 ] && echo -e "Load e1000 module succeeded                    [\033[32m0K\033[0m]"
ifconfig lo 172.0.0.1/8
ifconfig eth0 172.16.251.235/16
#mount the /dev/sda2 to make it can be write and read.
mount -n -o remount,rw /dev/sda2 /
#run /bin/bash
/bin/bash

写完这个init脚本后,咱们要把咱们要给其一个执行权限,让其可以被执行;此脚本中还用到mount,insmod这些命令,因此要用上一个脚本把这些命令移植过去。最后还须要把/mnt/boot/grub/grub.conf中的init=/bin/bash换成init=/sbin/init,由于我如今要用这个init脚原本执行系统启动了,不再需让/bin/bash来替换了。

四、实现网络功能的linux小系统    

   上面的步骤完成后,就能够把/dev/sdb挂到另外一台主机上体验咱们的私人订制小系统了。

wKioL1MXMwjxhM_qAAA3e897C_o133.png


wKioL1MXMxagfH5AAAArVMaw4I0926.png